Index: /trunk/grails-app/controllers/InventoryMovementDetailedController.groovy
===================================================================
--- /trunk/grails-app/controllers/InventoryMovementDetailedController.groovy	(revision 176)
+++ /trunk/grails-app/controllers/InventoryMovementDetailedController.groovy	(revision 177)
@@ -2,4 +2,6 @@
 
 class InventoryMovementDetailedController extends BaseController {
+
+    def inventoryMovementService
 
     def index = { redirect(action:list,params:params) }
@@ -24,20 +26,18 @@
 
     def delete = {
-        def inventoryMovementInstance = InventoryMovement.get( params.id )
-        if(inventoryMovementInstance) {
-            try {
-                def taskId = inventoryMovementInstance.task?.id
-                inventoryMovementInstance.delete(flush:true)
-                flash.message = "InventoryMovement ${params.id} deleted"
-                redirect(controller:"taskDetailed", action:"show", id:taskId)
-            }
-            catch(org.springframework.dao.DataIntegrityViolationException e) {
-                flash.message = "InventoryMovement ${params.id} could not be deleted"
-                redirect(action:show,id:params.id)
-            }
+        def result = inventoryMovementService.reverseMove(params)
+
+        if(!result.error) {
+            flash.message = "InventoryMovement ${params.id} deleted"
+            redirect(controller:"taskDetailed", action:"show", id:result.taskId)
         }
         else {
-            flash.message = "InventoryMovement not found with id ${params.id}"
-            redirect(action:list)
+            if(result.inventoryMovementInstance) {
+                render(view:'show',model:[inventoryMovementInstance:result.inventoryMovementInstance])
+            }
+            else {
+                flash.message = "Could not delete inventory movement."
+                redirect(controller:"taskDetailed", action:"search", id:result.taskId)
+            }
         }
     }
@@ -54,12 +54,21 @@
 
     def save = {
-        def inventoryMovementInstance = new InventoryMovement(params)
-        if(!inventoryMovementInstance.hasErrors() && inventoryMovementInstance.save()) {
-            flash.message = "Inventory Movement for ${inventoryMovementInstance.inventoryItem.name} created."
-            redirect(controller:"taskDetailed", action:"show", id: params.task.id)
+        def result = inventoryMovementService.move(params)
+
+        if(!result.error) {
+            flash.message = "Inventory Movement for ${result.inventoryMovementInstance.inventoryItem.name} created."
+            redirect(controller:"taskDetailed", action:"show", id: result.taskId)
         }
         else {
-            render(view:'create',model:[inventoryMovementInstance:inventoryMovementInstance])
+            if(result.inventoryMovementInstance) {
+                render(view:'create',model:[inventoryMovementInstance:result.inventoryMovementInstance])
+            }
+            else {
+                flash.message = "Could not create inventory movement."
+                redirect(controller:"taskDetailed", action:"search", id:result.taskId)
+            }
+
         }
     }
+
 }
Index: /trunk/grails-app/controllers/InventoryMovementTypeController.groovy
===================================================================
--- /trunk/grails-app/controllers/InventoryMovementTypeController.groovy	(revision 176)
+++ /trunk/grails-app/controllers/InventoryMovementTypeController.groovy	(revision 177)
@@ -27,5 +27,5 @@
         if(inventoryMovementTypeInstance) {
             try {
-                inventoryMovementTypeInstance.delete()
+                inventoryMovementTypeInstance.delete(flush:true)
                 flash.message = "InventoryMovementType ${params.id} deleted"
                 redirect(action:list)
@@ -77,5 +77,5 @@
         else {
             flash.message = "InventoryMovementType not found with id ${params.id}"
-            redirect(action:edit,id:params.id)
+            redirect(action:list)
         }
     }
Index: /trunk/grails-app/domain/InventoryMovement.groovy
===================================================================
--- /trunk/grails-app/domain/InventoryMovement.groovy	(revision 176)
+++ /trunk/grails-app/domain/InventoryMovement.groovy	(revision 177)
@@ -8,5 +8,5 @@
     Date date = new Date()
 
-//     static belongsTo = [inventoryItem]
+//     static belongsTo = []
 
     static constraints = {
Index: /trunk/grails-app/domain/InventoryMovementType.groovy
===================================================================
--- /trunk/grails-app/domain/InventoryMovementType.groovy	(revision 176)
+++ /trunk/grails-app/domain/InventoryMovementType.groovy	(revision 177)
@@ -2,11 +2,14 @@
     String name
     String description = ""
+    boolean incrementsInventory = false
     boolean isActive = true
 
     static hasMany = [inventoryMovements: InventoryMovement]
-    
+
     static contstraints = {
         name(maxSize:50,unique:true,blank:false)
         description(maxSize:100)
+        incrementsInventory()
+        isActive()
     }
 
Index: /trunk/grails-app/i18n/messages.properties
===================================================================
--- /trunk/grails-app/i18n/messages.properties	(revision 176)
+++ /trunk/grails-app/i18n/messages.properties	(revision 177)
@@ -46,4 +46,7 @@
 task.associatedAssets=Associated Assets
 task.associatedAssets.help=These assets are to be associated with this task, but costs will not be assigned.
+
+inventoryMovement.quantity.insufficientItemsInStock=Could not complete operation, insufficient items in stock.
+inventoryMovement.inventoryItem.notFound=Inventory Item not found.
 
 default.doesnt.match.message=Property [{0}] of class [{1}] with value [{2}] does not match the required pattern [{3}]
Index: /trunk/grails-app/services/CreateDataService.groovy
===================================================================
--- /trunk/grails-app/services/CreateDataService.groovy	(revision 176)
+++ /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
Index: /trunk/grails-app/views/inventoryMovementDetailed/create.gsp
===================================================================
--- /trunk/grails-app/views/inventoryMovementDetailed/create.gsp	(revision 176)
+++ /trunk/grails-app/views/inventoryMovementDetailed/create.gsp	(revision 177)
@@ -41,5 +41,4 @@
                                 <td valign="top" class="value ${hasErrors(bean:inventoryMovementInstance,field:'quantity','errors')}">
                                     <input type="text" id="quantity" name="quantity" value="${fieldValue(bean:inventoryMovementInstance,field:'quantity')}"/>
-                                    ${inventoryMovementInstance.inventoryItem}
                                 </td>
                             </tr>
@@ -47,5 +46,5 @@
                             <tr class="prop">
                                 <td valign="top" class="name">
-                                    <label for="inventoryMovementType">Inventory Movement Type:</label>
+                                    <label for="inventoryMovementType">Movement Type:</label>
                                 </td>
                                 <td valign="top" class="value ${hasErrors(bean:inventoryMovementInstance,field:'inventoryMovementType','errors')}">
Index: /trunk/grails-app/views/inventoryMovementDetailed/show.gsp
===================================================================
--- /trunk/grails-app/views/inventoryMovementDetailed/show.gsp	(revision 176)
+++ /trunk/grails-app/views/inventoryMovementDetailed/show.gsp	(revision 177)
@@ -15,4 +15,9 @@
             <div class="message">${flash.message}</div>
             </g:if>
+            <g:hasErrors bean="${inventoryMovementInstance}">
+            <div class="errors">
+                <g:renderErrors bean="${inventoryMovementInstance}" as="list" />
+            </div>
+            </g:hasErrors>
             <div class="dialog">
                 <table>
Index: /trunk/grails-app/views/inventoryMovementType/create.gsp
===================================================================
--- /trunk/grails-app/views/inventoryMovementType/create.gsp	(revision 176)
+++ /trunk/grails-app/views/inventoryMovementType/create.gsp	(revision 177)
@@ -5,9 +5,8 @@
         <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
         <meta name="layout" content="main" />
-        <title>Create InventoryMovementType</title>         
+        <title>Create InventoryMovementType</title>
     </head>
     <body>
         <div class="nav">
-            <span class="menuButton"><a class="home" href="${resource(dir:'')}">Home</a></span>
             <span class="menuButton"><g:link class="list" action="list">InventoryMovementType List</g:link></span>
         </div>
@@ -33,4 +32,13 @@
                                 <td valign="top" class="value ${hasErrors(bean:inventoryMovementTypeInstance,field:'description','errors')}">
                                     <input type="text" id="description" name="description" value="${fieldValue(bean:inventoryMovementTypeInstance,field:'description')}"/>
+                                </td>
+                            </tr> 
+                        
+                            <tr class="prop">
+                                <td valign="top" class="name">
+                                    <label for="incrementsInventory">Increments Inventory:</label>
+                                </td>
+                                <td valign="top" class="value ${hasErrors(bean:inventoryMovementTypeInstance,field:'incrementsInventory','errors')}">
+                                    <g:checkBox name="incrementsInventory" value="${inventoryMovementTypeInstance?.incrementsInventory}" ></g:checkBox>
                                 </td>
                             </tr> 
Index: /trunk/grails-app/views/inventoryMovementType/edit.gsp
===================================================================
--- /trunk/grails-app/views/inventoryMovementType/edit.gsp	(revision 176)
+++ /trunk/grails-app/views/inventoryMovementType/edit.gsp	(revision 177)
@@ -9,5 +9,4 @@
     <body>
         <div class="nav">
-            <span class="menuButton"><a class="home" href="${resource(dir:'')}">Home</a></span>
             <span class="menuButton"><g:link class="list" action="list">InventoryMovementType List</g:link></span>
             <span class="menuButton"><g:link class="create" action="create">New InventoryMovementType</g:link></span>
@@ -36,4 +35,13 @@
                                 <td valign="top" class="value ${hasErrors(bean:inventoryMovementTypeInstance,field:'description','errors')}">
                                     <input type="text" id="description" name="description" value="${fieldValue(bean:inventoryMovementTypeInstance,field:'description')}"/>
+                                </td>
+                            </tr> 
+                        
+                            <tr class="prop">
+                                <td valign="top" class="name">
+                                    <label for="incrementsInventory">Increments Inventory:</label>
+                                </td>
+                                <td valign="top" class="value ${hasErrors(bean:inventoryMovementTypeInstance,field:'incrementsInventory','errors')}">
+                                    <g:checkBox name="incrementsInventory" value="${inventoryMovementTypeInstance?.incrementsInventory}" ></g:checkBox>
                                 </td>
                             </tr> 
Index: /trunk/grails-app/views/inventoryMovementType/list.gsp
===================================================================
--- /trunk/grails-app/views/inventoryMovementType/list.gsp	(revision 176)
+++ /trunk/grails-app/views/inventoryMovementType/list.gsp	(revision 177)
@@ -9,5 +9,4 @@
     <body>
         <div class="nav">
-            <span class="menuButton"><a class="home" href="${resource(dir:'')}">Home</a></span>
             <span class="menuButton"><g:link class="create" action="create">New InventoryMovementType</g:link></span>
         </div>
@@ -26,4 +25,6 @@
                    	        <g:sortableColumn property="description" title="Description" />
                         
+                   	        <g:sortableColumn property="incrementsInventory" title="Increments Inventory" />
+                        
                    	        <g:sortableColumn property="isActive" title="Is Active" />
                         
@@ -39,4 +40,6 @@
                         
                             <td>${fieldValue(bean:inventoryMovementTypeInstance, field:'description')}</td>
+                        
+                            <td>${fieldValue(bean:inventoryMovementTypeInstance, field:'incrementsInventory')}</td>
                         
                             <td>${fieldValue(bean:inventoryMovementTypeInstance, field:'isActive')}</td>
Index: /trunk/grails-app/views/inventoryMovementType/show.gsp
===================================================================
--- /trunk/grails-app/views/inventoryMovementType/show.gsp	(revision 176)
+++ /trunk/grails-app/views/inventoryMovementType/show.gsp	(revision 177)
@@ -9,5 +9,4 @@
     <body>
         <div class="nav">
-            <span class="menuButton"><a class="home" href="${resource(dir:'')}">Home</a></span>
             <span class="menuButton"><g:link class="list" action="list">InventoryMovementType List</g:link></span>
             <span class="menuButton"><g:link class="create" action="create">New InventoryMovementType</g:link></span>
@@ -34,4 +33,11 @@
                             
                             <td valign="top" class="value">${fieldValue(bean:inventoryMovementTypeInstance, field:'description')}</td>
+                            
+                        </tr>
+                    
+                        <tr class="prop">
+                            <td valign="top" class="name">Increments Inventory:</td>
+                            
+                            <td valign="top" class="value">${fieldValue(bean:inventoryMovementTypeInstance, field:'incrementsInventory')}</td>
                             
                         </tr>
