Index: trunk/grails-app/services/CreateDataService.groovy
===================================================================
--- trunk/grails-app/services/CreateDataService.groovy	(revision 175)
+++ trunk/grails-app/services/CreateDataService.groovy	(revision 177)
@@ -708,13 +708,26 @@
 
         // InventoryMovementType #1
-        inventoryMovementTypeInstance = new InventoryMovementType(name: "Used")
+        inventoryMovementTypeInstance = new InventoryMovementType(name: "Used",
+                                                                                                                        incrementsInventory: false)
         saveAndTest(inventoryMovementTypeInstance)
 
         // InventoryMovementType #2
-        inventoryMovementTypeInstance = new InventoryMovementType(name: "Repaired")
+        inventoryMovementTypeInstance = new InventoryMovementType(name: "Repaired",
+                                                                                                                        incrementsInventory: true)
         saveAndTest(inventoryMovementTypeInstance)
 
         // InventoryMovementType #3
-        inventoryMovementTypeInstance = new InventoryMovementType(name: "Purchased")
+        inventoryMovementTypeInstance = new InventoryMovementType(name: "Purchase Received",
+                                                                                                                        incrementsInventory: true)
+        saveAndTest(inventoryMovementTypeInstance)
+
+        // InventoryMovementType #4
+        inventoryMovementTypeInstance = new InventoryMovementType(name: "Correction Increase",
+                                                                                                                        incrementsInventory: true)
+        saveAndTest(inventoryMovementTypeInstance)
+
+        // InventoryMovementType #5
+        inventoryMovementTypeInstance = new InventoryMovementType(name: "Correction Decrease",
+                                                                                                                        incrementsInventory: false)
         saveAndTest(inventoryMovementTypeInstance)
     }
Index: trunk/grails-app/services/InventoryMovementService.groovy
===================================================================
--- trunk/grails-app/services/InventoryMovementService.groovy	(revision 177)
+++ trunk/grails-app/services/InventoryMovementService.groovy	(revision 177)
@@ -0,0 +1,112 @@
+class InventoryMovementService {
+
+    boolean transactional = false
+
+    def reverseMove(params) {
+        InventoryMovement.withTransaction { status ->
+            def result = [:]
+            def inventoryMovementInstance = InventoryMovement.lock(params.id)
+            if(inventoryMovementInstance) {
+                def inventoryItem = InventoryItem.lock(inventoryMovementInstance.inventoryItem.id)
+                result.taskId = inventoryMovementInstance.task.id
+
+                if(!inventoryItem) {
+                        status.setRollbackOnly()
+                        inventoryMovementInstance.errors.rejectValue('inventoryItem', "inventoryMovement.inventoryItem.notFound")
+                        result.inventoryMovementInstance = inventoryMovementInstance
+                        result.error = true
+                        return result
+                }
+
+                // Reverse the movement of inventory.
+                if(!inventoryMovementInstance.inventoryMovementType.incrementsInventory) {
+                    inventoryItem.unitsInStock += inventoryMovementInstance.quantity
+                }
+                else {
+                    if(inventoryItem.unitsInStock >= inventoryMovementInstance.quantity) {
+                        inventoryItem.unitsInStock -= inventoryMovementInstance.quantity
+                    }
+                    else {
+                        status.setRollbackOnly()
+                        inventoryMovementInstance.errors.rejectValue('quantity', "inventoryMovement.quantity.insufficientItemsInStock")
+                        result.inventoryMovementInstance = inventoryMovementInstance
+                        result.error = true
+                        return result
+                    }
+                }
+
+                if(inventoryItem.save() ) {
+                    inventoryMovementInstance.delete()
+                    return result
+                }
+                else {
+                    status.setRollbackOnly()
+                    result.error = true
+                    return result
+                }
+
+            }
+            else {
+                result.error = true
+                return result
+            }
+
+        } // end withTransaction
+    } //end reverseMove()
+
+    def move(params) {
+        InventoryMovement.withTransaction { status ->
+            def result = [:]
+            def inventoryMovementInstance = new InventoryMovement(params)
+
+            if(inventoryMovementInstance.validate()) {
+                def inventoryItem = InventoryItem.lock(inventoryMovementInstance.inventoryItem.id)
+                result.taskId = inventoryMovementInstance.task.id
+
+                if(!inventoryItem) {
+                        status.setRollbackOnly()
+                        inventoryMovementInstance.errors.rejectValue('inventoryItem', "inventoryMovement.inventoryItem.notFound")
+                        result.inventoryMovementInstance = inventoryMovementInstance
+                        result.error = true
+                        return result
+                }
+
+                // Perform the movement of inventory.
+                if(inventoryMovementInstance.inventoryMovementType.incrementsInventory) {
+                    inventoryItem.unitsInStock += inventoryMovementInstance.quantity
+                }
+                else {
+                    if(inventoryItem.unitsInStock >= inventoryMovementInstance.quantity) {
+                        inventoryItem.unitsInStock -= inventoryMovementInstance.quantity
+                    }
+                    else {
+                        status.setRollbackOnly()
+                        inventoryMovementInstance.errors.rejectValue('quantity', "inventoryMovement.quantity.insufficientItemsInStock")
+                        result.inventoryMovementInstance = inventoryMovementInstance
+                        result.error = true
+                        return result
+                    }
+                }
+
+                if(inventoryItem.save() && inventoryMovementInstance.save()) {
+                    result.inventoryMovementInstance = inventoryMovementInstance
+                    return result
+                }
+                else {
+                    status.setRollbackOnly()
+                    result.inventoryMovementInstance = inventoryMovementInstance
+                    result.error = true
+                    return result
+                }
+
+            }
+            else {
+                result.inventoryMovementInstance = inventoryMovementInstance
+                result.error = true
+                return result
+            }
+
+        } // end withTransaction
+    } // end move()
+
+} // end class
