Index: trunk/grails-app/controllers/ReportController.groovy
===================================================================
--- trunk/grails-app/controllers/ReportController.groovy	(revision 667)
+++ trunk/grails-app/controllers/ReportController.groovy	(revision 668)
@@ -196,3 +196,20 @@
     } // equipmentRegister
 
+    def inventoryValueGsp = {
+        render(view: 'inventoryValue')
+    }
+
+    def inventoryValue = {
+
+        params.reportTitle = "Inventory Value"
+        params.logoUrl = grailsApplication.mainContext.getResource('images/logo.png').getURL()
+        params.currentUser = authService.currentUser
+
+        def dataModel = inventoryReportService.getInventoryValue(params, RCU.getLocale(request))
+
+        // Jasper plugin controller expects data to be a Collection.
+        chain(controller:'jasper', action:'index', model:[data: [dataModel]], params:params)
+
+    }
+
 } // end of class.
Index: trunk/grails-app/i18n/messages.properties
===================================================================
--- trunk/grails-app/i18n/messages.properties	(revision 667)
+++ trunk/grails-app/i18n/messages.properties	(revision 668)
@@ -437,4 +437,5 @@
 report.error.no.inventory.items.found=Error: no inventory items found, please run report again.
 report.error.too.many.inventory.items=Error: over {0} inventory items, please run report again.
+report.error.multiple.currency.found=Error: multiple currency found.
 
 #
Index: trunk/grails-app/services/InventoryReportService.groovy
===================================================================
--- trunk/grails-app/services/InventoryReportService.groovy	(revision 667)
+++ 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
Index: trunk/grails-app/views/appCore/start.gsp
===================================================================
--- trunk/grails-app/views/appCore/start.gsp	(revision 667)
+++ trunk/grails-app/views/appCore/start.gsp	(revision 668)
@@ -196,4 +196,15 @@
                                     </tr>
 
+                                    <tr class="prop">
+                                        <td valign="top" class="name">
+                                            <label>Inventory:</label>
+                                        </td>
+                                        <td valign="top" class="value">
+                                                <g:link controller="report" action="inventoryValueGsp">
+                                                    Inventory Value
+                                                </g:link>
+                                        </td>
+                                    </tr>
+
                                 </tbody>
                             </table>
Index: trunk/grails-app/views/report/inventoryValue.gsp
===================================================================
--- trunk/grails-app/views/report/inventoryValue.gsp	(revision 668)
+++ trunk/grails-app/views/report/inventoryValue.gsp	(revision 668)
@@ -0,0 +1,80 @@
+<html>
+    <head>
+        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
+        <meta name="layout" content="main" />
+        <title>Inventory Value Report</title>
+        <nav:resources override="true"/>
+    </head>
+    <body>
+        <div class="nav">
+            <nav:renderSubItems group="nav"/>
+        </div>
+        <div class="body">
+            <h1>Inventory Value Report</h1>
+            <g:render template="/shared/messages" />
+            <div class="dialog">
+                <table>
+                    <tbody>
+
+                        <g:jasperForm controller="report"
+                                                    action="inventoryValue"
+                                                    jasper="inventoryValue"
+                                                    name="Inventory Value">
+
+                            <tr class="prop">
+                                <td valign="top" class="name">
+                                    <label>Site:</label>
+                                </td>
+                                <td valign="top" class="value">
+                                    <g:select optionKey="id"
+                                                        from="${Site.findAllByIsActive(true).sort { p1, p2 -> p1.name.compareToIgnoreCase(p2.name) }}"
+                                                        name="site.id">
+                                    </g:select>
+                                </td>
+                            </tr>
+
+                            <tr class="prop">
+                                <td valign="top" class="name">
+                                    <label>Inventory Type:</label>
+                                </td>
+                                <td valign="top" class="value">
+                                    <custom:checkBoxList name="inventoryTypes"
+                                                                            from="${InventoryType.findAllByIsActive(true)}"
+                                                                            optionKey="id"
+                                                                            sortBy="name"
+                                                                            linkController="inventoryTypeDetailed"
+                                                                            linkAction="show"/>
+                                </td>
+                            </tr>
+
+                            <tr class="prop">
+                                <td valign="top" class="name">
+                                    <label>Inventory Group:</label>
+                                </td>
+                                <td valign="top" class="value">
+                                    <custom:checkBoxList name="inventoryGroups"
+                                                                            from="${InventoryGroup.findAllByIsActive(true)}"
+                                                                            optionKey="id"
+                                                                            sortBy="name"
+                                                                            linkController="inventoryGroupDetailed"
+                                                                            linkAction="show"/>
+                                </td>
+                            </tr>
+
+                            <tr class="prop">
+                                <td valign="top" class="name">
+                                    <label>Report:</label>
+                                </td>
+                                <td valign="top" class="value">
+                                    <custom:jasperButtons formName="inventoryValue" format="PDF, XLS" text="PDF" />
+                                </td>
+                            </tr>
+
+                        </g:jasperForm>
+
+                    </tbody>
+                </table>
+            </div> <!--End dialog-->
+        </div> <!--End body-->
+    </body>
+</html>
