Index: trunk/grails-app/services/TaskSearchService.groovy
===================================================================
--- trunk/grails-app/services/TaskSearchService.groovy	(revision 489)
+++ trunk/grails-app/services/TaskSearchService.groovy	(revision 490)
@@ -11,4 +11,6 @@
     def dateUtilService
     def messageSource
+
+    def g = new org.codehaus.groovy.grails.plugins.web.taglib.ApplicationTagLib()
 
     def paramsMax = 100000
@@ -317,3 +319,56 @@
             } // createCriteria
     }
-}
+
+    /**
+    * Get work done by person and date.
+    * A person ID and date may be specified in params otherwise the currentUser and today are used.
+    * @param params The request params.
+    * @returns A map containing entries, totalEntries, startOfDay, person, totalHours, totalMinutes.
+    */
+    def getWorkDone(params, locale) {
+        def result = [:]
+        result.person = params.person?.id ? Person.get(params.person.id.toInteger()) : authService.currentUser
+
+        if(params.date_year && params.date_month && params.date_day)
+            result.startOfDay = dateUtilService.makeDate(params.date_year, params.date_month, params.date_day)
+        else
+            result.startOfDay = dateUtilService.today
+
+        result.startOfNextDay = result.startOfDay + 1
+
+        def formattedStartOfDay = g.formatDate(format: "EEE, dd-MMM-yyyy", date: result.startOfDay)
+
+        def getMessage = { Map m ->
+            messageSource.getMessage(m.code, m.args == null ? null : m.args.toArray(), locale)
+        }
+
+        result.entries = Entry.createCriteria().list() {
+            eq("enteredBy", result.person)
+            ge("dateDone", result.startOfDay)
+            lt("dateDone", result.startOfNextDay)
+            entryType {
+                eq("id", 3L)
+            }
+        } // createCriteria
+
+        result.totalEntries = result.entries.size()
+
+        if(result.totalEntries > 0)
+            result.message = getMessage(code:"task.search.text.work.done.message",
+                                                                args:[result.person, formattedStartOfDay])
+        else
+            result.message = getMessage(code:"task.search.text.work.done.none.found",
+                                                                args:[result.person, formattedStartOfDay])
+
+        result.totalHours = 0
+        result.totalMinutes = 0
+        result.entries.each() {
+            result.totalMinutes += (it.durationHour*60) + it.durationMinute
+        }
+        result.totalHours = (result.totalMinutes / 60).toInteger()
+        result.totalMinutes = result.totalMinutes % 60
+
+        return result
+    }
+
+} // end class
