Index: trunk/grails-app/services/InventoryReportService.groovy
===================================================================
--- trunk/grails-app/services/InventoryReportService.groovy	(revision 665)
+++ trunk/grails-app/services/InventoryReportService.groovy	(revision 668)
@@ -1,2 +1,4 @@
+
+import net.kromhouts.HqlBuilder
 
 /**
@@ -164,3 +166,71 @@
     } // getStockTakeOverview()
 
+    /**
+    * Get the data for the inventory value.
+    * @param params The request params, may contain params to specify the search.
+    * @param locale The locale to use when generating result.message.
+    */
+    def getInventoryValue(params, locale) {
+        def result = [:]
+
+        result.inventoryItemList = []
+        result.inventoryItemCount = 0
+        result.inventoryItemTotalValue = new BigDecimal(0)
+        result.currency = null
+        result.errorMessage = null
+        result.summaryOfCalculationMethod = "This report does not convert between different currency.\n"
+        result.summaryOfCalculationMethod += "Therefore all item's are checked to ensure that currency is the same."
+
+        result.site = Site.get(params.site.id.toLong())
+        result.inventoryTypes = params.inventoryTypes.collect { InventoryType.get(it.toInteger()) }
+        result.inventoryGroups = params.inventoryGroups.collect { InventoryGroup.get(it.toInteger()) }
+
+        def fail = { Map m ->
+            result.error = [ code: m.code, args: m.args ]
+            result.errorMessage = g.message(result.error)
+            result.currency = null
+            result.inventoryItemTotalValue = new BigDecimal(0)
+            return result
+        }
+
+        def q = new HqlBuilder().query {
+            select 'distinct inventoryItem'
+            from 'InventoryItem as inventoryItem',
+                    'left join fetch inventoryItem.inventoryLocation as inventoryLocation',
+                    'left join fetch inventoryLocation.inventoryStore as inventoryStore',
+                    'left join fetch inventoryItem.unitOfMeasure as unitOfMeasure',
+                    'left join fetch inventoryItem.picture as picture',
+                    'left join fetch picture.images as Image'
+            where 'inventoryItem.isActive = true'
+                namedParams.siteId = result.site.id
+                and 'inventoryStore.site.id = :siteId'
+                if(result.inventoryTypes) {
+                    namedParams.inventoryTypeIds = result.inventoryTypes.collect {it.id}
+                    and 'inventoryItem.inventoryType.id in(:inventoryTypeIds)'
+                }
+                if(result.inventoryGroups) {
+                    namedParams.inventoryGroupIds = result.inventoryGroups.collect {it.id}
+                    and 'inventoryItem.inventoryGroup.id in(:inventoryGroupIds)'
+                }
+            order 'by inventoryItem.name asc'
+        }
+
+        result.inventoryItemList = InventoryItem.executeQuery(q.query, q.namedParams)
+        result.inventoryItemCount = result.inventoryItemList.size()
+        result.currency = result.inventoryItemList[0]?.estimatedUnitPriceCurrency
+
+        for(inventoryItem in result.inventoryItemList) {
+            // Check all currency is the same.
+            if(result.currency != inventoryItem.estimatedUnitPriceCurrency) {
+                fail(code:'report.error.multiple.currency.found') // No return, populate errors but continue report.
+                break
+            }
+            result.inventoryItemTotalValue += inventoryItem.estimatedUnitPriceAmount * inventoryItem.unitsInStock
+        } // for
+
+        // Success.
+        return result
+
+    } // getInventoryValueByGroupAndType()
+
 } // end class
