Index: trunk/grails-app/controllers/TaskDetailedController.groovy
===================================================================
--- trunk/grails-app/controllers/TaskDetailedController.groovy	(revision 136)
+++ trunk/grails-app/controllers/TaskDetailedController.groovy	(revision 137)
@@ -31,4 +31,16 @@
 			params.order = "desc"
 			params.sort = "id"
+			
+			def entryWorkDoneList = Entry.withCriteria {
+																def entryType = EntryType.findByName("WorkDone")
+																eq("entryType", entryType)
+																eq("task", taskInstance)
+														}
+			
+			def entryFaultList = Entry.withCriteria {
+																def entryType = EntryType.findByName("Fault")
+																eq("entryType", entryType)
+																eq("task", taskInstance)
+														}
 
 			def subTaskInstanceList = Task.findAllByParentTask(taskInstance, params)
@@ -53,5 +65,7 @@
             }
 			
-            return [ taskInstance : taskInstance,
+            return [ taskInstance: taskInstance,
+							entryWorkDoneList: entryWorkDoneList,
+	   						entryFaultList: entryFaultList,
                             taskProcedureInstance: taskProcedureInstance,
                             taskProcedureExits: taskProcedureExits,
Index: trunk/grails-app/controllers/TaskRecurringScheduleDetailedController.groovy
===================================================================
--- trunk/grails-app/controllers/TaskRecurringScheduleDetailedController.groovy	(revision 136)
+++ trunk/grails-app/controllers/TaskRecurringScheduleDetailedController.groovy	(revision 137)
@@ -1,7 +1,10 @@
 import org.codehaus.groovy.grails.plugins.springsecurity.Secured
 import org.codehaus.groovy.runtime.TimeCategory
+import java.text.SimpleDateFormat
 
 class TaskRecurringScheduleDetailedController extends BaseController {
     
+	def dateUtilService
+	
     def index = { redirect(action:list,params:params) }
 
@@ -51,36 +54,61 @@
         }
         else {
-            return [ taskRecurringScheduleInstance : taskRecurringScheduleInstance ]
+            return [ taskRecurringScheduleInstance : taskRecurringScheduleInstance]
         }
     }
 
     def update = {
-        def taskRecurringScheduleInstance = TaskRecurringSchedule.get( params.id )
-        if(taskRecurringScheduleInstance) {
-            if(params.version) {
-                def version = params.version.toLong()
-                if(taskRecurringScheduleInstance.version > version) {
+		TaskRecurringSchedule.withTransaction { status ->
+        
+        	def taskRecurringScheduleInstance = TaskRecurringSchedule.get( params.id )
+			if(taskRecurringScheduleInstance) {
+				
+				if(params.version) {
+					def version = params.version.toLong()
+					if(taskRecurringScheduleInstance.version > version) {
+						taskRecurringScheduleInstance.errors.rejectValue("version", "taskRecurringSchedule.optimistic.locking.failure", "Another user has updated this TaskRecurringSchedule while you were editing.")
+						render(view:'edit',model:[taskRecurringScheduleInstance:taskRecurringScheduleInstance])
+						return
+					}
+				}
+					
+				Date originalDate = taskRecurringScheduleInstance.startDate
+				taskRecurringScheduleInstance.properties = params  // Domain object is now 'dirty'.
+				Date newDate = taskRecurringScheduleInstance.startDate
+	
+				// If user changes startDate then ensure it is in the future, otherwise it's ok to keep the original date.
+				if(originalDate.getTime() != newDate.getTime())
+				{
+					if(newDate < dateUtilService.getToday()) 
+					{
+						status.setRollbackOnly()  // Only allow the transaction to Rollback, preventing flush due to 'dirty'.
+						taskRecurringScheduleInstance.errors.rejectValue("startDate", "taskRecurring.startDate.NotInTheFuture")
+						render(view:'edit',model:[taskRecurringScheduleInstance:taskRecurringScheduleInstance])
+						return
+					}
+				}
+					
+				taskRecurringScheduleInstance.nextTargetStartDate = taskRecurringScheduleInstance.startDate
+				taskRecurringScheduleInstance.setNextGenerationDate() 
+				taskRecurringScheduleInstance.setNextTargetCompletionDate()
                     
-                    taskRecurringScheduleInstance.errors.rejectValue("version", "taskRecurringSchedule.optimistic.locking.failure", "Another user has updated this TaskRecurringSchedule while you were editing.")
-                    render(view:'edit',model:[taskRecurringScheduleInstance:taskRecurringScheduleInstance])
-                    return
-                }
-            }
-//             taskRecurringScheduleInstance.properties = params
-            setUpdateProperties()
-                    
-            if(!taskRecurringScheduleInstance.hasErrors() && taskRecurringScheduleInstance.save()) {
-                flash.message = "TaskRecurringSchedule ${params.id} updated"
-                redirect(action:show,id:taskRecurringScheduleInstance.id)
-            }
-            else {
-                render(view:'edit',model:[taskRecurringScheduleInstance:taskRecurringScheduleInstance])
-            }
-        }
-        else {
-            flash.message = "TaskRecurringSchedule not found with id ${params.id}"
-            redirect(action:edit,id:params.id)
-        }
-    }
+				if(!taskRecurringScheduleInstance.hasErrors() && taskRecurringScheduleInstance.save()) 
+				{
+					flash.message = "TaskRecurringSchedule ${params.id} updated"
+					redirect(action:show,id:taskRecurringScheduleInstance.id)
+				}
+				else 
+				{
+					render(view:'edit',model:[taskRecurringScheduleInstance:taskRecurringScheduleInstance])
+				}
+			}
+			else 
+			{
+				flash.message = "TaskRecurringSchedule not found with id ${params.id}"
+				redirect(action:edit,id:params.id)
+			}
+			
+		} // end withTransaction			
+	} // end update()
 	
     def create = {
@@ -95,5 +123,5 @@
             redirect(controller:"taskDetailed", action:"list")
         }
-    }
+    } // end create()
 
     def save = {
@@ -106,4 +134,8 @@
 		}
 		else {
+			
+			if(taskRecurringScheduleInstance.startDate < dateUtilService.getToday()) {
+				taskRecurringScheduleInstance.errors.rejectValue("startDate", "taskRecurring.startDate.NotInTheFuture")
+			}
 			
 			if(!taskRecurringScheduleInstance.hasErrors() && taskRecurringScheduleInstance.save()) {
@@ -125,48 +157,5 @@
 		}
 
-    }
-                
-    private setUpdateProperties() {
-        def originalStartDate = taskRecurringScheduleInstance.startDate
-        
-        if(taskRecurringScheduleInstance.startDate == params.startDate) {
-            taskRecurringScheduleInstance.properties = params
-        }
-        else {
-            taskRecurringScheduleInstance.properties = params
-            taskRecurringScheduleInstance.nextTargetStartDate = params.startDate
-        }
-        
-    }
+    } // end save()
 
-/*    
-    private Date calculateNextDueDate(recurEvery, period, startDate) {
-        def nextDue = new Date()
-        
-        switch (period) {
-            case "Day(s)":
-                use(TimeCategory) {
-                    nextDue = startDate + recurEvery.days
-                }
-                return nextDue
-            case "Week(s)":
-                use(TimeCategory) {
-                    nextDue = startDate + recurEvery.weeks
-                }
-                return nextDue
-            case "Month(s)":
-                use(TimeCategory) {
-                    nextDue = startDate + recurEvery.months
-                }
-                return nextDue
-            case "Year(s)":
-                use(TimeCategory) {
-                    nextDue = startDate + recurEvery.years
-                }
-                return nextDue
-            default:
-                return nextDue
-        }
-        
-    }*/
 }
