Index: trunk/grails-app/controllers/ReportController.groovy
===================================================================
--- trunk/grails-app/controllers/ReportController.groovy	(revision 538)
+++ trunk/grails-app/controllers/ReportController.groovy	(revision 542)
@@ -66,6 +66,27 @@
     }
 
-    def test = {
-        render taskReportService.getReactiveRatio(params, RCU.getLocale(request))
+    def immediateCallouts = {
+
+        params.reportTitle = "Immediate Callouts"
+        params.logoUrl = grailsApplication.mainContext.getResource('images/logo.png').getURL()
+        params.currentUser = authService.currentUser
+
+        if(params.startDate == 'struct')
+            params.startDate = dateUtilService.makeDate(params.startDate_year, params.startDate_month, params.startDate_day)
+        else
+            params.startDate = dateUtilService.today-7
+        params.startDateString = g.formatDate(format: "EEE, dd-MMM-yyyy", date: params.startDate)
+
+        if(params.endDate == 'struct')
+            params.endDate = dateUtilService.makeDate(params.endDate_year, params.endDate_month, params.endDate_day)
+        else
+            params.endDate = dateUtilService.today
+        params.endDateString = g.formatDate(format: "EEE, dd-MMM-yyyy", date: params.endDate)
+
+        def dataModel = [taskReportService.getImmediateCallouts(params, RCU.getLocale(request))]
+
+//         render dataModel
+        chain(controller:'jasper', action:'index', model:[data: dataModel], params:params)
+
     }
 
Index: trunk/grails-app/services/TaskReportService.groovy
===================================================================
--- trunk/grails-app/services/TaskReportService.groovy	(revision 538)
+++ trunk/grails-app/services/TaskReportService.groovy	(revision 542)
@@ -10,4 +10,5 @@
     def authService
     def dateUtilService
+    def sessionFactory
 //     def messageSource
 
@@ -18,5 +19,5 @@
     /**
     * Selects and returns the reactive ratio.
-    * @param params The request params, may contain param to specify the search.
+    * @param params The request params, may contain params to specify the search.
     * @param locale The locale to use when generating result.message.
     */
@@ -34,14 +35,14 @@
 
         result.taskQuery = "from Task as task \
-                                        where (task.trash = false \
-                                                    and task.taskStatus != :notStarted \
-                                                    and task.targetStartDate < :endDate \
-                                                    and task.targetStartDate >= :startDate \
-                                                    and ( \
-                                                        task.taskType = :immediateCallout \
-                                                        or task.taskType = :unscheduledBreakin \
-                                                        or task.taskType = :preventativeMaintenance \
-                                                    ) \
-                                        )"
+                                            where (task.trash = false \
+                                                        and task.taskStatus != :notStarted \
+                                                        and task.targetStartDate < :endDate \
+                                                        and task.targetStartDate >= :startDate \
+                                                        and ( \
+                                                            task.taskType = :immediateCallout \
+                                                            or task.taskType = :unscheduledBreakin \
+                                                            or task.taskType = :preventativeMaintenance \
+                                                        ) \
+                                            )"
 
         result.taskQuery = "select distinct task " + result.taskQuery
@@ -55,4 +56,5 @@
         result.preventativeMaintenanceCount = 0
 
+        // Summary Of Calculations.
         result.summaryOfCalculationMethod = 'HQL query: \n\n'
         def tempStringArray = result.taskQuery.split('    ')
@@ -148,5 +150,88 @@
         return result
 
-    } // getQuickSearch
+    } // getReactiveRatio
+
+    /**
+    * Selects and returns Immediate Callouts, grouped by Asset.
+    * @param params The request params, may contain params to specify the search.
+    * @param locale The locale to use when generating result.message.
+    */
+    def getImmediateCallouts(params, locale) {
+        def result = [:]
+
+        def namedParams = [:]
+        namedParams.startDate = params.startDate ?: dateUtilService.today
+        namedParams.endDatePlusOne = (params.endDate ?: dateUtilService.today)+1
+        namedParams.immediateCallout = TaskType.read(1)
+
+        result.taskQuery = "from Task as task \
+                                            where (task.trash = false \
+                                                        and task.targetStartDate < :endDatePlusOne \
+                                                        and task.targetStartDate >= :startDate \
+                                                        and task.taskType = :immediateCallout \
+                                                        ) \
+                                            )"
+
+        result.taskQuery = "select distinct task " + result.taskQuery
+        result.taskList = Task.executeQuery(result.taskQuery, namedParams)
+        result.taskCount = result.taskList.size()
+
+        // Assets on Tasks Count.
+        result.totalAssetsOnTasksCount = 0
+        result.assetList = []
+
+        // Add or update asset details in assetList.
+        def addAssetToList = { asset, task ->
+
+            def downTime = 0
+            def faultEntries = Entry.findAllByTaskAndEntryType(task, EntryType.read(1))
+            faultEntries.each() { downTime += (it.durationHour*60 + it.durationMinute) }
+
+            def assetDetails = result.assetList.find { it.id == asset.id }
+            if(assetDetails) {
+                assetDetails.immediateCalloutCount++
+                assetDetails.immediateCalloutTaskList.add(task.toString())
+            }
+            else {
+                assetDetails = [id: asset.id,
+                                            name: asset.name,
+                                            immediateCalloutCount: 1,
+                                            downTime: downTime,
+                                            immediateCalloutTaskList: [task.toString()]]
+
+                result.assetList << assetDetails
+            }
+        } // addAssetToList
+
+        // Summary Of Calculations.
+        result.summaryOfCalculationMethod = 'HQL query: \n\n'
+        def tempStringArray = result.taskQuery.split('    ')
+        tempStringArray.each() {
+            if(it != '') result.summaryOfCalculationMethod += it +'\n'
+        }
+        result.summaryOfCalculationMethod += '\n'+'Calculations: '+'\n\n'
+
+        result.summaryOfCalculationMethod += 'totalAssetsOnTasksCount = A count of unique assets on each task. \n'
+        result.taskList.each() { task ->
+            if(task.primaryAsset) {
+                result.totalAssetsOnTasksCount++
+                addAssetToList(task.primaryAsset, task)
+            }
+            task.associatedAssets.each() { associatedAsset ->
+                if(associatedAsset.id != task.primaryAsset?.id) {
+                    result.totalAssetsOnTasksCount++
+                    addAssetToList(associatedAsset, task)
+                }
+            }
+
+        } // each() task
+
+        // Sort by callout count.
+        result.assetList.sort {a, b -> b.immediateCalloutCount.compareTo(a.immediateCalloutCount)}
+
+        // Success.
+        return result
+
+    } // getImmediateCallouts()
 
 
Index: trunk/grails-app/views/appCore/start.gsp
===================================================================
--- trunk/grails-app/views/appCore/start.gsp	(revision 538)
+++ trunk/grails-app/views/appCore/start.gsp	(revision 542)
@@ -113,4 +113,14 @@
                                             <br />
                                             <g:jasperReport controller="report"
+                                                                            action="immediateCallouts"
+                                                                            jasper="immediateCallouts"
+                                                                            name="Immediate Callouts"
+                                                                            format="PDF, XLS">
+                                                <richui:dateChooser name="startDate" format="dd-MM-yyyy" value="${new Date()-7}" />
+                                                to
+                                                <richui:dateChooser name="endDate" format="dd-MM-yyyy" value="${new Date()}" />
+                                            </g:jasperReport>
+                                            <br />
+                                            <g:jasperReport controller="report"
                                                                             action="templatePortrait"
                                                                             jasper="templatePortrait"
