Index: trunk/grails-app/services/InventoryItemService.groovy
===================================================================
--- trunk/grails-app/services/InventoryItemService.groovy	(revision 225)
+++ trunk/grails-app/services/InventoryItemService.groovy	(revision 225)
@@ -0,0 +1,57 @@
+/**
+* Provides a service class for the InventoryItem domain class.
+*/
+class InventoryItemService {
+
+    boolean transactional = false
+
+    /**
+    * Prepare the data for the show view.
+    * The result can be used to easily construct the model for the show view.
+    * @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 
+    */
+    def prepareShowData(params) {
+        def result = [:]
+
+        def fail = { Object[] args ->
+            if(args.size() == 2) result.errors = [args[0], args[1]]
+            log.debug result.errors
+            result.error = true
+            return result
+        }
+
+        result.showTab = [:]
+        switch (params.showTab) {
+            case "showDetailTab":
+                result.showTab.detail =  new String("true")
+                break
+            case "showMovementTab":
+                result.showTab.movement =  new String("true")
+                break
+            default:
+                result.showTab.inventory = new String("true")
+        }
+
+        result.inventoryItemInstance = InventoryItem.get( params.id )
+
+        if(!result.inventoryItemInstance)
+            return fail("inventoryItem", "inventoryItem.notFound")
+
+        log.debug "WTF are we doing here"
+
+        def p = [:]
+        p.max = result.inventoryMovementListMax = 10
+        p.order = "desc"
+        p.sort = "id"
+        result.inventoryMovementList = InventoryMovement.findAllByInventoryItem(result.inventoryItemInstance, p)
+        result.inventoryMovementListTotal = InventoryMovement.countByInventoryItem(result.inventoryItemInstance)
+
+        // Success
+        return result
+
+    } // end prepareShowData()
+
+} // end class
Index: trunk/grails-app/services/InventoryMovementService.groovy
===================================================================
--- trunk/grails-app/services/InventoryMovementService.groovy	(revision 222)
+++ trunk/grails-app/services/InventoryMovementService.groovy	(revision 225)
@@ -10,6 +10,26 @@
             result.inventoryMovementInstance = InventoryMovement.lock(params.id)
             if(result.inventoryMovementInstance) {
+
+                // Used type must have a task that is not complete or in the trash
+                if(result.inventoryMovementInstance.inventoryMovementType.id == 1)  {
+
+                    // Unlike move, if the task does not exist at all then deletion is still allowed.
+                    if(result.inventoryMovementInstance.task?.trash) {
+                        status.setRollbackOnly()
+                        result.inventoryMovementInstance.errors.rejectValue("task", "task.operationNotPermittedOnTaskInTrash")
+                        result.error = true
+                        return result
+                    }
+
+                    if(result.inventoryMovementInstance.task?.taskStatus?.id == 3) {
+                        status.setRollbackOnly()
+                        result.inventoryMovementInstance.errors.rejectValue('task', "task.operationNotPermittedOnCompleteTask")
+                        result.error = true
+                        return result
+                    }
+                }
+
                 def inventoryItem = InventoryItem.lock(result.inventoryMovementInstance.inventoryItem.id)
-                result.taskId = result.inventoryMovementInstance.task.id
+                result.taskId = result.inventoryMovementInstance.task?.id
 
                 if(!inventoryItem) {
@@ -70,4 +90,29 @@
             result.inventoryMovementInstance.person = personService.currentUser
 
+            // Used type must have a task that is not complete or in the trash
+            if(result.inventoryMovementInstance.inventoryMovementType.id == 1)  {
+
+                if(!result.inventoryMovementInstance.task) {
+                    status.setRollbackOnly()
+                    result.inventoryMovementInstance.errors.rejectValue('task', "task.notFound")
+                    result.error = true
+                    return result
+                }
+
+                if(result.inventoryMovementInstance.task.trash) {
+                    status.setRollbackOnly()
+                    result.inventoryMovementInstance.errors.rejectValue("task", "task.operationNotPermittedOnTaskInTrash")
+                    result.error = true
+                    return result
+                }
+
+                if(result.inventoryMovementInstance.task.taskStatus.id == 3) {
+                    status.setRollbackOnly()
+                    result.inventoryMovementInstance.errors.rejectValue('task', "task.operationNotPermittedOnCompleteTask")
+                    result.error = true
+                    return result
+                }
+            }
+
             if(result.inventoryMovementInstance.validate()) {
                 def inventoryItem = InventoryItem.lock(result.inventoryMovementInstance.inventoryItem.id)
@@ -77,11 +122,4 @@
                     status.setRollbackOnly()
                     result.inventoryMovementInstance.errors.rejectValue('inventoryItem', "inventoryMovement.inventoryItem.notFound")
-                    result.error = true
-                    return result
-                }
-
-                if(result.inventoryMovementInstance.task.taskStatus.id == 3) {
-                    status.setRollbackOnly()
-                    result.inventoryMovementInstance.errors.rejectValue('task', "task.operationNotPermittedOnCompleteTask")
                     result.error = true
                     return result
