commit 0440f19e9d34e2ccb75a0497ba1c132f538f70f8
parent f88f062d60dfe9eab410eddf1f95f26547b26e78
Author: Timo A. Hummel <timo@netraver.de>
Date: Wed, 8 Jun 2011 21:22:31 +0200
Enhanced statistics (total value of parts, parts without price, parts with price, average part value)
Diffstat:
5 files changed, 98 insertions(+), 9 deletions(-)
diff --git a/frontend/js/Components/Statistics/CurrentStatisticsDialog.js b/frontend/js/Components/Statistics/CurrentStatisticsDialog.js
@@ -1,11 +1,12 @@
Ext.define('PartDB2.CurrentStatisticsDialog', {
extend: 'Ext.window.Window',
width: 400,
- height: 200,
+ height: 250,
title: i18n("Current Statistics"),
bodyStyle: {
padding: "5px"
},
+ layout: 'fit',
/**
* Initializes the component and adds a template
*/
@@ -17,8 +18,24 @@ Ext.define('PartDB2.CurrentStatisticsDialog', {
'<h1>'+i18n("Current Statistics")+'</h1>',
'<table>',
'<tr>',
- '<td style="width: 100px;" class="o">'+i18n("Different Parts")+':</td>',
- '<td style="width: 300px;" class="o">{partCount}</td>',
+ '<td style="width: 200px;" class="o">'+i18n("Different Parts")+':</td>',
+ '<td style="width: 200px;" class="o">{partCount}</td>',
+ '</tr>',
+ '<tr>',
+ '<td style="width: 200px;" class="e">'+i18n("Total Part Value")+':</td>',
+ '<td style="width: 200px;" class="e">{totalPrice}</td>',
+ '</tr>',
+ '<tr>',
+ '<td style="width: 200px;" class="o">'+i18n("Average Part Value")+':</td>',
+ '<td style="width: 200px;" class="o">{averagePrice}</td>',
+ '</tr>',
+ '<tr>',
+ '<td style="width: 200px;" class="e">'+i18n("Parts with price")+':</td>',
+ '<td style="width: 200px;" class="e">{partsWithPrice}</td>',
+ '</tr>',
+ '<tr>',
+ '<td style="width: 200px;" class="o">'+i18n("Parts without price")+':</td>',
+ '<td style="width: 200px;" class="o">{partsWithoutPrice}</td>',
'</tr>',
'<tr>',
'<td class="e">'+i18n("Categories")+':</td>',
@@ -29,8 +46,8 @@ Ext.define('PartDB2.CurrentStatisticsDialog', {
'<table>',
'<tpl for="units">',
'<tr>',
- '<td style="width: 100px;" class="{[xindex % 2 === 0 ? "e" : "o"]}">{name}</td>',
- '<td style="width: 300px;" class="{[xindex % 2 === 0 ? "e" : "o"]}">{stockLevel}</td>',
+ '<td style="width: 200px;" class="{[xindex % 2 === 0 ? "e" : "o"]}">{name}</td>',
+ '<td style="width: 200px;" class="{[xindex % 2 === 0 ? "e" : "o"]}">{stockLevel}</td>',
'</tr>',
'</tpl>',
'</table>');
@@ -52,6 +69,11 @@ Ext.define('PartDB2.CurrentStatisticsDialog', {
items: this.tbButtons
}];
+ this.view = Ext.create("Ext.panel.Panel", {
+ autoScroll: true
+ });
+
+ this.items = this.view;
this.callParent();
this.loadStats();
@@ -65,6 +87,6 @@ Ext.define('PartDB2.CurrentStatisticsDialog', {
call.doCall();
},
onStatsLoaded: function (data) {
- this.tpl.overwrite(this.getTargetEl(), data);
+ this.tpl.overwrite(this.view.getTargetEl(), data);
}
});
\ No newline at end of file
diff --git a/src/de/RaumZeitLabor/PartDB2/Part/Part.php b/src/de/RaumZeitLabor/PartDB2/Part/Part.php
@@ -57,6 +57,7 @@ class Part {
private $comment;
/**
+ * The stock level. Note that this is a cached value.
* @Column(type="integer")
*/
private $stockLevel = 0;
@@ -67,6 +68,14 @@ class Part {
private $minStockLevel;
/**
+ * The average price for the part. Note that this is a cached value.
+ *
+ * @Column(type="decimal",precision=5, scale=2,nullable=true)
+ * @var float
+ */
+ private $averagePrice = null;
+
+ /**
* @OneToMany(targetEntity="de\RaumZeitLabor\PartDB2\Stock\StockEntry",mappedBy="part",cascade={"persist", "remove"})
* Enter description here ...
* @var unknown_type
@@ -102,6 +111,10 @@ class Part {
return $this->partUnit;
}
+ public function setAveragePrice ($price) {
+ $this->averagePrice = $price;
+ }
+
public function updateStockLevel () {
$this->stockLevel = $this->getStockLevel();
}
diff --git a/src/de/RaumZeitLabor/PartDB2/Part/PartManager.php b/src/de/RaumZeitLabor/PartDB2/Part/PartManager.php
@@ -274,11 +274,36 @@ class PartManager extends Singleton {
/**
* Returns the overall part count currently existing.
+ * @param boolean $withPrice Only consider parts with a price
* @return int The amount of parts in the database
*/
- public function getPartCount () {
+ public function getPartCount ($withPrice = false) {
$dql = "SELECT COUNT(p.id) FROM de\RaumZeitLabor\PartDB2\Part\Part p";
+ if ($withPrice === true) {
+ $dql .= " WHERE p.averagePrice IS NOT NULL";
+ }
+
+ return PartDB2::getEM()->createQuery($dql)->getSingleScalarResult();
+ }
+
+ /**
+ * Returns the total price for all parts. Only parts with a price are calculated.
+ * @return float The total price
+ */
+ public function getTotalPrice () {
+ $dql = "SELECT SUM(p.averagePrice * p.stockLevel) FROM de\RaumZeitLabor\PartDB2\Part\Part p";
+
+ return PartDB2::getEM()->createQuery($dql)->getSingleScalarResult();
+ }
+
+ /**
+ * Returns the average price for all parts. Only parts with a price are calculated.
+ * @return float The average price
+ */
+ public function getAveragePrice () {
+ $dql = "SELECT AVG(p.averagePrice) FROM de\RaumZeitLabor\PartDB2\Part\Part p";
+
return PartDB2::getEM()->createQuery($dql)->getSingleScalarResult();
}
}
\ No newline at end of file
diff --git a/src/de/RaumZeitLabor/PartDB2/Statistic/StatisticService.php b/src/de/RaumZeitLabor/PartDB2/Statistic/StatisticService.php
@@ -14,6 +14,10 @@ class StatisticService extends Service {
$aData = array();
$aData["partCount"] = PartManager::getInstance()->getPartCount();
$aData["categoryCount"] = CategoryManager::getInstance()->getCategoryCount();
+ $aData["totalPrice"] = PartManager::getInstance()->getTotalPrice();
+ $aData["averagePrice"] = PartManager::getInstance()->getAveragePrice();
+ $aData["partsWithPrice"] = PartManager::getInstance()->getPartCount(true);
+ $aData["partsWithoutPrice"] = $aData["partCount"] - $aData["partsWithPrice"];
$result = PartUnitManager::getInstance()->getUnitCounts();
diff --git a/src/de/RaumZeitLabor/PartDB2/Stock/StockEntry.php b/src/de/RaumZeitLabor/PartDB2/Stock/StockEntry.php
@@ -116,12 +116,37 @@ class StockEntry {
}
/**
+ * Updates the stock leve for a part
* @PostPersist
*/
+ public function postPersist () {
+ $this->updateStockLevel();
+ $this->updatePrice();
+ }
+
+
public function updateStockLevel () {
- $query = PartDB2::getEM()->createQuery('UPDATE de\RaumZeitLabor\PartDB2\Part\Part p SET p.stockLevel = p.stockLevel + :val WHERE p = :part');
- $query->setParameter("val", $this->stockLevel);
+ $query = PartDB2::getEM()->createQuery("SELECT SUM(se.stockLevel) FROM de\RaumZeitLabor\PartDB2\Stock\StockEntry se WHERE se.part = :part");
+ $query->setParameter("part", $this->part);
+ $val = $query->getSingleScalarResult();
+
+ $query = PartDB2::getEM()->createQuery('UPDATE de\RaumZeitLabor\PartDB2\Part\Part p SET p.stockLevel = :val WHERE p = :part');
+ $query->setParameter("val", $val);
$query->setParameter("part", $this->part);
$query->execute();
}
+
+ /**
+ * Updates the average price for a part
+ */
+ public function updatePrice () {
+ $query = PartDB2::getEM()->createQuery("SELECT SUM(se.price*se.stockLevel) / SUM(se.stockLevel) FROM de\RaumZeitLabor\PartDB2\Stock\StockEntry se WHERE se.part = :part AND se.stockLevel > 0");
+ $query->setParameter("part", $this->part);
+ $val = $query->getSingleScalarResult();
+
+ $query = PartDB2::getEM()->createQuery('UPDATE de\RaumZeitLabor\PartDB2\Part\Part p SET p.averagePrice = :val WHERE p = :part');
+ $query->setParameter("val", $val);
+ $query->setParameter("part", $this->part);
+ $query->execute();
+ }
}
\ No newline at end of file