Index: trunk/grails-app/controllers/InventoryItemPurchaseDetailedController.groovy
===================================================================
--- trunk/grails-app/controllers/InventoryItemPurchaseDetailedController.groovy	(revision 716)
+++ trunk/grails-app/controllers/InventoryItemPurchaseDetailedController.groovy	(revision 717)
@@ -350,4 +350,7 @@
         }
 
+        // Prevent lazy initialization error.
+        result.inventoryItemPurchaseInstance.costCode.attach()
+
         render(view:'receive',
                         model:['inventoryItemPurchaseInstance': result.inventoryItemPurchaseInstance,
@@ -394,4 +397,7 @@
         }
 
+        // Prevent lazy initialization error.
+        result.inventoryItemPurchaseInstance.costCode.attach()
+
         render(view:'approveInvoicePayment',
                     model:['inventoryItemPurchaseInstance': result.inventoryItemPurchaseInstance,
Index: trunk/grails-app/services/InventoryPurchaseService.groovy
===================================================================
--- trunk/grails-app/services/InventoryPurchaseService.groovy	(revision 716)
+++ trunk/grails-app/services/InventoryPurchaseService.groovy	(revision 717)
@@ -9,5 +9,5 @@
     /**
     * Calulates the quantities for an inventoryItem and purchaseOrderNumber.
-    * @param order An inventory puchase that was the source of the order.
+    * @param order An inventory purchase that was the source of the order.
     * @returns A result map containing the totalOrdered, totalReceived, totalRemaining, thisOrderRemaining,
     *                 totalOrderedAmount, totalReceivedAmount, totalRemainingAmount, thisOrderRemainingAmount,
@@ -265,10 +265,41 @@
             }
 
+            def originalPaymentApprovedAmount = result.inventoryItemPurchaseInstance.orderValueAmount
+
             result.inventoryItemPurchaseInstance.properties = params
             result.inventoryItemPurchaseInstance.purchaseOrderNumber = result.inventoryItemPurchaseInstance.purchaseOrderNumber.trim()
+            result.inventoryItemPurchaseInstance.invoiceNumber = result.inventoryItemPurchaseInstance.invoiceNumber.trim()
             result.inventoryItemPurchaseInstance.lastUpdatedBy = authService.currentUser
+
+            // Fetch to prevent lazy initialization error.
+            result.inventoryItemPurchaseInstance.inventoryItem.unitOfMeasure
+
+            //  If processing an Invoice Approved.
+            if(result.inventoryItemPurchaseInstance.inventoryItemPurchaseType.id == 4L) {
+                if(!result.inventoryItemPurchaseInstance.invoiceNumber)
+                    return fail(field:"invoiceNumber", code:"inventoryItemPurchase.invoiceNumber.required")
+            }
 
             if(result.inventoryItemPurchaseInstance.hasErrors() || !result.inventoryItemPurchaseInstance.save())
                 return fail(code:"default.update.failure")
+
+            //  If processing an Invoice Approved.
+            if(result.inventoryItemPurchaseInstance.inventoryItemPurchaseType.id == 4L) {
+
+                def order = getOriginalOrder(result.inventoryItemPurchaseInstance)
+                if(!order)
+                    return fail(code:"default.not.found")
+
+                // Update orderValueAmount if receivedComplete.
+                if(order.receivedComplete) {
+
+                    def calcQuantities = calcQuantities(order)
+                    order.orderValueAmount = calcQuantities.totalPaymentApproved
+
+                    if(order.hasErrors() || !order.save())
+                        return fail(code:"default.create.failure")
+                }
+
+            }
 
             // Success.
@@ -281,4 +312,5 @@
         InventoryItemPurchase.withTransaction { status ->
             def result = [:]
+
             def fail = { Map m ->
                 status.setRollbackOnly()
