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
         }
 
Index: trunk/web-app/reports/reactiveRatio.jrxml
===================================================================
--- trunk/web-app/reports/reactiveRatio.jrxml	(revision 535)
+++ trunk/web-app/reports/reactiveRatio.jrxml	(revision 536)
@@ -5,5 +5,5 @@
 	<property name="ireport.zoom" value="1.0"/>
 	<property name="ireport.x" value="0"/>
-	<property name="ireport.y" value="405"/>
+	<property name="ireport.y" value="432"/>
 	<import value="java.util.*"/>
 	<import value="net.sf.jasperreports.engine.*"/>
@@ -68,4 +68,9 @@
 	<field name="taskQuery" class="java.lang.String"/>
 	<field name="summaryOfCalculationMethod" class="java.lang.String"/>
+	<field name="immediateCalloutWorkDone" class="java.util.LinkedHashMap"/>
+	<field name="totalPreventativeWorkDone" class="java.util.LinkedHashMap"/>
+	<field name="unscheduledBreakinWorkDone" class="java.util.LinkedHashMap"/>
+	<field name="preventativeMaintenanceWorkDone" class="java.util.LinkedHashMap"/>
+	<field name="totalWorkDone" class="java.util.LinkedHashMap"/>
 	<background>
 		<band splitType="Stretch"/>
@@ -178,10 +183,10 @@
 						<keyExpression><![CDATA["Immediate"]]></keyExpression>
 						<valueExpression><![CDATA[$F{immediateCalloutPercentage}]]></valueExpression>
-						<labelExpression><![CDATA[$F{immediateCalloutPercentage}.setScale(0, RoundingMode.HALF_UP)]]></labelExpression>
+						<labelExpression><![CDATA[$F{immediateCalloutPercentage}.setScale(2, RoundingMode.HALF_UP)]]></labelExpression>
 					</pieSeries>
 					<pieSeries>
 						<keyExpression><![CDATA["Preventative"]]></keyExpression>
 						<valueExpression><![CDATA[$F{totalPreventativePercentage}]]></valueExpression>
-						<labelExpression><![CDATA[$F{totalPreventativePercentage}.setScale(0, RoundingMode.HALF_UP)]]></labelExpression>
+						<labelExpression><![CDATA[$F{totalPreventativePercentage}.setScale(2, RoundingMode.HALF_UP)]]></labelExpression>
 					</pieSeries>
 				</pieDataset>
@@ -203,5 +208,5 @@
 				<reportElement x="236" y="277" width="117" height="20"/>
 				<textElement textAlignment="Center" verticalAlignment="Middle"/>
-				<textFieldExpression><![CDATA[$F{totalPreventativeCount}]]></textFieldExpression>
+				<textFieldExpression class="java.lang.String"><![CDATA[$F{totalPreventativeCount}]]></textFieldExpression>
 			</textField>
 			<textField isBlankWhenNull="true">
@@ -215,5 +220,5 @@
 				<reportElement x="0" y="257" width="157" height="20"/>
 				<textElement verticalAlignment="Middle" markup="none"/>
-				<textFieldExpression><![CDATA["Preventative Maintenance"]]></textFieldExpression>
+				<textFieldExpression class="java.lang.String"><![CDATA["Preventative Maintenance"]]></textFieldExpression>
 			</textField>
 			<textField pattern="#,##0.00 %" isBlankWhenNull="true">
@@ -231,10 +236,10 @@
 				<reportElement x="236" y="197" width="117" height="20"/>
 				<textElement verticalAlignment="Middle"/>
-				<textFieldExpression><![CDATA["Count (Assets on Tasks)"]]></textFieldExpression>
+				<textFieldExpression class="java.lang.String"><![CDATA["Count (Assets on Tasks)"]]></textFieldExpression>
 			</textField>
 			<textField isBlankWhenNull="true">
 				<reportElement x="0" y="237" width="157" height="20"/>
 				<textElement verticalAlignment="Middle" markup="none"/>
-				<textFieldExpression class="java.lang.String"><![CDATA["Unscheduled Breaking: "]]></textFieldExpression>
+				<textFieldExpression class="java.lang.String"><![CDATA["Unscheduled Breakin: "]]></textFieldExpression>
 			</textField>
 			<line>
@@ -269,5 +274,5 @@
 						<seriesColor seriesOrder="0" color="#FF0000"/>
 						<seriesColor seriesOrder="1" color="#00CC00"/>
-						<seriesColor seriesOrder="2" color="#FFFF66"/>
+						<seriesColor seriesOrder="2" color="#F7C240"/>
 					</plot>
 					<itemLabel color="#000000" backgroundColor="#FFFFFF"/>
@@ -300,5 +305,5 @@
 				<reportElement x="0" y="197" width="157" height="20"/>
 				<textElement verticalAlignment="Middle" markup="none"/>
-				<textFieldExpression><![CDATA["Description"]]></textFieldExpression>
+				<textFieldExpression class="java.lang.String"><![CDATA["Description"]]></textFieldExpression>
 			</textField>
 			<textField pattern="#,##0.00 %" isBlankWhenNull="true">
@@ -314,15 +319,247 @@
 				<reportElement x="157" y="0" width="79" height="20"/>
 				<textElement verticalAlignment="Middle"/>
-				<textFieldExpression><![CDATA["Percentage (%)"]]></textFieldExpression>
+				<textFieldExpression class="java.lang.String"><![CDATA["Percentage (%)"]]></textFieldExpression>
 			</textField>
 			<textField isBlankWhenNull="true">
 				<reportElement x="0" y="0" width="157" height="20"/>
 				<textElement verticalAlignment="Middle" markup="none"/>
-				<textFieldExpression><![CDATA["Description"]]></textFieldExpression>
+				<textFieldExpression class="java.lang.String"><![CDATA["Description"]]></textFieldExpression>
 			</textField>
 			<textField pattern="###0.00" isBlankWhenNull="true">
 				<reportElement x="236" y="0" width="117" height="20"/>
 				<textElement verticalAlignment="Middle"/>
-				<textFieldExpression><![CDATA["Count (Assets on Tasks)"]]></textFieldExpression>
+				<textFieldExpression class="java.lang.String"><![CDATA["Count (Assets on Tasks)"]]></textFieldExpression>
+			</textField>
+		</band>
+		<band height="394">
+			<pie3DChart>
+				<chart>
+					<reportElement x="426" y="0" width="356" height="197"/>
+					<chartTitle/>
+					<chartSubtitle/>
+					<chartLegend/>
+				</chart>
+				<pieDataset>
+					<pieSeries>
+						<keyExpression><![CDATA["Immediate"]]></keyExpression>
+						<valueExpression><![CDATA[$F{immediateCalloutWorkDone}.percentage]]></valueExpression>
+						<labelExpression><![CDATA[$F{immediateCalloutWorkDone}.percentage.setScale(2, RoundingMode.HALF_UP)]]></labelExpression>
+					</pieSeries>
+					<pieSeries>
+						<keyExpression><![CDATA["Total Preventative"]]></keyExpression>
+						<valueExpression><![CDATA[$F{totalPreventativeWorkDone}.percentage]]></valueExpression>
+						<labelExpression><![CDATA[$F{totalPreventativeWorkDone}.percentage.setScale(2, RoundingMode.HALF_UP)]]></labelExpression>
+					</pieSeries>
+				</pieDataset>
+				<pie3DPlot depthFactor="0.1" isCircular="false">
+					<plot>
+						<seriesColor seriesOrder="0" color="#FF0000"/>
+						<seriesColor seriesOrder="1" color="#00CC00"/>
+						<seriesColor seriesOrder="2" color="#FF9900"/>
+					</plot>
+					<itemLabel color="#000000" backgroundColor="#FFFFFF"/>
+				</pie3DPlot>
+			</pie3DChart>
+			<textField pattern="#,##0.00 %" isBlankWhenNull="true">
+				<reportElement x="157" y="0" width="79" height="20"/>
+				<textElement verticalAlignment="Middle"/>
+				<textFieldExpression class="java.lang.String"><![CDATA["Percentage (%)"]]></textFieldExpression>
+			</textField>
+			<textField pattern="###0.00" isBlankWhenNull="true">
+				<reportElement x="236" y="20" width="117" height="20"/>
+				<textElement verticalAlignment="Middle"/>
+			</textField>
+			<textField pattern="###0.00" isBlankWhenNull="true">
+				<reportElement x="236" y="0" width="117" height="20"/>
+				<textElement verticalAlignment="Middle"/>
+				<textFieldExpression class="java.lang.String"><![CDATA["Work Done (hh:mm)"]]></textFieldExpression>
+			</textField>
+			<line>
+				<reportElement x="0" y="100" width="353" height="1" forecolor="#999999"/>
+			</line>
+			<line>
+				<reportElement x="0" y="20" width="353" height="1" forecolor="#999999"/>
+			</line>
+			<textField pattern="#,##0.00 %" isBlankWhenNull="true">
+				<reportElement x="157" y="40" width="79" height="20"/>
+				<textElement textAlignment="Center" verticalAlignment="Middle"/>
+				<textFieldExpression class="java.lang.String"><![CDATA[$F{immediateCalloutWorkDone}.percentage.setScale(2, RoundingMode.HALF_UP)]]></textFieldExpression>
+			</textField>
+			<textField isBlankWhenNull="true">
+				<reportElement x="157" y="60" width="79" height="20"/>
+				<textElement textAlignment="Center" verticalAlignment="Middle"/>
+				<textFieldExpression class="java.lang.String"><![CDATA[$F{totalPreventativeWorkDone}.percentage.setScale(2, RoundingMode.HALF_UP)]]></textFieldExpression>
+			</textField>
+			<textField isBlankWhenNull="true">
+				<reportElement x="0" y="20" width="157" height="20"/>
+				<textElement verticalAlignment="Middle" markup="none"/>
+			</textField>
+			<textField isBlankWhenNull="true">
+				<reportElement x="157" y="80" width="79" height="20"/>
+				<textElement textAlignment="Center" verticalAlignment="Middle"/>
+			</textField>
+			<line>
+				<reportElement x="0" y="60" width="353" height="1" forecolor="#999999"/>
+			</line>
+			<textField isBlankWhenNull="true">
+				<reportElement x="236" y="60" width="117" height="20"/>
+				<textElement textAlignment="Center" verticalAlignment="Middle"/>
+				<textFieldExpression class="java.lang.String"><![CDATA[$F{totalPreventativeWorkDone}.hours+":"+$F{totalPreventativeWorkDone}.minutes]]></textFieldExpression>
+			</textField>
+			<textField isBlankWhenNull="true">
+				<reportElement x="236" y="80" width="117" height="20"/>
+				<textElement textAlignment="Center" verticalAlignment="Middle"/>
+				<textFieldExpression class="java.lang.String"><![CDATA[$F{totalWorkDone}.hours+":"+$F{totalWorkDone}.minutes]]></textFieldExpression>
+			</textField>
+			<textField isBlankWhenNull="true">
+				<reportElement x="0" y="0" width="157" height="20"/>
+				<textElement verticalAlignment="Middle" markup="none"/>
+				<textFieldExpression class="java.lang.String"><![CDATA["Description"]]></textFieldExpression>
+			</textField>
+			<line>
+				<reportElement x="0" y="79" width="353" height="1" forecolor="#999999"/>
+			</line>
+			<textField isBlankWhenNull="true">
+				<reportElement x="0" y="40" width="157" height="20"/>
+				<textElement verticalAlignment="Middle" markup="none"/>
+				<textFieldExpression class="java.lang.String"><![CDATA["Immediate Callout: "]]></textFieldExpression>
+			</textField>
+			<textField isBlankWhenNull="true">
+				<reportElement x="0" y="60" width="157" height="20"/>
+				<textElement verticalAlignment="Middle" markup="none"/>
+				<textFieldExpression class="java.lang.String"><![CDATA["Total Preventative: "]]></textFieldExpression>
+			</textField>
+			<line>
+				<reportElement x="0" y="39" width="353" height="1" forecolor="#999999"/>
+			</line>
+			<textField pattern="#,##0.00 %" isBlankWhenNull="true">
+				<reportElement x="157" y="20" width="79" height="20"/>
+				<textElement verticalAlignment="Middle"/>
+			</textField>
+			<textField pattern="###0.00" isBlankWhenNull="true">
+				<reportElement x="0" y="80" width="157" height="20"/>
+				<textElement verticalAlignment="Middle"/>
+				<textFieldExpression class="java.lang.String"><![CDATA["Total: "]]></textFieldExpression>
+			</textField>
+			<textField pattern="#,##0.00 %" isBlankWhenNull="true">
+				<reportElement x="236" y="40" width="117" height="20"/>
+				<textElement textAlignment="Center" verticalAlignment="Middle"/>
+				<textFieldExpression class="java.lang.String"><![CDATA[$F{immediateCalloutWorkDone}.hours+":"+$F{immediateCalloutWorkDone}.minutes]]></textFieldExpression>
+			</textField>
+			<pie3DChart>
+				<chart>
+					<reportElement x="426" y="197" width="356" height="197"/>
+					<chartTitle/>
+					<chartSubtitle/>
+					<chartLegend/>
+				</chart>
+				<pieDataset>
+					<pieSeries>
+						<keyExpression><![CDATA["Immediate"]]></keyExpression>
+						<valueExpression><![CDATA[$F{immediateCalloutWorkDone}.minutes]]></valueExpression>
+						<labelExpression><![CDATA[$F{immediateCalloutWorkDone}.hours+":"+$F{immediateCalloutWorkDone}.minutes]]></labelExpression>
+					</pieSeries>
+					<pieSeries>
+						<keyExpression><![CDATA["Preventative Maintenance"]]></keyExpression>
+						<valueExpression><![CDATA[$F{preventativeMaintenanceWorkDone}.minutes]]></valueExpression>
+						<labelExpression><![CDATA[$F{preventativeMaintenanceWorkDone}.hours+":"+$F{preventativeMaintenanceWorkDone}.minutes]]></labelExpression>
+					</pieSeries>
+					<pieSeries>
+						<keyExpression><![CDATA["Unscheduled Breakin"]]></keyExpression>
+						<valueExpression><![CDATA[$F{unscheduledBreakinWorkDone}.minutes]]></valueExpression>
+						<labelExpression><![CDATA[$F{unscheduledBreakinWorkDone}.hours+":"+$F{unscheduledBreakinWorkDone}.minutes]]></labelExpression>
+					</pieSeries>
+				</pieDataset>
+				<pie3DPlot depthFactor="0.1" isCircular="false">
+					<plot>
+						<seriesColor seriesOrder="0" color="#FF0000"/>
+						<seriesColor seriesOrder="1" color="#00CC00"/>
+						<seriesColor seriesOrder="2" color="#FF9900"/>
+					</plot>
+					<itemLabel color="#000000" backgroundColor="#FFFFFF"/>
+				</pie3DPlot>
+			</pie3DChart>
+			<textField pattern="#,##0.00 %" isBlankWhenNull="true">
+				<reportElement x="157" y="197" width="79" height="20"/>
+				<textElement verticalAlignment="Middle"/>
+			</textField>
+			<textField isBlankWhenNull="true">
+				<reportElement x="0" y="197" width="157" height="20"/>
+				<textElement verticalAlignment="Middle" markup="none"/>
+				<textFieldExpression class="java.lang.String"><![CDATA["Description"]]></textFieldExpression>
+			</textField>
+			<line>
+				<reportElement x="0" y="276" width="353" height="1" forecolor="#999999"/>
+			</line>
+			<textField isBlankWhenNull="true">
+				<reportElement x="0" y="217" width="157" height="20"/>
+				<textElement verticalAlignment="Middle" markup="none"/>
+			</textField>
+			<textField isBlankWhenNull="true">
+				<reportElement x="157" y="257" width="79" height="20"/>
+				<textElement textAlignment="Center" verticalAlignment="Middle"/>
+			</textField>
+			<textField pattern="###0.00" isBlankWhenNull="true">
+				<reportElement x="236" y="197" width="117" height="20"/>
+				<textElement verticalAlignment="Middle"/>
+				<textFieldExpression class="java.lang.String"><![CDATA["Work Done (hh:mm)"]]></textFieldExpression>
+			</textField>
+			<textField isBlankWhenNull="true">
+				<reportElement x="157" y="277" width="79" height="20"/>
+				<textElement textAlignment="Center" verticalAlignment="Middle"/>
+			</textField>
+			<textField pattern="#,##0.00 %" isBlankWhenNull="true">
+				<reportElement x="157" y="237" width="79" height="20"/>
+				<textElement textAlignment="Center" verticalAlignment="Middle"/>
+			</textField>
+			<textField pattern="#,##0.00 %" isBlankWhenNull="true">
+				<reportElement x="157" y="217" width="79" height="20"/>
+				<textElement verticalAlignment="Middle"/>
+			</textField>
+			<line>
+				<reportElement x="0" y="257" width="353" height="1" forecolor="#999999"/>
+			</line>
+			<line>
+				<reportElement x="0" y="297" width="353" height="1" forecolor="#999999"/>
+			</line>
+			<textField pattern="###0.00" isBlankWhenNull="true">
+				<reportElement x="0" y="277" width="157" height="20"/>
+				<textElement verticalAlignment="Middle"/>
+				<textFieldExpression class="java.lang.String"><![CDATA["Total Preventative: "]]></textFieldExpression>
+			</textField>
+			<textField isBlankWhenNull="true">
+				<reportElement x="236" y="277" width="117" height="20"/>
+				<textElement textAlignment="Center" verticalAlignment="Middle"/>
+				<textFieldExpression class="java.lang.String"><![CDATA[$F{totalPreventativeWorkDone}.hours+":"+$F{totalPreventativeWorkDone}.minutes]]></textFieldExpression>
+			</textField>
+			<line>
+				<reportElement x="0" y="236" width="353" height="1" forecolor="#999999"/>
+			</line>
+			<textField pattern="###0.00" isBlankWhenNull="true">
+				<reportElement x="236" y="217" width="117" height="20"/>
+				<textElement verticalAlignment="Middle"/>
+			</textField>
+			<textField isBlankWhenNull="true">
+				<reportElement x="0" y="237" width="157" height="20"/>
+				<textElement verticalAlignment="Middle" markup="none"/>
+				<textFieldExpression class="java.lang.String"><![CDATA["Unscheduled Breakin: "]]></textFieldExpression>
+			</textField>
+			<textField isBlankWhenNull="true">
+				<reportElement x="0" y="257" width="157" height="20"/>
+				<textElement verticalAlignment="Middle" markup="none"/>
+				<textFieldExpression class="java.lang.String"><![CDATA["Preventative Maintenance"]]></textFieldExpression>
+			</textField>
+			<line>
+				<reportElement x="0" y="217" width="353" height="1" forecolor="#999999"/>
+			</line>
+			<textField isBlankWhenNull="true">
+				<reportElement x="236" y="257" width="117" height="20"/>
+				<textElement textAlignment="Center" verticalAlignment="Middle"/>
+				<textFieldExpression class="java.lang.String"><![CDATA[$F{preventativeMaintenanceWorkDone}.hours+":"+$F{preventativeMaintenanceWorkDone}.minutes]]></textFieldExpression>
+			</textField>
+			<textField pattern="###0.00" isBlankWhenNull="true">
+				<reportElement x="236" y="237" width="117" height="20"/>
+				<textElement textAlignment="Center" verticalAlignment="Middle"/>
+				<textFieldExpression class="java.lang.String"><![CDATA[$F{unscheduledBreakinWorkDone}.hours+":"+$F{unscheduledBreakinWorkDone}.minutes]]></textFieldExpression>
 			</textField>
 		</band>
