partkeepr

fork of partkeepr
git clone https://git.e1e0.net/partkeepr.git
Log | Files | Refs | Submodules | README | LICENSE

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:
Mfrontend/js/Components/Statistics/CurrentStatisticsDialog.js | 34++++++++++++++++++++++++++++------
Msrc/de/RaumZeitLabor/PartDB2/Part/Part.php | 13+++++++++++++
Msrc/de/RaumZeitLabor/PartDB2/Part/PartManager.php | 27++++++++++++++++++++++++++-
Msrc/de/RaumZeitLabor/PartDB2/Statistic/StatisticService.php | 4++++
Msrc/de/RaumZeitLabor/PartDB2/Stock/StockEntry.php | 29+++++++++++++++++++++++++++--
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