Changeset 180


Ignore:
Timestamp:
Nov 4, 2009, 2:47:47 PM (14 years ago)
Author:
gav
Message:

Add support for taskModification audit/change log, the create and update modifications are complete.
Moved create and update of tasks to taskService.
Small Assset domain class adjustment to prevent blank asset name.
Removed "static scope = 'request'" from services since I don't believe it is required and it limits where the service may be used.

Location:
trunk/grails-app
Files:
10 edited

Legend:

Unmodified
Added
Removed
  • trunk/grails-app/controllers/TaskDetailedController.groovy

    r179 r180  
    66    def authenticateService
    77    def dateUtilService
     8    def taskService
    89    def taskSearchService
    910    def filterService
     
    186187
    187188            def inventoryMovementList = InventoryMovement.findAllByTask(taskInstance, [max:100, sort:"id", order:"desc", offset:0])
     189
     190            def taskModificationList = TaskModification.findAllByTask(taskInstance, [max:100, sort:"id", order:"asc", offset:0])
    188191
    189192            def taskProcedureInstance = TaskProcedure.get(taskInstance.taskProcedure?.id)
     
    215218                            taskRecurringScheduleInstance: taskRecurringScheduleInstance,
    216219                            taskRecurringScheduleExits: taskRecurringScheduleExits,
    217                             inventoryMovementList: inventoryMovementList]
     220                            inventoryMovementList: inventoryMovementList,
     221                            taskModificationList: taskModificationList]
    218222        }
    219223    }
     
    263267
    264268    def update = {
    265         def taskInstance = Task.get( params.id )
    266         if(taskInstance) {
    267             if(params.version) {
    268                 def version = params.version.toLong()
    269                 if(taskInstance.version > version) {
    270 
    271                     taskInstance.errors.rejectValue("version", "task.optimistic.locking.failure", "Another user has updated this Task while you were editing.")
    272                     render(view:'edit',model:[taskInstance:taskInstance])
    273                     return
    274                 }
    275             }
    276             taskInstance.properties = params
    277             if(!taskInstance.hasErrors() && taskInstance.save(flush: true)) {
     269
     270        if(!Task.exists(params.id)) {
     271            flash.message = "Task not found with id ${params.id}"
     272            redirect(action:'search')
     273        }
     274
     275        def result = taskService.update(params)
     276
     277        if(!result.error) {
    278278                flash.message = "Task ${params.id} updated"
    279                 redirect(action:show,id:taskInstance.id)
    280             }
    281             else {
    282                 render(view:'edit',model:[taskInstance:taskInstance])
    283             }
    284         }
    285         else {
    286             flash.message = "Task not found with id ${params.id}"
    287             redirect(action:edit,id:params.id)
    288         }
    289     }
     279                redirect(action:show,id:result.taskInstance.id)
     280        }
     281        else {
     282            if(result.taskInstance) {
     283                render(view:'edit',model:[taskInstance:result.taskInstance])
     284            }
     285            else {
     286                flash.message = "Task could not be updated."
     287                redirect(action:'search')
     288            }
     289        }
     290
     291    }
     292
     293//     def update = {
     294//         def taskInstance = Task.get( params.id )
     295//         if(taskInstance) {
     296//             if(params.version) {
     297//                 def version = params.version.toLong()
     298//                 if(taskInstance.version > version) {
     299//
     300//                     taskInstance.errors.rejectValue("version", "task.optimistic.locking.failure", "Another user has updated this Task while you were editing.")
     301//                     render(view:'edit',model:[taskInstance:taskInstance])
     302//                     return
     303//                 }
     304//             }
     305//             taskInstance.properties = params
     306//             if(!taskInstance.hasErrors() && taskInstance.save(flush: true)) {
     307//                 flash.message = "Task ${params.id} updated"
     308//                 redirect(action:show,id:taskInstance.id)
     309//             }
     310//             else {
     311//                 render(view:'edit',model:[taskInstance:taskInstance])
     312//             }
     313//         }
     314//         else {
     315//             flash.message = "Task not found with id ${params.id}"
     316//             redirect(action:edit,id:params.id)
     317//         }
     318//     }
    290319
    291320    def create = {
     
    296325
    297326    def save = {
    298         def taskInstance = new Task(params)
    299         if(!taskInstance.hasErrors() && taskInstance.save(flush: true)) {
    300             flash.message = "Task ${taskInstance.id} created"
    301             redirect(action:show,id:taskInstance.id)
    302         }
    303         else {
    304             render(view:'create',model:[taskInstance:taskInstance])
     327        def result = taskService.create(params)
     328
     329        if(!result.error) {
     330            flash.message = "Task ${result.taskInstance.id} created."
     331            redirect(action: show,id: result.taskInstance.id)
     332        }
     333        else {
     334            if(result.taskInstance) {
     335                render(view:'create',model:[taskInstance:result.taskInstance])
     336            }
     337            else {
     338                flash.message = "Could not create task."
     339                redirect(action:"search")
     340            }
     341
    305342        }
    306343    }
  • trunk/grails-app/domain/Asset.groovy

    r161 r180  
    1515
    1616    static constraints = {
    17         name(unique:true)
     17        name(unique:true, blank:false)
    1818    }
    1919
  • trunk/grails-app/domain/TaskModification.groovy

    r93 r180  
     1import java.text.SimpleDateFormat
     2
    13class TaskModification {
    24    Person person
     
    46    Task task
    57    Date date = new Date()
    6     String comment
     8    String comment = ""
    79
    810    static belongsTo = [Person, TaskModificationType, Task]
     
    1618    }
    1719
    18     static optionals = ["comment"]
     20    String toString() {
     21        def date = new SimpleDateFormat("EEE, dd-MMM-yyyy").format(this.date)
     22        "${taskModificationType} by ${person} on ${date}."
     23    }
    1924}
  • trunk/grails-app/i18n/messages.properties

    r177 r180  
    2424assignedPerson.estimatedDuration=Estimated Duration
    2525assignedPerson.estimatedDuration.help=The estimated amount of time (hh:mm) that you would like to assign this person to the task.
     26
     27task.modifications.failedToSave=Could not complete operation, as task modification record failed to save.
    2628
    2729task.assignedPersons=Assigned Persons
  • trunk/grails-app/services/CreateDataService.groovy

    r177 r180  
    11/**
    22* Provides a data service to create base and demo data.
     3* Beware that most, if not all, base data is referenced by "Id" throughout the program.
     4* This allows changing the text of the 'name' property to something of the same meaning.
     5* But be sure to maintain the correct Id during creation, indicated by #1, #2 etc.
    36*/
    47class  CreateDataService {
    58
     9    boolean transactional = false
     10
    611    def authenticateService
    7     boolean transactional = false
     12    def taskService
    813
    914/*******************************************
     
    4045        createBaseManufacturerType()
    4146        // Tasks
     47        createBaseTaskGroups()
    4248        createBaseTaskStatus()
    4349        createBaseTaskPriorities()
    4450        createBaseTaskTypes()
     51        createBaseTaskModificationTypes()
    4552        createBaseEntryTypes()
    46         createBaseModificationTypes()
    4753        // Inventory
    4854        createBaseInventoryTypes()
     
    6672        createDemoManufacturers()
    6773        // Tasks
    68         createDemoTaskGroups() /// @todo: Perhaps this should be BaseData?
    6974        createDemoTasks()
    7075        createDemoEntries()
     
    383388*********************/
    384389
    385     def createDemoTaskGroups() {
     390    def createBaseTaskGroups() {
    386391        //TaskGroup
    387392        def taskGroupInstance
     
    454459    }
    455460
     461    def createBaseTaskModificationTypes() {
     462
     463        //ModificationType
     464        def taskModificationTypeInstance
     465        taskModificationTypeInstance = new TaskModificationType(name:"Created").save()  // #1
     466        taskModificationTypeInstance = new TaskModificationType(name:"Started").save()  // #2
     467        taskModificationTypeInstance = new TaskModificationType(name:"Modified").save()  // #3
     468        taskModificationTypeInstance = new TaskModificationType(name:"Completed").save()  // #4
     469        taskModificationTypeInstance = new TaskModificationType(name:"Reopened").save()  // #5
     470        taskModificationTypeInstance = new TaskModificationType(name:"Trashed").save()  // #6
     471        taskModificationTypeInstance = new TaskModificationType(name:"Restored").save()  // #7
     472        taskModificationTypeInstance = new TaskModificationType(name:"Approved").save()  // #8
     473        taskModificationTypeInstance = new TaskModificationType(name:"Renege approval").save()  // #9
     474    }
     475
    456476    def createDemoTasks() {
    457477
    458         //Task
    459         def taskInstance
     478        def taskResult
     479        def p = [:]
    460480
    461481        //Task #1
    462         taskInstance = new Task(taskGroup:TaskGroup.findByName("Engineering Activites"),
    463                  taskStatus:TaskStatus.findByName("Not Started"),
    464                  taskPriority:TaskPriority.get(2),
    465                  taskType:TaskType.get(1),
    466                  leadPerson:Person.get(2),
    467                  description:"Check specific level sensor",
    468                  comment:"Has been noted as problematic, try recalibrating.",
    469                 targetStartDate:new Date())
    470         saveAndTest(taskInstance)
     482        p = [taskGroup:TaskGroup.findByName("Engineering Activites"),
     483                taskStatus:TaskStatus.findByName("Not Started"),
     484                taskPriority:TaskPriority.get(2),
     485                taskType:TaskType.get(1),
     486                leadPerson:Person.get(2),
     487                description:"Check specific level sensor",
     488                comment:"Has been noted as problematic, try recalibrating.",
     489                targetStartDate:new Date()]
     490
     491        taskResult = taskService.create(p)
    471492
    472493        //Task #2
    473         taskInstance = new Task(taskGroup:TaskGroup.findByName("Engineering Activites"),
     494        p = [taskGroup:TaskGroup.findByName("Engineering Activites"),
    474495                taskStatus:TaskStatus.findByName("Not Started"),
    475496                taskPriority:TaskPriority.get(2),
     
    479500                comment:"Some help required",
    480501                targetStartDate:new Date()+1,
    481                 parentTask: Task.get(1))
    482         saveAndTest(taskInstance)
     502                parentTask: Task.get(1)]
     503
     504        taskResult = taskService.create(p)
    483505
    484506        //Task #3
    485         taskInstance = new Task(taskGroup:TaskGroup.findByName("Engineering Activites"),
     507        p = [taskGroup:TaskGroup.findByName("Engineering Activites"),
    486508                taskStatus:TaskStatus.findByName("Not Started"),
    487509                taskPriority:TaskPriority.get(2),
     
    491513                comment:"Some help required",
    492514                targetStartDate:new Date()-1,
    493                 parentTask: Task.get(1))
    494         saveAndTest(taskInstance)
     515                parentTask: Task.get(1)]
     516
     517        taskResult = taskService.create(p)
    495518
    496519        //Task #4
    497         taskInstance = new Task(taskGroup:TaskGroup.findByName("Engineering Activites"),
     520        p = [taskGroup:TaskGroup.findByName("Engineering Activites"),
    498521                 taskStatus:TaskStatus.findByName("Not Started"),
    499522                 taskPriority:TaskPriority.get(2),
     
    503526                 comment:"Nothing else has worked.",
    504527                targetStartDate:new Date()+7,
    505                 parentTask: Task.get(1))
    506         saveAndTest(taskInstance)
     528                parentTask: Task.get(1)]
     529
     530        taskResult = taskService.create(p)
    507531
    508532        //Task #5
    509         taskInstance = new Task(taskGroup:TaskGroup.findByName("Production Activites"),
     533        p = [taskGroup:TaskGroup.findByName("Production Activites"),
    510534                 taskStatus:TaskStatus.findByName("Not Started"),
    511535                 taskPriority:TaskPriority.get(2),
     
    514538                 description:"Production Report",
    515539                 comment:"Production report for specific production run or shift",
    516                 targetStartDate:new Date()-7)
    517         saveAndTest(taskInstance)
     540                targetStartDate:new Date()-7]
     541
     542        taskResult = taskService.create(p)
    518543
    519544        //Task #6
    520         taskInstance = new Task(taskGroup:TaskGroup.findByName("New Projects"),
     545        p = [taskGroup:TaskGroup.findByName("New Projects"),
    521546                 taskStatus:TaskStatus.findByName("Not Started"),
    522547                 taskPriority:TaskPriority.get(2),
     
    525550                 description:"Make killer CMMS app",
    526551                 comment:"Use Grails and get a move on!",
    527                 targetStartDate:new Date()-6)
    528         saveAndTest(taskInstance)
     552                targetStartDate:new Date()-6]
     553
     554        taskResult = taskService.create(p)
    529555    }
    530556
     
    575601                                                    durationMinute: 20)
    576602        saveAndTest(entryInstance)
    577     }
    578 
    579     def createBaseModificationTypes() {
    580 
    581         //ModificationType
    582         def taskModificationTypeInstance
    583         taskModificationTypeInstance = new TaskModificationType(name:"Created").save()
    584         taskModificationTypeInstance = new TaskModificationType(name:"Completed").save()
    585         taskModificationTypeInstance = new TaskModificationType(name:"Closed").save()
    586         taskModificationTypeInstance = new TaskModificationType(name:"Altered").save()
    587         taskModificationTypeInstance = new TaskModificationType(name:"TargetDateModified").save()
    588         taskModificationTypeInstance = new TaskModificationType(name:"ScheduledDateModified").save()
    589         taskModificationTypeInstance = new TaskModificationType(name:"DescriptionModified").save()
    590         taskModificationTypeInstance = new TaskModificationType(name:"AssignedToModified").save()
    591         taskModificationTypeInstance = new TaskModificationType(name:"NameModified").save()
    592603    }
    593604
  • trunk/grails-app/services/DateUtilService.groovy

    r137 r180  
    22
    33    boolean transactional = false
    4     static scope = "request"
    5        
    6         public static Date getToday() {
     4    //static scope = "request"
     5
     6    public static Date getToday() {
    77        return setMidnight(new Date())
    88    }
  • trunk/grails-app/services/TaskSearchService.groovy

    r165 r180  
    22
    33    boolean transactional = false
    4     static scope = "request"
    54
    65    def dateUtilService
  • trunk/grails-app/services/TaskService.groovy

    r143 r180  
    11class TaskService {
    22
    3     boolean transactional = true
    4     static scope = "request"
     3    boolean transactional = false
    54
    65    def dateUtilService
     6    def authenticateService
    77
    8     def taskDates(taskInstance, params) {
    9         println "yes"
    10     }
    11 }
     8    def create(params) {
     9        Task.withTransaction { status ->
     10            def result = [:]
     11            def taskInstance = new Task(params)
     12            result.taskInstance = taskInstance
     13
     14            // Get person in a safe way to avoid a null userDomain during bootstrap.
     15            def userDomain = authenticateService.userDomain()
     16            def person = userDomain ? Person.get(userDomain.id) : Person.get(1)
     17
     18            if(taskInstance.save()) {
     19                def taskModification = new TaskModification(person:person,
     20                                                        taskModificationType: TaskModificationType.get(1),
     21                                                        task: taskInstance)
     22
     23                if(!taskModification.save()) {
     24                    status.setRollbackOnly()
     25                    taskInstance.errors.rejectValue("taskModifications", "task.modifications.failedToSave")
     26                    result.error = true
     27                    return result
     28                }
     29
     30                return result
     31            }
     32            else {
     33                result.error = true
     34                return result
     35            }
     36
     37        } //end withTransaction
     38    } // end create()
     39
     40    def start() {
     41        //TaskModificationType.get(2)
     42    }  // end start()
     43
     44    def update(params) {
     45        Task.withTransaction { status ->
     46            def result = [:]
     47            result.taskInstance = Task.get(params.id)
     48            if(result.taskInstance) {
     49
     50                // Optimistic locking check.
     51                if(params.version) {
     52                    def version = params.version.toLong()
     53                    if(result.taskInstance.version > version) {
     54                        status.setRollbackOnly()
     55                        result.taskInstance.errors.rejectValue("version", "task.optimistic.locking.failure", "Another user has updated this Task while you were editing.")
     56                        result.error = true
     57                        return result
     58                    }
     59                }
     60
     61
     62                result.taskInstance.properties = params
     63
     64                if(result.taskInstance.save()) {
     65                    def taskModification = new TaskModification(person:Person.get(authenticateService.userDomain().id),
     66                                                            taskModificationType: TaskModificationType.get(3),
     67                                                            task: result.taskInstance)
     68                    if(taskModification.save()) {
     69                        // All went well.
     70                        return result
     71                    }
     72                    else {
     73                        status.setRollbackOnly()
     74                        result.taskInstance.errors.rejectValue("taskModifications", "task.modifications.failedToSave")
     75                        result.error = true
     76                        return result
     77                    }
     78                }
     79            }
     80            // Something failed.
     81            status.setRollbackOnly()
     82            result.error = true
     83            return result
     84
     85        } //end withTransaction
     86    }  // end update()
     87
     88    def complete() {
     89        //TaskModificationType.get(4)
     90    }  // end complete()
     91
     92    def reopen() {
     93        //TaskModificationType.get(5)
     94    }  // end reopen()
     95
     96    def trash() {
     97        //TaskModificationType.get(6)
     98    }  // end trash()
     99
     100    def restore() {
     101        //TaskModificationType.get(7)
     102    }  // end restore()
     103
     104    def approve() {
     105        //TaskModificationType.get(8)
     106    }  // end approve()
     107
     108    def renegeApproval() {
     109        //TaskModificationType.get(9)
     110    }  // end renegeApproval()
     111
     112} // end TaskService
  • trunk/grails-app/views/taskDetailed/create.gsp

    r168 r180  
    2121            </g:hasErrors>
    2222
    23             <g:form id='createTaskForm' name='createTaskForm' action="save" method="post" >
     23            <g:form action="save" method="post" >
    2424                <div class="dialog">
    2525                    <table>
  • trunk/grails-app/views/taskDetailed/show.gsp

    r175 r180  
    44        <meta name="layout" content="main" />
    55        <title>Show Task</title>
     6        <g:javascript src="overlayPane.js" />
    67        <nav:resources override="true"/>
    78        <resource:tabView skin="tabviewCustom" />
     
    1516            <div class="message">${flash.message}</div>
    1617            </g:if>
    17             <g:hasErrors bean="${taskProcedureInstance}">
     18            <g:hasErrors bean="${taskInstance}">
    1819            <div class="errors">
    19                 <g:renderErrors bean="${taskProcedureInstance}" as="list" />
     20                <g:renderErrors bean="${taskInstance}" as="list" />
    2021            </div>
    2122            </g:hasErrors>
     
    4142
    4243                                    <tr class="prop">
    43                                         <td valign="top" class="name">Id:</td>
    44 
    45                                         <td valign="top" class="value">${fieldValue(bean:taskInstance, field:'id')}</td>
    46 
    47                                     </tr>
    48 
    49                                     <tr class="prop">
    5044                                        <td valign="top" class="name">Description:</td>
    5145
     
    6256
    6357                                    <tr class="prop">
    64                                         <td valign="top" class="name">Target Start Date:</td>
     58                                        <td valign="top" class="name">Target Start:</td>
    6559
    6660                                        <td valign="top" class="value"><g:formatDate date="${taskInstance.targetStartDate}" format="EEE, dd-MMM-yyyy"/></td>
     
    6963
    7064                                    <tr class="prop">
    71                                         <td valign="top" class="name">Target Completion Date:</td>
     65                                        <td valign="top" class="name">Target Completion:</td>
    7266
    7367                                        <td valign="top" class="value"><g:formatDate date="${taskInstance.targetCompletionDate}" format="EEE, dd-MMM-yyyy"/></td>
    7468
    7569                                    </tr>
     70
     71                                    <tr class="prop">
     72                                        <td valign="top" class="name">
     73                                            <div id="modControlClosed">
     74                                                <a href='' onclick="showElement('modifications');
     75                                                                                    showElement('modControlOpened');
     76                                                                                    hideElement('modControlClosed'); return false;">
     77                                                    Modifications <img  src="${resource(dir:'images/skin',file:'sorted_asc.gif')}" alt="Show" />
     78                                                </a>
     79                                            </div>
     80                                            <div id="modControlOpened" style="display:none;">
     81                                                <a href='' onclick="hideElement('modifications');
     82                                                                                    hideElement('modControlOpened');
     83                                                                                    showElement('modControlClosed');
     84                                                                                    return false;">
     85                                                    Modifications <img  src="${resource(dir:'images/skin',file:'sorted_desc.gif')}" alt="Show" />
     86                                                </a>
     87                                            </div>
     88                                        </td>
     89
     90                                        <td  valign="top" style="text-align:left;" class="value">
     91                                            <div id="modifications" style="display:none;">
     92                                                <ul>
     93                                                <g:each var="a" in="${taskModificationList}">
     94                                                    <li>${a?.encodeAsHTML()}</li>
     95                                                </g:each>
     96                                                </ul>
     97                                            </div>
     98                                        </td>
     99                                    </tr>
     100
    76101
    77102                                    <tr class="prop">
     
    103128
    104129                                    <tr class="prop">
    105                                         <td valign="top" class="name">Task Priority:</td>
     130                                        <td valign="top" class="name">Priority:</td>
    106131
    107132                                        <td valign="top" class="value">${taskInstance?.taskPriority?.encodeAsHTML()}</td>
     
    110135
    111136                                    <tr class="prop">
    112                                         <td valign="top" class="name">Task Status:</td>
     137                                        <td valign="top" class="name">Status:</td>
    113138
    114139                                        <td valign="top" class="value">${taskInstance?.taskStatus?.encodeAsHTML()}</td>
     
    117142
    118143                                    <tr class="prop">
    119                                         <td valign="top" class="name">Is Active:</td>
     144                                        <td valign="top" class="name">Active:</td>
    120145
    121146                                        <td valign="top" class="value">${fieldValue(bean:taskInstance, field:'isActive')}</td>
     
    124149
    125150                                    <tr class="prop">
    126                                         <td valign="top" class="name">Is Approved:</td>
     151                                        <td valign="top" class="name">Approved:</td>
    127152
    128153                                        <td valign="top" class="value">${fieldValue(bean:taskInstance, field:'isApproved')}</td>
     
    131156
    132157                                    <tr class="prop">
    133                                         <td valign="top" class="name">Is Scheduled:</td>
     158                                        <td valign="top" class="name">Scheduled:</td>
    134159
    135160                                        <td valign="top" class="value">${fieldValue(bean:taskInstance, field:'isScheduled')}</td>
     
    145170
    146171                                    <tr class="prop">
    147                                         <td valign="top" class="name">Task Group:</td>
     172                                        <td valign="top" class="name">Group:</td>
    148173
    149174                                        <td valign="top" class="value">${taskInstance?.taskGroup?.encodeAsHTML()}</td>
     
    152177
    153178                                    <tr class="prop">
    154                                         <td valign="top" class="name">Task Type:</td>
     179                                        <td valign="top" class="name">Type:</td>
    155180
    156181                                        <td valign="top" class="value">${taskInstance?.taskType?.encodeAsHTML()}</td>
Note: See TracChangeset for help on using the changeset viewer.