Index: trunk/grails-app/i18n/messages.properties
===================================================================
--- trunk/grails-app/i18n/messages.properties	(revision 630)
+++ trunk/grails-app/i18n/messages.properties	(revision 631)
@@ -136,4 +136,5 @@
 task.operationNotPermittedOnCompleteTask=This operation is not permitted on a complete task.
 task.operationNotPermittedOnTaskInTrash=This operation is not permitted on a task that is in the trash.
+task.operationNotPermittedOnRecurringTaskWithoutAuth=This operation is not permitted on a recurring task without authorisation.
 task.failedToSave=Could not complete operation, task failed to save.
 task.modifications.failedToSave=Could not complete operation, as task modification record failed to save.
Index: trunk/grails-app/services/InventoryMovementService.groovy
===================================================================
--- trunk/grails-app/services/InventoryMovementService.groovy	(revision 630)
+++ trunk/grails-app/services/InventoryMovementService.groovy	(revision 631)
@@ -4,4 +4,5 @@
 
     def authService
+    def authenticateService
 
     def reverseMove(params) {
@@ -34,4 +35,11 @@
                 if(result.inventoryMovementInstance.task?.taskStatus?.id == 3)
                     return fail(field:"task", code:"task.operationNotPermittedOnCompleteTask")
+
+                // Check for authorisation on recurring tasks.
+                if(result.inventoryMovementInstance.task?.taskRecurringSchedule) {
+                    if(!authenticateService.ifAnyGranted('ROLE_AppAdmin,ROLE_Manager,ROLE_TaskManager,ROLE_InventoryManager'))
+                        return fail(field:"task", code:"task.operationNotPermittedOnRecurringTaskWithoutAuth")
+                }
+
             }
 
@@ -95,4 +103,10 @@
                 if(result.inventoryMovementInstance.task.taskStatus.id == 3)
                     return fail(field:"task", code:"task.operationNotPermittedOnCompleteTask")
+
+                // Check for authorisation on recurring tasks.
+                if(result.inventoryMovementInstance.task.taskRecurringSchedule) {
+                    if(!authenticateService.ifAnyGranted('ROLE_AppAdmin,ROLE_Manager,ROLE_TaskManager,ROLE_InventoryManager'))
+                        return fail(field:"task", code:"task.operationNotPermittedOnRecurringTaskWithoutAuth")
+                }
             }
 
Index: trunk/grails-app/services/TaskService.groovy
===================================================================
--- trunk/grails-app/services/TaskService.groovy	(revision 630)
+++ trunk/grails-app/services/TaskService.groovy	(revision 631)
@@ -11,4 +11,5 @@
     def authService
     def dateUtilService
+    def authenticateService
     def assignedGroupService
     def assignedPersonService
@@ -325,4 +326,10 @@
                 return fail(field:"task", code:"task.operationNotPermittedOnCompleteTask")
 
+            // Check for authorisation on recurring tasks.
+            if(taskInstance.taskRecurringSchedule) {
+                if(!authenticateService.ifAnyGranted('ROLE_AppAdmin,ROLE_Manager,ROLE_TaskManager'))
+                    return fail(field:"task", code:"task.operationNotPermittedOnRecurringTaskWithoutAuth")
+            }
+
             // If task status is "Not Started" and entry type is "Work Done" and time has been booked.
             // Then we create the started modification and set task status.
@@ -379,4 +386,10 @@
             }
 
+            // Check for authorisation on recurring tasks.
+            if(result.taskInstance.taskRecurringSchedule) {
+                if(!authenticateService.ifAnyGranted('ROLE_AppAdmin,ROLE_Manager,ROLE_TaskManager'))
+                    return fail(field:"taskRecurringSchedule", code:"task.operationNotPermittedOnRecurringTaskWithoutAuth")
+            }
+
             result.taskInstance.properties = params
 
@@ -425,4 +438,10 @@
             }
 
+            // Check for authorisation on recurring tasks.
+            if(result.taskInstance.taskRecurringSchedule) {
+                if(!authenticateService.ifAnyGranted('ROLE_AppAdmin,ROLE_Manager,ROLE_TaskManager'))
+                    return fail(field:"taskRecurringSchedule", code:"task.operationNotPermittedOnRecurringTaskWithoutAuth")
+            }
+
             result.taskInstance.taskStatus = TaskStatus.get(3)
             result.taskInstance.attentionFlag = false
@@ -474,4 +493,10 @@
             }
 
+            // Check for authorisation on recurring tasks.
+            if(result.taskInstance.taskRecurringSchedule) {
+                if(!authenticateService.ifAnyGranted('ROLE_AppAdmin,ROLE_Manager,ROLE_TaskManager'))
+                    return fail(field:"taskRecurringSchedule", code:"task.operationNotPermittedOnRecurringTaskWithoutAuth")
+            }
+
             result.taskInstance.attentionFlag = true
 
@@ -520,4 +545,10 @@
             }
 
+            // Check for authorisation on recurring tasks.
+            if(result.taskInstance.taskRecurringSchedule) {
+                if(!authenticateService.ifAnyGranted('ROLE_AppAdmin,ROLE_Manager,ROLE_TaskManager'))
+                    return fail(field:"taskRecurringSchedule", code:"task.operationNotPermittedOnRecurringTaskWithoutAuth")
+            }
+
             result.taskInstance.attentionFlag = false
 
@@ -566,4 +597,10 @@
             }
 
+            // Check for authorisation on recurring tasks.
+            if(result.taskInstance.taskRecurringSchedule) {
+                if(!authenticateService.ifAnyGranted('ROLE_AppAdmin,ROLE_Manager,ROLE_TaskManager'))
+                    return fail(field:"taskRecurringSchedule", code:"task.operationNotPermittedOnRecurringTaskWithoutAuth")
+            }
+
             def isInProgress = false
             result.taskInstance.entries.each() {
@@ -621,4 +658,10 @@
             }
 
+            // Check for authorisation on recurring tasks.
+            if(result.taskInstance.taskRecurringSchedule) {
+                if(!authenticateService.ifAnyGranted('ROLE_AppAdmin,ROLE_Manager,ROLE_TaskManager'))
+                    return fail(field:"taskRecurringSchedule", code:"task.operationNotPermittedOnRecurringTaskWithoutAuth")
+            }
+
             result.taskInstance.trash = true
             result.taskInstance.attentionFlag = false
@@ -669,4 +712,10 @@
             }
 
+            // Check for authorisation on recurring tasks.
+            if(result.taskInstance.taskRecurringSchedule) {
+                if(!authenticateService.ifAnyGranted('ROLE_AppAdmin,ROLE_Manager,ROLE_TaskManager'))
+                    return fail(field:"taskRecurringSchedule", code:"task.operationNotPermittedOnRecurringTaskWithoutAuth")
+            }
+
             result.taskInstance.trash = false
 
@@ -715,4 +764,10 @@
             }
 
+            // Check for authorisation on recurring tasks.
+            if(result.taskInstance.taskRecurringSchedule) {
+                if(!authenticateService.ifAnyGranted('ROLE_AppAdmin,ROLE_Manager,ROLE_TaskManager'))
+                    return fail(field:"taskRecurringSchedule", code:"task.operationNotPermittedOnRecurringTaskWithoutAuth")
+            }
+
             result.taskInstance.approved = true
 
@@ -759,4 +814,10 @@
                 if(result.taskInstance.version > params.version.toLong())
                     return fail(field:"version", code:"default.optimistic.locking.failure")
+            }
+
+            // Check for authorisation on recurring tasks.
+            if(result.taskInstance.taskRecurringSchedule) {
+                if(!authenticateService.ifAnyGranted('ROLE_AppAdmin,ROLE_Manager,ROLE_TaskManager'))
+                    return fail(field:"taskRecurringSchedule", code:"task.operationNotPermittedOnRecurringTaskWithoutAuth")
             }
 
