source: trunk/grails-app/controllers/TaskDetailedController.groovy @ 588

Last change on this file since 588 was 588, checked in by gav, 15 years ago

Revert task searchCalendar to displaying tasks, the rest of ticket #66 remains and may be shown on another calendar view at a later date.

File size: 34.7 KB
Line 
1import org.codehaus.groovy.grails.plugins.springsecurity.Secured
2import org.codehaus.groovy.grails.commons.ConfigurationHolder
3import com.zeddware.grails.plugins.filterpane.FilterUtils
4import org.springframework.web.servlet.support.RequestContextUtils as RCU
5
6@Secured(['ROLE_AppAdmin', 'ROLE_Manager', 'ROLE_TaskManager'])
7class TaskDetailedController extends BaseController {
8
9    def authService
10    def taskService
11    def taskSearchService
12    def taskReportService
13    def filterService
14    def exportService
15    def dateUtilService
16
17    // these actions only accept POST requests
18    static allowedMethods = [save:'POST',update:'POST',restore:'POST', trash:'POST',
19                                                approve:'POST', renegeApproval:'POST', complete:'POST',
20                                                reopen:'POST', setAttentionFlag:'POST', clearAttentionFlag:'POST']
21
22    @Secured(['ROLE_AppAdmin', 'ROLE_Manager', 'ROLE_TaskManager', 'ROLE_TaskUser'])
23    def index = { redirect(action: 'search', params: params) }
24
25    @Secured(['ROLE_AppAdmin', 'ROLE_Manager', 'ROLE_TaskManager', 'ROLE_TaskUser'])
26    def setSearchParamsMax = {
27        def max = 1000
28        if(params.newMax.isInteger()) {
29            def i = params.newMax.toInteger()
30            if(i > 0 && i <= max)
31                session.taskSearchParamsMax = params.newMax
32            if(i > max)
33                session.taskSearchParamsMax = max
34        }
35        forward(action: 'search', params: params)
36    }
37
38    @Secured(['ROLE_AppAdmin', 'ROLE_Manager', 'ROLE_TaskManager', 'ROLE_TaskUser'])
39    def setSearchCalendarParamsMax = {
40        def max = 1000
41        if(params.newMax.isInteger()) {
42            def i = params.newMax.toInteger()
43            if(i > 0 && i <= max)
44                session.taskSearchCalendarParamsMax = params.newMax
45            if(i > max)
46                session.taskSearchCalendarParamsMax = max
47        }
48        forward(action: 'searchCalendar', params: params)
49    }
50
51    /**
52    * Search for tasks.
53    */
54    @Secured(['ROLE_AppAdmin', 'ROLE_Manager', 'ROLE_TaskManager', 'ROLE_TaskUser'])
55    def search = {
56
57        if(session.taskSearchParamsMax)
58            params.max = session.taskSearchParamsMax
59
60        // Protect filterPane.
61        params.max = Math.min( params.max ? params.max.toInteger() : 100,  1000 )
62
63        def taskInstanceList = []
64        def taskInstanceTotal
65        def filterParams = com.zeddware.grails.plugins.filterpane.FilterUtils.extractFilterParams(params)
66        def isFilterApplied = FilterUtils.isFilterApplied(params)
67
68        // Restore search unless a new search is being requested.
69        if(!params.quickSearch && !filterParams) {
70            if(session.taskSearchQuickSearch)
71                params.quickSearch = session.taskSearchQuickSearch
72            else if(session.taskSearchFilterParams) {
73                session.taskSearchFilterParams.each() { params[it.key] = it.value }
74                params.filter = session.taskSearchFilter
75                isFilterApplied = FilterUtils.isFilterApplied(params)
76            }
77        }
78
79        // Remember sort if supplied, otherwise try to restore.
80        if(params.sort && params.order) {
81            // Reset to defaultSort if requested.
82            if(params.sort == 'defaultSort') {
83                params.sort = null
84                params.order = null
85                session.removeAttribute("taskSearchSort")
86                session.removeAttribute("taskSearchOrder")
87            }
88            else {
89                session.taskSearchSort = params.sort
90                session.taskSearchOrder = params.order
91            }
92        }
93        else if(session.taskSearchSort && session.taskSearchOrder) {
94            params.sort = session.taskSearchSort
95            params.order = session.taskSearchOrder
96        }
97
98        if(isFilterApplied) {
99            // filterPane:
100            params.sort = params.sort ?: "id"
101            params.order = params.order ?: "desc"
102            if(params.sort == "attentionFlag") // See ticket #64 in Trac.
103                params.sort = "id"
104            // Prevent tasks in the trash being returned unless explicitly requested.
105            if(!params.filter.op.trash) {
106                params.filter.op.trash = "Equal"
107                params.filter.trash = "false"
108            }
109            // Call filterService.
110            taskInstanceList = filterService.filter( params, Task )
111            taskInstanceTotal = filterService.count( params, Task )
112            filterParams = com.zeddware.grails.plugins.filterpane.FilterUtils.extractFilterParams(params)
113            // Remember search.
114            session.taskSearchFilterParams = new LinkedHashMap(filterParams)
115            session.taskSearchFilter = new LinkedHashMap(params.filter)
116            session.removeAttribute("taskSearchQuickSearch")
117        }
118        else {
119            // Quick Search:
120            if(!params.quickSearch) params.quickSearch = "myTodays"
121            def result = taskSearchService.getQuickSearch(params, RCU.getLocale(request))
122            taskInstanceList = result.taskInstanceList
123            taskInstanceTotal = result.taskInstanceList.totalCount
124            params.message = result.message
125            filterParams.quickSearch = result.quickSearch
126            // Remember search.
127            session.removeAttribute("taskSearchFilterParams")
128            session.removeAttribute("taskSearchFilter")
129            session.taskSearchQuickSearch = result.quickSearch
130        }
131
132        // export plugin:
133        if(params?.format && params.format != "html") {
134
135            def dateFmt = { date ->
136                formatDate(format: "EEE, dd-MMM-yyyy", date: date)
137            }
138
139            String title
140            if(params.quickSearch)
141                title = params.message
142            else
143                title = "Filtered tasks."
144
145            response.contentType = ConfigurationHolder.config.grails.mime.types[params.format]
146            response.setHeader("Content-disposition", "attachment; filename=Tasks.${params.extension}")
147            List fields = ["id", "targetStartDate", "description", "leadPerson", "taskPriority", "taskType", "taskStatus"]
148            Map labels = ["id": "ID", "targetStartDate": "Target Start Date", "description": "Description",
149                                    "leadPerson": "Lead Person", "taskPriority": "Task Priority",
150                                    "taskType": "Task Type", "taskStatus": "Task Status"]
151            Map formatters = [ targetStartDate: dateFmt]
152            Map parameters = [title: title, separator: ","]
153
154            exportService.export(params.format, response.outputStream, taskInstanceList, fields, labels, formatters, parameters)
155        }
156
157        // Add some basic params to filterParams.
158        filterParams.max = params.max
159        filterParams.offset = params.offset?.toInteger() ?: 0
160        filterParams.sort = params.sort ?: "id"
161        filterParams.order = params.order ?: "desc"
162
163        // Get some associatedProperty values for filterpane.
164        def associatedPropertyValues = [:]
165        def associatedPropertyMax = 10000
166        associatedPropertyValues.taskPriorityList = TaskPriority.findAllByIsActive(true, [max:associatedPropertyMax, sort:'name'])
167        def lastNameQuery = 'select distinct p.lastName from Person p where p.isActive = ? order by p.lastName'
168        associatedPropertyValues.lastNameList = Person.executeQuery(lastNameQuery, [true], [max:associatedPropertyMax])
169        def firstNameQuery = 'select distinct p.firstName from Person p where p.isActive = ? order by p.firstName'
170        associatedPropertyValues.firstNameList = Person.executeQuery(firstNameQuery, [true], [max:associatedPropertyMax])
171        associatedPropertyValues.taskGroupList = TaskGroup.findAllByIsActive(true, [max:associatedPropertyMax, sort:'name'])
172        associatedPropertyValues.assetList = Asset.findAllByIsActive(true, [max:associatedPropertyMax, sort:'name'])
173        associatedPropertyValues.taskStatusList = TaskStatus.findAllByIsActive(true, [max:associatedPropertyMax, sort:'name'])
174        associatedPropertyValues.taskTypeList = TaskType.findAllByIsActive(true, [max:associatedPropertyMax, sort:'name'])
175        def startOfYearRange = dateUtilService.getYearFromDate(dateUtilService.plusYear(new Date(), -10))
176        def endOfYearRange = dateUtilService.getYearFromDate(dateUtilService.plusYear(new Date(), 10))
177        associatedPropertyValues.yearRange = startOfYearRange..endOfYearRange
178
179        return[ taskInstanceList: taskInstanceList,
180                        taskInstanceTotal: taskInstanceTotal,
181                        filterParams: filterParams,
182                        params: params,
183                        associatedPropertyValues: associatedPropertyValues ]
184
185    } // search
186
187    @Secured(['ROLE_AppAdmin', 'ROLE_Manager', 'ROLE_TaskManager', 'ROLE_TaskUser'])
188    def searchCalendar = {
189
190        // No pagination for calendar.
191        params.offset = 0
192
193        // Restore params.max
194        if(session.taskSearchCalendarParamsMax)
195            params.max = session.taskSearchCalendarParamsMax
196
197        // Protect filterPane.
198        params.max = Math.min( params.max ? params.max.toInteger() : 100,  1000 )
199
200        def displayList = []
201        def taskInstanceList = []
202        def taskInstanceTotal
203        def filterParams = com.zeddware.grails.plugins.filterpane.FilterUtils.extractFilterParams(params)
204        def isFilterApplied = FilterUtils.isFilterApplied(params)
205
206        // Restore search unless a new search is being requested.
207        if(!params.quickSearch && !filterParams) {
208            if(session.taskSearchCalendarQuickSearch)
209                params.quickSearch = session.taskSearchCalendarQuickSearch
210            else if(session.taskSearchCalendarFilterParams) {
211                session.taskSearchCalendarFilterParams.each() { params[it.key] = it.value }
212                params.filter = session.taskSearchCalendarFilter
213                isFilterApplied = FilterUtils.isFilterApplied(params)
214            }
215        }
216
217        // The date the calendar will use to determine the month to show.
218        // Use session, if not specified in params, otherwise use today.
219        def showDate = new Date()
220        if(params.showMonth) {
221            if(params.showYear)
222                showDate = dateUtilService.makeDate(params.showYear, params.showMonth)
223            else
224                showDate = dateUtilService.makeDate(dateUtilService.getYearFromDate(showDate), params.showMonth)
225            // Remember the showDate.
226            session.taskSearchCalendarShowDate = showDate
227        }
228        else if(session.taskSearchCalendarShowDate)
229            showDate = session.taskSearchCalendarShowDate
230
231        // Get the dates for the calendar month controls.
232        def calendarMonthControls = getCalendarMonthControls(showDate)
233
234        if(isFilterApplied) {
235            // filterPane:
236            if(params.sort == "attentionFlag") // See ticket #64 in Trac.
237                params.sort = "id"
238            // Prevent tasks in the trash being returned unless explicitly requested.
239            if(!params.filter.op.trash) {
240                params.filter.op.trash = "Equal"
241                params.filter.trash = "false"
242            }
243            // Call filterService.
244            taskInstanceList = filterService.filter( params, Task )
245            taskInstanceTotal = filterService.count( params, Task )
246            filterParams = com.zeddware.grails.plugins.filterpane.FilterUtils.extractFilterParams(params)
247            // Remember search.
248            session.taskSearchCalendarFilterParams = new LinkedHashMap(filterParams)
249            session.taskSearchCalendarFilter = new LinkedHashMap(params.filter)
250            session.removeAttribute("taskSearchCalendarQuickSearch")
251        }
252        else {
253            // Quick Search:
254            def result = taskSearchService.getQuickSearch(params, RCU.getLocale(request))
255            taskInstanceList = result.taskInstanceList
256            taskInstanceTotal = result.taskInstanceList.totalCount
257            params.message = result.message
258            filterParams.quickSearch = result.quickSearch
259            // Remember search.
260            session.removeAttribute("taskSearchCalendarFilterParams")
261            session.removeAttribute("taskSearchCalendarFilter")
262            session.taskSearchCalendarQuickSearch = result.quickSearch
263        }
264
265//         displayList = taskReportService.getWorkLoadSummary(
266//                                     [taskInstanceList: taskInstanceList], RCU.getLocale(request)
267//                                 ).displayList
268
269        // export plugin:
270        if(params?.format && params.format != "html") {
271
272            def dateFmt = { date ->
273                formatDate(format: "EEE, dd-MMM-yyyy", date: date)
274            }
275
276            String title
277            if(params.quickSearch)
278                title = params.message
279            else
280                title = "Filtered tasks."
281
282            response.contentType = ConfigurationHolder.config.grails.mime.types[params.format]
283            response.setHeader("Content-disposition", "attachment; filename=Tasks.${params.extension}")
284            List fields = ["id", "targetStartDate", "description", "leadPerson", "taskPriority", "taskType", "taskStatus"]
285            Map labels = ["id": "ID", "targetStartDate": "Target Start Date", "description": "Description",
286                                    "leadPerson": "Lead Person", "taskPriority": "Task Priority",
287                                    "taskType": "Task Type", "taskStatus": "Task Status"]
288            Map formatters = [ targetStartDate: dateFmt]
289            Map parameters = [title: title, separator: ","]
290
291            exportService.export(params.format, response.outputStream, taskInstanceList, fields, labels, formatters, parameters)
292        }
293
294        if(taskInstanceTotal > params.max)
295            params.errorMessage = g.message(code:"task.search.calendar.text.too.many.results", args:[params.max])
296
297        // Add some basic params to filterParams.
298        filterParams.max = params.max
299        filterParams.offset = params.offset?.toInteger() ?: 0
300
301        return[taskInstanceList: taskInstanceList,
302                        taskInstanceTotal: taskInstanceTotal,
303                        filterParams: filterParams,
304                        params: params,
305                        showDate: showDate,
306                        today: calendarMonthControls.today,
307                        previousMonth: calendarMonthControls.previousMonth,
308                        nextMonth: calendarMonthControls.nextMonth,
309                        previousYear: calendarMonthControls.previousYear,
310                        nextYear: calendarMonthControls.nextYear]
311
312    } // searchCalendar
313
314    @Secured(['ROLE_AppAdmin', 'ROLE_Manager', 'ROLE_TaskManager', 'ROLE_TaskUser'])
315    def show = {
316
317        // In the case of an actionSubmit button, rewrite action name from 'index'.
318        if(params._action_Show)
319            params.action='show'
320
321        // Used by navigation.
322        if(params.id == 'nav') {
323            params.id = session.currentTaskId ?: null
324            redirect(action: show, id: params.id)
325            return
326        }
327
328        def showTab = [:]
329        switch (params.showTab) {
330            case "showProcedureTab":
331                showTab.procedure =  new String("true")
332                break
333            case "showRecurrenceTab":
334                showTab.recurrence =  new String("true")
335                break
336            case "showInventoryTab":
337                showTab.inventory = new String("true")
338                break
339            case "showSubTasksTab":
340                showTab.subTasks = new String("true")
341                break
342            default:
343                showTab.task = new String("true")
344        }
345
346        def taskInstance = Task.get( params.id )
347
348        if(!taskInstance) {
349            flash.message = "Task not found with id ${params.id}"
350            redirect(action: 'search')
351        }
352        else {
353            // Remember the current task id for use with navigation.
354            session.currentTaskId = params.id
355
356            params.max = 10
357            params.order = "desc"
358            params.sort = "id"
359
360            def entryFaultList = Entry.withCriteria {
361                                                                eq("entryType", EntryType.get(1))
362                                                                eq("task", taskInstance)
363                                                        }
364
365            def entryCauseList = Entry.withCriteria {
366                                                                eq("entryType", EntryType.get(2))
367                                                                eq("task", taskInstance)
368                                                        }
369
370            def entryWorkDoneList = Entry.withCriteria {
371                                                                eq("entryType", EntryType.get(3))
372                                                                eq("task", taskInstance)
373                                                        }
374
375            def subTaskInstanceList = Task.findAllByParentTaskAndTrash(taskInstance, false, params)
376            def subTaskInstanceTotal = Task.countByParentTaskAndTrash(taskInstance, false)
377
378            def inventoryMovementList = InventoryMovement.findAllByTask(taskInstance, [max:100, sort:"id", order:"desc", offset:0])
379
380            def taskModificationList = TaskModification.findAllByTask(taskInstance, [max:100, sort:"id", order:"asc", offset:0])
381
382            def assignedGroupList = taskInstance.assignedGroups.sort { p1, p2 -> p1.personGroup.name.compareToIgnoreCase(p2.personGroup.name) }
383            def assignedPersonList = taskInstance.assignedPersons.sort { p1, p2 -> p1.person.firstName.compareToIgnoreCase(p2.person.firstName) }
384
385            def taskProcedureInstance = TaskProcedure.get(taskInstance.taskProcedure?.id)
386            def taskProcedureExits = new Boolean("true")
387            if(!taskProcedureInstance) {
388                taskProcedureExits = false
389            }
390
391            params.order = "asc"
392            params.sort = "procedureStepNumber"
393            def maintenanceActionList = MaintenanceAction.findAllByTaskProcedure(taskProcedureInstance, params)
394
395            def taskRecurringScheduleInstance = TaskRecurringSchedule.get(taskInstance.taskRecurringSchedule?.id)
396            def taskRecurringScheduleExits= new Boolean("true")
397            if(!taskRecurringScheduleInstance) {
398                taskRecurringScheduleExits = false
399            }
400
401            return [ taskInstance: taskInstance,
402                            entryFaultList: entryFaultList,
403                            entryCauseList: entryCauseList,
404                            entryWorkDoneList: entryWorkDoneList,
405                            taskProcedureInstance: taskProcedureInstance,
406                            taskProcedureExits: taskProcedureExits,
407                            showTab: showTab,
408                            subTaskInstanceList: subTaskInstanceList,
409                            subTaskInstanceTotal: subTaskInstanceTotal,
410                            subTaskInstanceMax: params.max,
411                            maintenanceActionList: maintenanceActionList,
412                            taskRecurringScheduleInstance: taskRecurringScheduleInstance,
413                            taskRecurringScheduleExits: taskRecurringScheduleExits,
414                            inventoryMovementList: inventoryMovementList,
415                            taskModificationList: taskModificationList,
416                            assignedGroupList: assignedGroupList,
417                            assignedPersonList: assignedPersonList]
418        }
419    }
420
421    @Secured(['ROLE_AppAdmin', 'ROLE_Manager', 'ROLE_TaskManager', 'ROLE_TaskUser'])
422    def restore = {
423
424        def result = taskService.restore(params)
425
426        if(!result.error) {
427                flash.message = "Task ${params.id} has been restored."
428                redirect(action: show, id: params.id)
429                return
430        }
431
432        flash.errorMessage = g.message(code: result.error.code, args: result.error.args)
433
434        if(result.taskInstance)
435            redirect(action: show, id: params.id)
436        else
437            redirect(action: 'search')
438
439    }
440
441    @Secured(['ROLE_AppAdmin', 'ROLE_Manager', 'ROLE_TaskManager', 'ROLE_TaskUser'])
442    def trash = {
443
444        def result = taskService.trash(params)
445
446        if(!result.error) {
447                flash.message = "Task ${params.id} has been moved to trash."
448                redirect(action: 'search')
449                return
450        }
451
452        flash.errorMessage = g.message(code: result.error.code, args: result.error.args)
453
454        if(result.taskInstance)
455            redirect(action: show, id: params.id)
456        else
457            redirect(action: 'search')
458
459    }
460
461    @Secured(['ROLE_AppAdmin', 'ROLE_Manager', 'ROLE_TaskManager'])
462    def approve = {
463
464        def result = taskService.approve(params)
465
466        if(!result.error) {
467                flash.message = "Task ${params.id} has been approved."
468                redirect(action: show, id: params.id)
469                return
470        }
471
472        flash.errorMessage = g.message(code: result.error.code, args: result.error.args)
473
474        if(result.taskInstance)
475            redirect(action: show, id: params.id)
476        else
477            redirect(action: 'search')
478
479    }
480
481    @Secured(['ROLE_AppAdmin', 'ROLE_Manager', 'ROLE_TaskManager'])
482    def renegeApproval = {
483
484        def result = taskService.renegeApproval(params)
485
486        if(!result.error) {
487                flash.message = "Task ${params.id} has had approval removed."
488                redirect(action: show, id: params.id)
489                return
490        }
491
492        flash.errorMessage = g.message(code: result.error.code, args: result.error.args)
493
494        if(result.taskInstance)
495            redirect(action: show, id: params.id)
496        else
497            redirect(action: 'search')
498
499    }
500
501    @Secured(['ROLE_AppAdmin', 'ROLE_Manager', 'ROLE_TaskManager', 'ROLE_TaskUser'])
502    def complete = {
503
504        def result = taskService.complete(params)
505
506        if(!result.error) {
507                flash.message = "Task ${params.id} has been completed."
508                redirect(action: show, id: params.id)
509                return
510        }
511
512        flash.errorMessage = g.message(code: result.error.code, args: result.error.args)
513
514        if(result.taskInstance)
515            redirect(action: show, id: params.id)
516        else
517            redirect(action: 'search')
518
519    }
520
521    @Secured(['ROLE_AppAdmin', 'ROLE_Manager', 'ROLE_TaskManager', 'ROLE_TaskUser'])
522    def setAttentionFlag = {
523
524        def result = taskService.setAttentionFlag(params)
525
526        if(!result.error) {
527                flash.message = "Task ${params.id} has been flagged for attention."
528                redirect(action: show, id: params.id)
529                return
530        }
531
532        flash.errorMessage = g.message(code: result.error.code, args: result.error.args)
533
534        if(result.taskInstance)
535            redirect(action: show, id: params.id)
536        else
537            redirect(action: 'search')
538
539    }
540
541    @Secured(['ROLE_AppAdmin', 'ROLE_Manager', 'ROLE_TaskManager', 'ROLE_TaskUser'])
542    def clearAttentionFlag = {
543
544        def result = taskService.clearAttentionFlag(params)
545
546        if(!result.error) {
547                flash.message = "Task ${params.id} attention flag cleared."
548                redirect(action: show, id: params.id)
549                return
550        }
551
552        flash.errorMessage = g.message(code: result.error.code, args: result.error.args)
553
554        if(result.taskInstance)
555            redirect(action: show, id: params.id)
556        else
557            redirect(action: 'search')
558
559    }
560
561    @Secured(['ROLE_AppAdmin', 'ROLE_Manager', 'ROLE_TaskManager', 'ROLE_TaskUser'])
562    def reopen = {
563
564        def result = taskService.reopen(params)
565
566        if(!result.error) {
567                flash.message = "Task ${params.id} has been reopened."
568                redirect(action: show, id: params.id)
569                return
570        }
571
572        flash.errorMessage = g.message(code: result.error.code, args: result.error.args)
573
574        if(result.taskInstance)
575            redirect(action: show, id: params.id)
576        else
577            redirect(action: 'search')
578
579    }
580
581    @Secured(['ROLE_AppAdmin', 'ROLE_Manager', 'ROLE_TaskManager', 'ROLE_TaskUser'])
582    def edit = {
583
584        // In the case of an actionSubmit button, rewrite action name from 'index'.
585        if(params._action_Edit)
586            params.action='edit'
587
588        // Used by navigation.
589        if(params.id == 'nav') {
590            params.id = session.currentTaskId ?: null
591            redirect(action: edit, id: params.id)
592            return
593        }
594
595        def taskInstance = Task.get( params.id )
596
597        if(!taskInstance) {
598            flash.message = "Task not found with id ${params.id}"
599            redirect(action: 'search')
600        }
601        else {
602            // Remember the current task id for use with navigation.
603            session.currentTaskId = params.id
604
605            if(taskInstance.trash) {
606                flash.message = "You may not edit tasks that are in the trash."
607                redirect(action: 'show', id: taskInstance.id)
608                return
609            }
610//             def possibleParentList = taskService.possibleParentList(taskInstance)
611//             return [ taskInstance : taskInstance, possibleParentList: possibleParentList ]
612            return [ taskInstance : taskInstance ]
613        }
614    }
615
616    @Secured(['ROLE_AppAdmin', 'ROLE_Manager', 'ROLE_TaskManager', 'ROLE_TaskUser'])
617    def update = {
618
619        def result = taskService.update(params)
620
621        if(!result.error) {
622                flash.message = "Task ${params.id} updated"
623                redirect(action: show, id: params.id)
624                return
625        }
626
627        if(result.error.code == "task.modifications.failedToSave")
628            flash.errorMessage = g.message(code: result.error.code, args: result.error.args)
629
630        render(view:'edit',model:[taskInstance:result.taskInstance.attach()])
631
632    }
633
634    /**
635    * The create action is used to create scheduled types of tasks.
636    */
637    @Secured(['ROLE_AppAdmin', 'ROLE_Manager', 'ROLE_TaskManager'])
638    def create = {
639        def taskInstance = new Task()
640
641        // Set the targetStartDate if specified, used by searchCalendar view.
642        if(params.year && params.month && params.day) {
643            def date = dateUtilService.makeDate(params.year, params.month, params.day)
644            taskInstance.targetStartDate = date
645            taskInstance.targetCompletionDate = date
646        }
647
648        // Default leadPerson to current user, unless supplied in params.
649        taskInstance.leadPerson = authService.currentUser
650
651        // Apply params, overiding anything above.
652        taskInstance.properties = params
653
654        def scheduledTaskTypes = taskService.scheduledTaskTypes
655        def scheduledTaskPriorities = taskService.scheduledTaskPriorities
656        taskInstance.taskPriority = scheduledTaskPriorities.default
657        return ['taskInstance': taskInstance,
658                    'scheduledTaskTypes': scheduledTaskTypes,
659                    'scheduledTaskPriorities': scheduledTaskPriorities.list]
660    }
661
662    @Secured(['ROLE_AppAdmin', 'ROLE_Manager', 'ROLE_TaskManager', 'ROLE_TaskUser'])
663    def save = {
664        def result = taskService.save(params)
665
666        if(!result.error) {
667            flash.message = "Task ${result.taskInstance.id} created."
668            redirect(action: 'show', id: result.taskInstance.id)
669            return
670        }
671
672        if(result.error.code == "task.modifications.failedToSave")
673            flash.errorMessage = g.message(code: result.error.code, args: result.error.args)
674
675
676        def scheduledTaskTypes = taskService.scheduledTaskTypes
677        def scheduledTaskPriorities = taskService.scheduledTaskPriorities
678        render(view:'create', model:[taskInstance:result.taskInstance,
679                                                    'scheduledTaskTypes': scheduledTaskTypes,
680                                                    'scheduledTaskPriorities': scheduledTaskPriorities.list])
681    }
682
683    @Secured(['ROLE_AppAdmin', 'ROLE_Manager', 'ROLE_TaskManager', 'ROLE_TaskUser'])
684    def listSubTasks = {
685        def parentTaskInstance = Task.get(params.id)
686
687        if(!parentTaskInstance) {
688            flash.message = "Task not found with id ${params.id}"
689            redirect(action: 'search')
690        }
691        else {
692        params.max = Math.min( params.max ? params.max.toInteger() : 10,  100)
693        def subTaskInstanceList = Task.findAllByParentTaskAndTrash(parentTaskInstance, false, params)
694        def subTaskInstanceTotal = Task.countByParentTaskAndTrash(parentTaskInstance, false)
695
696        [ taskInstanceList: subTaskInstanceList,
697            taskInstanceTotal:  subTaskInstanceTotal,
698            parentTaskInstance: parentTaskInstance]
699        }
700    }
701
702    @Secured(['ROLE_AppAdmin', 'ROLE_Manager', 'ROLE_TaskManager', 'ROLE_TaskUser'])
703    def createSubTask = {
704        def parentTaskInstance = Task.get(params.id)
705
706        if(parentTaskInstance) {
707
708            def result = taskService.createSubTask(parentTaskInstance)
709            if(!result.error) {
710                flash.message = "Sub Task ${result.taskInstance.id} created, please edit and update to your requirements."
711                redirect(action: 'edit', id: result.taskInstance.id)
712            }
713            else {
714                if(result.taskInstance.errors.hasFieldErrors("parentTask")) {
715                    flash.errorMessage = g.message(code:"task.operationNotPermittedOnTaskInTrash")
716                    redirect(action: 'show', id:  parentTaskInstance.id)
717                }
718                else {
719                    render(view: 'create', model:[taskInstance: result.taskInstance])
720                }
721            }
722        }
723
724        else {
725            flash.message = "Task not found with id ${params.id}"
726            redirect(action: 'search')
727        }
728    }
729
730    @Secured(['ROLE_AppAdmin', 'ROLE_Manager', 'ROLE_TaskManager', 'ROLE_TaskUser'])
731    def createUnscheduled = {
732        def taskInstance = new Task()
733
734        // Default leadPerson to current user, unless supplied in params.
735        taskInstance.leadPerson = authService.currentUser
736        taskInstance.properties = params
737
738        // Always for Unscheduled task.
739        taskInstance.taskType = TaskType.get(2) // Unscheduled Breakin.
740        def unscheduledTaskPriorities = taskService.unscheduledTaskPriorities
741        taskInstance.taskPriority = unscheduledTaskPriorities.default
742
743        return ['taskInstance': taskInstance, 'unscheduledTaskPriorities': unscheduledTaskPriorities.list]
744    }
745
746    @Secured(['ROLE_AppAdmin', 'ROLE_Manager', 'ROLE_TaskManager', 'ROLE_TaskUser'])
747    def saveUnscheduled = {
748        def result = taskService.saveUnscheduled(params)
749
750        if(!result.error) {
751            flash.message = "Task ${result.taskInstance.id} created."
752            redirect(action: 'show', id: result.taskInstance.id)
753            return
754        }
755
756        if(result.error.code == "task.modifications.failedToSave")
757            flash.errorMessage = g.message(code: result.error.code, args: result.error.args)
758
759        def unscheduledTaskPriorities = taskService.unscheduledTaskPriorities
760
761        render(view:'createUnscheduled',
762                    model: ['taskInstance': result.taskInstance, 'unscheduledTaskPriorities': unscheduledTaskPriorities.list])
763    }
764
765    @Secured(['ROLE_AppAdmin', 'ROLE_Manager', 'ROLE_TaskManager', 'ROLE_TaskUser'])
766    def createImmediateCallout = {
767        def taskInstance = new Task()
768
769        def entryFaultInstance = new Entry(entryType: EntryType.get(1))  // Fault.
770        def entryCauseInstance = new Entry(entryType: EntryType.get(2))  // Cause.
771        def entryWorkDoneInstance = new Entry(entryType: EntryType.get(3))  // Work Done.
772
773        return ['taskInstance': taskInstance,
774                        'entryFaultInstance': entryFaultInstance,
775                        'entryCauseInstance': entryCauseInstance,
776                        'entryWorkDoneInstance': entryWorkDoneInstance]
777    }
778
779    @Secured(['ROLE_AppAdmin', 'ROLE_Manager', 'ROLE_TaskManager', 'ROLE_TaskUser'])
780    def saveImmediateCallout = {
781        def result = taskService.saveImmediateCallout(params)
782
783        if(!result.error) {
784            flash.message = "Task ${result.taskInstance.id} created."
785            redirect(action: 'show', id: result.taskInstance.id)
786            return
787        }
788
789        if(result.error.code == "task.modifications.failedToSave")
790            flash.errorMessage = g.message(code: result.error.code, args: result.error.args)
791
792        render(view:'createImmediateCallout',
793                    model: ['taskInstance': result.taskInstance,
794                                'entryFaultInstance': result.entryFaultInstance,
795                                'entryCauseInstance': result.entryCauseInstance,
796                                'entryWorkDoneInstance': result.entryWorkDoneInstance])
797
798    }
799
800    /**
801    * Render a users total work done hours.
802    */
803    @Secured(['ROLE_AppAdmin', 'ROLE_Manager', 'ROLE_TaskManager', 'ROLE_TaskUser'])
804    def workDone = {
805        def result = taskSearchService.getWorkDone(params, RCU.getLocale(request))
806
807        params.message = result.message
808
809        return[entries: result.entries,
810                    totalEntries : result.totalEntries,
811                    startOfDay: result.startOfDay,
812                    person: result.person,
813                    totalHours: result.totalHours,
814                    totalMinutes: result.totalMinutes]
815    } // workDone
816
817    /**
818    * Get some integers for use by the month control links.
819    */
820    private getCalendarMonthControls(Date showDate) {
821        def result = [:]
822        result.today = [:]
823        result.today.date = new Date()
824        result.today.month = dateUtilService.getMonthFromDate(result.today.date)
825        result.today.year = dateUtilService.getYearFromDate(result.today.date)
826        result.nextMonth = [:]
827        result.nextMonth.date = dateUtilService.plusMonth(showDate)
828        result.nextMonth.month = dateUtilService.getMonthFromDate(result.nextMonth.date)
829        result.nextMonth.year = dateUtilService.getYearFromDate(result.nextMonth.date)
830        result.previousMonth =  [:]
831        result.previousMonth.date = dateUtilService.plusMonth(showDate, -1)
832        result.previousMonth.month = dateUtilService.getMonthFromDate(result.previousMonth.date)
833        result.previousMonth.year = dateUtilService.getYearFromDate(result.previousMonth.date)
834        result.nextYear = [:]
835        result.nextYear.date = dateUtilService.plusYear(showDate)
836        result.nextYear.month = dateUtilService.getMonthFromDate(result.nextYear.date)
837        result.nextYear.year = dateUtilService.getYearFromDate(result.nextYear.date)
838        result.previousYear = [:]
839        result.previousYear.date = dateUtilService.plusYear(showDate, -1)
840        result.previousYear.month = dateUtilService.getMonthFromDate(result.previousYear.date)
841        result.previousYear.year = dateUtilService.getYearFromDate(result.previousYear.date)
842        return result
843    }
844
845} // end of class.
Note: See TracBrowser for help on using the repository browser.