Index: trunk/grails-app/controllers/InventoryItemDetailedController.groovy
===================================================================
--- trunk/grails-app/controllers/InventoryItemDetailedController.groovy	(revision 404)
+++ trunk/grails-app/controllers/InventoryItemDetailedController.groovy	(revision 405)
@@ -126,50 +126,46 @@
             params.action='show'
 
-        if(!InventoryItem.exists(params.id)) {
-            flash.message = "InventoryItem not found with id ${params.id}"
+        def result = inventoryItemService.show(params)
+
+        if(!result.error) {
+
+            def model = [ inventoryItemInstance: result.inventoryItemInstance,
+                                    inventoryMovementList: result.inventoryMovementList,
+                                    inventoryMovementListTotal: result.inventoryMovementListTotal,
+                                    inventoryMovementListMax: result.inventoryMovementListMax,
+                                    showTab: result.showTab]
+
+            if(session.inventoryMovementTaskId) {
+                model.inventoryMovementInstance = new InventoryMovement()
+                model.inventoryMovementInstance.task = Task.get(session.inventoryMovementTaskId)
+                model.inventoryMovementInstance.quantity = 1
+            }
+
+            // Success.
+            return model
+        }
+
+        flash.errorMessage = g.message(code: result.error.code, args: result.error.args)
+        redirect(action:search)
+        return
+    }
+
+    def delete = {
+        def result = inventoryItemService.delete(params)
+
+        if(!result.error) {
+            flash.message = g.message(code: "default.delete.success", args: ["InventoryItem", params.id])
+            redirect(action:list)
+            return
+        }
+
+        flash.errorMessage = g.message(code: result.error.code, args: result.error.args)
+
+        if(result.error.code == "default.not.found") {
             redirect(action:search)
             return
         }
 
-        def result = inventoryItemService.prepareShowData(params)
-
-        if(result.error) {
-            flash.message = "Could not to prepare the data to show item with id: ${params.id}."
-            redirect(action:search)
-            return
-        }
-
-        def model = [ inventoryItemInstance: result.inventoryItemInstance,
-                                inventoryMovementList: result.inventoryMovementList,
-                                inventoryMovementListTotal: result.inventoryMovementListTotal,
-                                inventoryMovementListMax: result.inventoryMovementListMax,
-                                showTab: result.showTab]
-
-        if(session.inventoryMovementTaskId) {
-            model.inventoryMovementInstance = new InventoryMovement()
-            model.inventoryMovementInstance.task = Task.get(session.inventoryMovementTaskId)
-            model.inventoryMovementInstance.quantity = 1
-        }
-
-        return model
-    }
-
-    def delete = {
-        def inventoryItemInstance = InventoryItem.get( params.id )
-        if(inventoryItemInstance) {
-            try {
-                inventoryItemInstance.delete(flush:true)
-                flash.message = "InventoryItem ${params.id} deleted"
-                redirect(action:search)
-            }
-            catch(org.springframework.dao.DataIntegrityViolationException e) {
-                flash.message = "InventoryItem ${params.id} could not be deleted"
-                redirect(action:show,id:params.id)
-            }
-        }
-        else {
-            flash.message = "InventoryItem not found with id ${params.id}"
-            redirect(action:search)
-        }
+        redirect(action:show, id: params.id)
     }
 
@@ -180,57 +176,52 @@
             params.action='edit'
 
-        def inventoryItemInstance = InventoryItem.get( params.id )
-
-        if(!inventoryItemInstance) {
-            flash.message = "InventoryItem not found with id ${params.id}"
+        def result = inventoryItemService.edit(params)
+
+        if(!result.error)
+            return [ inventoryItemInstance : result.inventoryItemInstance ]
+
+        flash.errorMessage = g.message(code: result.error.code, args: result.error.args)
+        redirect(action:search)
+    }
+
+    def update = {
+        def result = inventoryItemService.update(params)
+
+        if(!result.error) {
+            flash.message = g.message(code: "default.update.success", args: ["InventoryItem", params.id])
+            redirect(action:show, id: params.id)
+            return
+        }
+
+        if(result.error.code == "default.not.found") {
+            flash.errorMessage = g.message(code: result.error.code, args: result.error.args)
             redirect(action:search)
-        }
-        else {
-            return [ inventoryItemInstance : inventoryItemInstance ]
-        }
-    }
-
-    def update = {
-        def inventoryItemInstance = InventoryItem.get( params.id )
-        if(inventoryItemInstance) {
-            if(params.version) {
-                def version = params.version.toLong()
-                if(inventoryItemInstance.version > version) {
-                    
-                    inventoryItemInstance.errors.rejectValue("version", "default.optimistic.locking.failure")
-                    render(view:'edit',model:[inventoryItemInstance:inventoryItemInstance])
-                    return
-                }
-            }
-            inventoryItemInstance.properties = params
-            if(!inventoryItemInstance.hasErrors() && inventoryItemInstance.save(flush: true)) {
-                flash.message = "InventoryItem ${params.id} updated"
-                redirect(action:show,id:inventoryItemInstance.id)
-            }
-            else {
-                render(view:'edit',model:[inventoryItemInstance:inventoryItemInstance])
-            }
-        }
-        else {
-            flash.message = "InventoryItem not found with id ${params.id}"
-            redirect(action:search)
-        }
+            return
+        }
+
+        render(view:'edit', model:[inventoryItemInstance: result.inventoryItemInstance.attach()])
     }
 
     def create = {
-        def inventoryItemInstance = new InventoryItem()
-        inventoryItemInstance.properties = params
-        return ['inventoryItemInstance':inventoryItemInstance]
+        def result = inventoryItemService.create(params)
+
+        if(!result.error)
+            return [inventoryItemInstance: result.inventoryItemInstance]
+
+        //flash.errorMessage = g.message(code: result.error.code, args: result.error.args)
+        redirect(action: search)
     }
 
     def save = {
-        def inventoryItemInstance = new InventoryItem(params)
-        if(!inventoryItemInstance.hasErrors() && inventoryItemInstance.save(flush: true)) {
-            flash.message = "InventoryItem ${inventoryItemInstance.id} created"
-            redirect(action:show,id:inventoryItemInstance.id)
-        }
-        else {
-            render(view:'create',model:[inventoryItemInstance:inventoryItemInstance])
-        }
+        def result = inventoryItemService.save(params)
+
+        if(!result.error) {
+            flash.message = g.message(code: "default.create.success", args: ["InventoryItem", result.inventoryItemInstance.id])
+            redirect(action:show, id: result.inventoryItemInstance.id)
+            return
+        }
+
+        //flash.errorMessage = g.message(code: result.error.code, args: result.error.args)
+        render(view:'create', model:[inventoryItemInstance: result.inventoryItemInstance])
     }
 
@@ -252,5 +243,5 @@
                 def p = [:]
                 p.id = result.inventoryMovementInstance.inventoryItem?.id
-                def r = inventoryItemService.prepareShowData(p)
+                def r = inventoryItemService.show(p)
 
                 def model = [ inventoryItemInstance: r.inventoryItemInstance,
Index: trunk/grails-app/domain/InventoryItem.groovy
===================================================================
--- trunk/grails-app/domain/InventoryItem.groovy	(revision 404)
+++ trunk/grails-app/domain/InventoryItem.groovy	(revision 405)
@@ -9,4 +9,6 @@
     String description = ""
     String manufacturersPartNumber
+    BigDecimal estimatedUnitPriceAmount
+    Currency estimatedUnitPriceCurrency
     String suppliersPartNumber
     Integer unitsInStock = 0
@@ -36,4 +38,6 @@
         unitsInStock(min:0)
         unitOfMeasure()
+        estimatedUnitPriceAmount(nullable:true, max: new BigDecimal(999999999999))
+        estimatedUnitPriceCurrency(nullable:true)
         reorderPoint()
         enableReorder()
Index: trunk/grails-app/i18n/messages.properties
===================================================================
--- trunk/grails-app/i18n/messages.properties	(revision 404)
+++ trunk/grails-app/i18n/messages.properties	(revision 405)
@@ -119,7 +119,4 @@
 task.associatedAssets=Associated Assets
 task.associatedAssets.help=These assets are to be associated with this task, but costs will not be assigned.
-
-
-inventoryItem.notFound=Could not complete operation, inventory item not found.
 
 inventoryMovement.quantity.insufficientItemsInStock=Could not complete operation, insufficient items in stock.
Index: trunk/grails-app/services/InventoryItemService.groovy
===================================================================
--- trunk/grails-app/services/InventoryItemService.groovy	(revision 404)
+++ trunk/grails-app/services/InventoryItemService.groovy	(revision 405)
@@ -11,15 +11,17 @@
     * @param params The incoming params as normally passed to the show view
     * primarily including the id of the inventoryItem.
-    * @returns A map containing result.error=true (if any error) and result.inventoryItemInstance (if available)
-    * and 
+    * @returns A map containing result.error, if any error, otherwise result.inventoryItemInstance.
     */
-    def prepareShowData(params) {
+    def show(params) {
         def result = [:]
-
-        def fail = { Object[] args ->
-            if(args.size() == 2) result.errors = [args[0], args[1]]
-            result.error = true
+        def fail = { Map m ->
+            result.error = [ code: m.code, args: ["InventoryItem", params.id] ]
             return result
         }
+
+        result.inventoryItemInstance = InventoryItem.get( params.id )
+
+        if(!result.inventoryItemInstance)
+            return fail(code:"default.not.found")
 
         result.showTab = [:]
@@ -35,9 +37,4 @@
         }
 
-        result.inventoryItemInstance = InventoryItem.get( params.id )
-
-        if(!result.inventoryItemInstance)
-            return fail("inventoryItem", "inventoryItem.notFound")
-
         def p = [:]
         p.max = result.inventoryMovementListMax = 10
@@ -47,8 +44,118 @@
         result.inventoryMovementListTotal = InventoryMovement.countByInventoryItem(result.inventoryItemInstance)
 
-        // Success
+        // Success.
         return result
 
-    } // end prepareShowData()
+    } // end show()
+
+    def delete(params) {
+        def result = [:]
+        def fail = { Map m ->
+            result.error = [ code: m.code, args: ["InventoryItem", params.id] ]
+            return result
+        }
+
+        result.inventoryItemInstance = InventoryItem.get(params.id)
+
+        if(!result.inventoryItemInstance)
+            return fail(code:"default.not.found")
+
+        try {
+            result.inventoryItemInstance.delete(flush:true)
+            return result //Success.
+        }
+        catch(org.springframework.dao.DataIntegrityViolationException e) {
+            return fail(code:"default.delete.failure")
+        }
+
+    }
+
+    def edit(params) {
+        def result = [:]
+        def fail = { Map m ->
+            result.error = [ code: m.code, args: ["InventoryItem", params.id] ]
+            return result
+        }
+
+        result.inventoryItemInstance = InventoryItem.get(params.id)
+
+        if(!result.inventoryItemInstance)
+            return fail(code:"default.not.found")
+
+        // Success.
+        return result
+    }
+
+    def update(params) {
+        InventoryItem.withTransaction { status ->
+            def result = [:]
+
+            def fail = { Map m ->
+                status.setRollbackOnly()
+                if(result.inventoryItemInstance && m.field)
+                    result.inventoryItemInstance.errors.rejectValue(m.field, m.code)
+                result.error = [ code: m.code, args: ["InventoryItem", params.id] ]
+                return result
+            }
+
+            result.inventoryItemInstance = InventoryItem.get(params.id)
+
+            if(!result.inventoryItemInstance)
+                return fail(code:"default.not.found")
+
+            // Optimistic locking check.
+            if(params.version) {
+                if(result.inventoryItemInstance.version > params.version.toLong())
+                    return fail(field:"version", code:"default.optimistic.locking.failure")
+            }
+
+            result.inventoryItemInstance.properties = params
+
+            if(result.inventoryItemInstance.hasErrors() || !result.inventoryItemInstance.save())
+                return fail(code:"default.update.failure")
+
+            // Success.
+            return result
+
+        } //end withTransaction
+    }  // end update()
+
+    def create(params) {
+        def result = [:]
+        def fail = { Map m ->
+            result.error = [ code: m.code, args: ["InventoryItem", params.id] ]
+            return result
+        }
+
+        result.inventoryItemInstance = new InventoryItem()
+        result.inventoryItemInstance.properties = params
+
+        // success
+        return result
+    }
+
+    def save(params) {
+        InventoryItem.withTransaction { status ->
+            def result = [:]
+
+            def fail = { Map m ->
+                status.setRollbackOnly()
+                if(result.inventoryItemInstance && m.field)
+                    result.inventoryItemInstance.errors.rejectValue(m.field, m.code)
+                result.error = [ code: m.code, args: ["InventoryItem", params.id] ]
+                return result
+            }
+
+            result.inventoryItemInstance = new InventoryItem(params)
+
+            if(result.inventoryItemInstance.hasErrors() || !result.inventoryItemInstance.save())
+                return fail(code:"default.create.failure")
+
+            // success
+            return result
+
+        } //end withTransaction
+    }
+
 
 } // end class
Index: trunk/grails-app/views/inventoryItemDetailed/create.gsp
===================================================================
--- trunk/grails-app/views/inventoryItemDetailed/create.gsp	(revision 404)
+++ trunk/grails-app/views/inventoryItemDetailed/create.gsp	(revision 405)
@@ -13,7 +13,5 @@
         </div>
         <div class="body">
-            <g:if test="${flash.message}">
-            <div class="message">${flash.message}</div>
-            </g:if>
+            <g:render template="/shared/messages" />
             <g:hasErrors bean="${inventoryItemInstance}">
             <div class="errors">
@@ -118,4 +116,17 @@
                             <tr class="prop">
                                 <td valign="top" class="name">
+                                    <label for="averageDeliveryTime">Estimated Unit Price:</label>
+                                </td>
+                                <td valign="top">
+                                    <input  class="medium ${hasErrors(bean:inventoryItemInstance,field:'estimatedUnitPriceAmount','errors')}"
+                                                    type="text" id="estimatedUnitPriceAmount" name="estimatedUnitPriceAmount"
+                                                    value="${fieldValue(bean:inventoryItemInstance,field:'estimatedUnitPriceAmount')}" />
+                                    <g:currencySelect name="estimatedUnitPriceCurrency"
+                                                                        value="${inventoryItemInstance.estimatedUnitPriceCurrency}" />
+                                </td>
+                            </tr>
+                        
+                            <tr class="prop">
+                                <td valign="top" class="name">
                                     <label for="suppliersPartNumber">Suppliers Part Number:</label>
                                 </td>
Index: trunk/grails-app/views/inventoryItemDetailed/edit.gsp
===================================================================
--- trunk/grails-app/views/inventoryItemDetailed/edit.gsp	(revision 404)
+++ trunk/grails-app/views/inventoryItemDetailed/edit.gsp	(revision 405)
@@ -14,7 +14,5 @@
         </div>
         <div class="body">
-            <g:if test="${flash.message}">
-            <div class="message">${flash.message}</div>
-            </g:if>
+            <g:render template="/shared/messages" />
             <g:hasErrors bean="${inventoryItemInstance}">
             <div class="errors">
@@ -152,4 +150,17 @@
                                                         noSelection="['null':'--None--']">
                                     </g:select>
+                                </td>
+                            </tr>
+                        
+                            <tr class="prop">
+                                <td valign="top" class="name">
+                                    <label for="averageDeliveryTime">Estimated Unit Price:</label>
+                                </td>
+                                <td valign="top">
+                                    <input  class="medium ${hasErrors(bean:inventoryItemInstance,field:'estimatedUnitPriceAmount','errors')}"
+                                                    type="text" id="estimatedUnitPriceAmount" name="estimatedUnitPriceAmount"
+                                                    value="${inventoryItemInstance.estimatedUnitPriceAmount}" />
+                                    <g:currencySelect name="estimatedUnitPriceCurrency"
+                                                                        value="${inventoryItemInstance.estimatedUnitPriceCurrency}" />
                                 </td>
                             </tr>
Index: trunk/grails-app/views/inventoryItemDetailed/search.gsp
===================================================================
--- trunk/grails-app/views/inventoryItemDetailed/search.gsp	(revision 404)
+++ trunk/grails-app/views/inventoryItemDetailed/search.gsp	(revision 405)
@@ -16,7 +16,5 @@
         </div>
         <div class="body">
-            <g:if test="${flash.message}">
-            <div class="message">${flash.message}</div>
-            </g:if>
+            <g:render template="/shared/messages" />
             <filterpane:currentCriteria domainBean="InventoryItem"
                                     action="search"
Index: trunk/grails-app/views/inventoryItemDetailed/show.gsp
===================================================================
--- trunk/grails-app/views/inventoryItemDetailed/show.gsp	(revision 404)
+++ trunk/grails-app/views/inventoryItemDetailed/show.gsp	(revision 405)
@@ -15,17 +15,15 @@
         </div>
         <div class="body">
+            <g:render template="/shared/messages" />
             <g:hasErrors bean="${inventoryMovementInstance}">
-            <div class="errors">
-                <g:renderErrors bean="${inventoryMovementInstance}" as="list" />
-            </div>
+                <div class="errors">
+                    <g:renderErrors bean="${inventoryMovementInstance}" as="list" />
+                </div>
             </g:hasErrors>
-            <g:if test="${flash.message}">
-                <div class="message">${flash.message}</div>
-            </g:if>
 
             <g:hasErrors bean="${inventoryItemInstance}">
-            <div class="errors">
-                <g:renderErrors bean="${inventoryItemInstance}" as="list" />
-            </div>
+                <div class="errors">
+                    <g:renderErrors bean="${inventoryItemInstance}" as="list" />
+                </div>
             </g:hasErrors>
 
@@ -223,4 +221,15 @@
                                         <td valign="top" class="name">Recommended Reorder Point:</td>
                                         <td valign="top" class="value">${fieldValue(bean:inventoryItemInstance, field:'recommendedReorderPoint')}</td>
+                                    </tr>
+
+                                    <tr class="prop">
+                                        <td valign="top" class="name">Estimated Unit Price:</td>
+
+                                        <td valign="top" class="value">
+                                            <g:if test="${inventoryItemInstance.estimatedUnitPriceAmount}">
+                                                ${inventoryItemInstance.estimatedUnitPriceAmount.encodeAsHTML()}
+                                                ${inventoryItemInstance.estimatedUnitPriceCurrency.encodeAsHTML()}
+                                            </g:if>
+                                        </td>
                                     </tr>
 
