Index: trunk/grails-app/services/TaskReportService.groovy
===================================================================
--- trunk/grails-app/services/TaskReportService.groovy	(revision 535)
+++ trunk/grails-app/services/TaskReportService.groovy	(revision 536)
@@ -49,5 +49,5 @@
         result.taskCount = result.taskList.size()
 
-        // Counts
+        // Assets on Tasks Count.
         result.totalAssetsOnTasksCount = 0
         result.immediateCalloutCount = 0
@@ -80,5 +80,5 @@
         } // each() task
 
-        // Percentages
+        // Percentage of counts.
         result.immediateCalloutPercentage = 0
         result.totalPreventativePercentage = 0
@@ -93,5 +93,54 @@
         }
         catch(ArithmeticException e) {
-            log.error "Could not calculate percentages: "+e
+            log.error "Could not calculate: Assets on Tasks Percentages: "+e
+        }
+
+        // Work Done.
+        result.immediateCalloutWorkDone = [total:0, hours:0, minutes:0, percentage:0]
+        result.unscheduledBreakinWorkDone = [total:0, hours:0, minutes:0]
+        result.preventativeMaintenanceWorkDone = [total:0, hours:0, minutes:0]
+        result.totalPreventativeWorkDone = [total:0, hours:0, minutes:0, percentage:0]
+        result.totalWorkDone = [total:0, hours:0, minutes:0]
+
+        result.taskList.each() { task ->
+            task.entries.each() { entry ->
+                // Has assets assigned and is Work Done.
+                if( (task.primaryAsset || task.associatedAssets) && entry.entryType.id == 3L ) {
+                        if(task.taskType == namedParams.immediateCallout)
+                            result.immediateCalloutWorkDone.total += (entry.durationHour*60) + entry.durationMinute
+                        if(task.taskType == namedParams.unscheduledBreakin)
+                            result.unscheduledBreakinWorkDone.total += (entry.durationHour*60) + entry.durationMinute
+                        if(task.taskType == namedParams.preventativeMaintenance)
+                            result.preventativeMaintenanceWorkDone.total += (entry.durationHour*60) + entry.durationMinute
+                }
+            } // each() entry
+        } // each() task
+
+        // Work Done hours and minutes.
+        result.immediateCalloutWorkDone.hours = (result.immediateCalloutWorkDone.total / 60).toInteger()
+        result.immediateCalloutWorkDone.minutes = result.immediateCalloutWorkDone.total % 60
+
+        result.unscheduledBreakinWorkDone.hours = (result.unscheduledBreakinWorkDone.total / 60).toInteger()
+        result.unscheduledBreakinWorkDone.minutes = result.unscheduledBreakinWorkDone.total % 60
+
+        result.preventativeMaintenanceWorkDone.hours = (result.preventativeMaintenanceWorkDone.total / 60).toInteger()
+        result.preventativeMaintenanceWorkDone.minutes = result.preventativeMaintenanceWorkDone.total % 60
+
+        // Work Done Totals.
+        result.totalPreventativeWorkDone.total = result.unscheduledBreakinWorkDone.total + result.preventativeMaintenanceWorkDone.total
+        result.totalPreventativeWorkDone.hours = (result.totalPreventativeWorkDone.total / 60).toInteger()
+        result.totalPreventativeWorkDone.minutes = result.totalPreventativeWorkDone.total % 60
+
+        result.totalWorkDone.total = result.immediateCalloutWorkDone.total + result.totalPreventativeWorkDone.total
+        result.totalWorkDone.hours = (result.totalWorkDone.total / 60).toInteger()
+        result.totalWorkDone.minutes = result.totalWorkDone.total % 60
+
+        // Work Done Percentages.
+        try {
+            result.immediateCalloutWorkDone.percentage = (result.immediateCalloutWorkDone.total / result.totalWorkDone.total)*100
+            result.totalPreventativeWorkDone.percentage = (result.totalPreventativeWorkDone.total / result.totalWorkDone.total)*100
+        }
+        catch(ArithmeticException e) {
+            log.error "Could not calculate: Work Done Percentages: "+e
         }
 
