Changeset 191


Ignore:
Timestamp:
Nov 19, 2009, 9:16:21 PM (14 years ago)
Author:
gav
Message:

Improve entry creation so that entryType is passed in with the associated submitButton.
Refactor InventoryMovementService and prevent create/delete of invenotryMovements on complete task.

Location:
trunk/grails-app
Files:
8 edited

Legend:

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

    r186 r191  
    9696            def entryInstance = new Entry()
    9797            entryInstance.task = taskInstance
     98            entryInstance.entryType = EntryType.get(params.entryType.id)
    9899            return ['entryInstance':entryInstance]
    99100        }
  • trunk/grails-app/controllers/InventoryMovementDetailedController.groovy

    r177 r191  
    3434        else {
    3535            if(result.inventoryMovementInstance) {
    36                 render(view:'show',model:[inventoryMovementInstance:result.inventoryMovementInstance])
     36                // For some reason we have to call refresh() here to get a hibernate session
     37                // and avoid a lazy initialisation error.
     38                render(view:'show',model:[inventoryMovementInstance:result.inventoryMovementInstance.refresh()])
    3739            }
    3840            else {
    3941                flash.message = "Could not delete inventory movement."
    40                 redirect(controller:"taskDetailed", action:"search", id:result.taskId)
     42                redirect(controller:"taskDetailed", action:"search")
    4143            }
    4244        }
  • trunk/grails-app/i18n/messages.properties

    r186 r191  
    2626
    2727task.modifications.failedToSave=Could not complete operation, as task modification record failed to save.
     28task.operationNotPermittedOnCompleteTask=This operation is not permitted on a complete task.
    2829
    2930task.assignedPersons=Assigned Persons
     
    5556entry.task.failedToSave=Could not complete operation, task failed to save.
    5657entry.task.failedToSaveTaskModification=Could not complete operation, task modification failed to save.
    57 entry.task.taskIsComplete=This operation is not permitted on a complete task.
    5858
    5959default.doesnt.match.message=Property [{0}] of class [{1}] with value [{2}] does not match the required pattern [{3}]
  • trunk/grails-app/services/InventoryMovementService.groovy

    r177 r191  
    66        InventoryMovement.withTransaction { status ->
    77            def result = [:]
    8             def inventoryMovementInstance = InventoryMovement.lock(params.id)
    9             if(inventoryMovementInstance) {
    10                 def inventoryItem = InventoryItem.lock(inventoryMovementInstance.inventoryItem.id)
    11                 result.taskId = inventoryMovementInstance.task.id
     8            result.inventoryMovementInstance = InventoryMovement.lock(params.id)
     9            if(result.inventoryMovementInstance) {
     10                def inventoryItem = InventoryItem.lock(result.inventoryMovementInstance.inventoryItem.id)
     11                result.taskId = result.inventoryMovementInstance.task.id
    1212
    1313                if(!inventoryItem) {
    1414                        status.setRollbackOnly()
    15                         inventoryMovementInstance.errors.rejectValue('inventoryItem', "inventoryMovement.inventoryItem.notFound")
    16                         result.inventoryMovementInstance = inventoryMovementInstance
     15                        result.inventoryMovementInstance.errors.rejectValue('inventoryItem', "inventoryMovement.inventoryItem.notFound")
    1716                        result.error = true
    1817                        return result
    1918                }
    2019
     20                if(result.inventoryMovementInstance.task.taskStatus.id == 3) {
     21                    status.setRollbackOnly()
     22                    result.inventoryMovementInstance.errors.rejectValue('task', "task.operationNotPermittedOnCompleteTask")
     23                    result.error = true
     24                    return result
     25                }
     26
    2127                // Reverse the movement of inventory.
    22                 if(!inventoryMovementInstance.inventoryMovementType.incrementsInventory) {
    23                     inventoryItem.unitsInStock += inventoryMovementInstance.quantity
     28                if(!result.inventoryMovementInstance.inventoryMovementType.incrementsInventory) {
     29                    inventoryItem.unitsInStock += result.inventoryMovementInstance.quantity
    2430                }
    2531                else {
    26                     if(inventoryItem.unitsInStock >= inventoryMovementInstance.quantity) {
    27                         inventoryItem.unitsInStock -= inventoryMovementInstance.quantity
     32                    if(inventoryItem.unitsInStock >= result.inventoryMovementInstance.quantity) {
     33                        inventoryItem.unitsInStock -= result.inventoryMovementInstance.quantity
    2834                    }
    2935                    else {
    3036                        status.setRollbackOnly()
    31                         inventoryMovementInstance.errors.rejectValue('quantity', "inventoryMovement.quantity.insufficientItemsInStock")
    32                         result.inventoryMovementInstance = inventoryMovementInstance
     37                        result.inventoryMovementInstance.errors.rejectValue('quantity', "inventoryMovement.quantity.insufficientItemsInStock")
    3338                        result.error = true
    3439                        return result
     
    3742
    3843                if(inventoryItem.save() ) {
    39                     inventoryMovementInstance.delete()
     44                    // All went well if we get to this point.
     45                    result.inventoryMovementInstance.delete()
    4046                    return result
    4147                }
     
    5864        InventoryMovement.withTransaction { status ->
    5965            def result = [:]
    60             def inventoryMovementInstance = new InventoryMovement(params)
     66            result.inventoryMovementInstance = new InventoryMovement(params)
    6167
    62             if(inventoryMovementInstance.validate()) {
    63                 def inventoryItem = InventoryItem.lock(inventoryMovementInstance.inventoryItem.id)
    64                 result.taskId = inventoryMovementInstance.task.id
     68            if(result.inventoryMovementInstance.validate()) {
     69                def inventoryItem = InventoryItem.lock(result.inventoryMovementInstance.inventoryItem.id)
     70                result.taskId = result.inventoryMovementInstance.task.id
    6571
    6672                if(!inventoryItem) {
    67                         status.setRollbackOnly()
    68                         inventoryMovementInstance.errors.rejectValue('inventoryItem', "inventoryMovement.inventoryItem.notFound")
    69                         result.inventoryMovementInstance = inventoryMovementInstance
    70                         result.error = true
    71                         return result
     73                    status.setRollbackOnly()
     74                    result.inventoryMovementInstance.errors.rejectValue('inventoryItem', "inventoryMovement.inventoryItem.notFound")
     75                    result.error = true
     76                    return result
     77                }
     78
     79                if(result.inventoryMovementInstance.task.taskStatus.id == 3) {
     80                    status.setRollbackOnly()
     81                    result.inventoryMovementInstance.errors.rejectValue('task', "task.operationNotPermittedOnCompleteTask")
     82                    result.error = true
     83                    return result
    7284                }
    7385
    7486                // Perform the movement of inventory.
    75                 if(inventoryMovementInstance.inventoryMovementType.incrementsInventory) {
    76                     inventoryItem.unitsInStock += inventoryMovementInstance.quantity
     87                if(result.inventoryMovementInstance.inventoryMovementType.incrementsInventory) {
     88                    inventoryItem.unitsInStock += result.inventoryMovementInstance.quantity
    7789                }
    7890                else {
    79                     if(inventoryItem.unitsInStock >= inventoryMovementInstance.quantity) {
    80                         inventoryItem.unitsInStock -= inventoryMovementInstance.quantity
     91                    if(inventoryItem.unitsInStock >= result.inventoryMovementInstance.quantity) {
     92                        inventoryItem.unitsInStock -= result.inventoryMovementInstance.quantity
    8193                    }
    8294                    else {
    8395                        status.setRollbackOnly()
    84                         inventoryMovementInstance.errors.rejectValue('quantity', "inventoryMovement.quantity.insufficientItemsInStock")
    85                         result.inventoryMovementInstance = inventoryMovementInstance
     96                        result.inventoryMovementInstance.errors.rejectValue('quantity', "inventoryMovement.quantity.insufficientItemsInStock")
    8697                        result.error = true
    8798                        return result
     
    89100                }
    90101
    91                 if(inventoryItem.save() && inventoryMovementInstance.save()) {
    92                     result.inventoryMovementInstance = inventoryMovementInstance
     102                if(inventoryItem.save() && result.inventoryMovementInstance.save()) {
     103                    // All went well if we get to this point.
    93104                    return result
    94105                }
    95106                else {
    96107                    status.setRollbackOnly()
    97                     result.inventoryMovementInstance = inventoryMovementInstance
    98108                    result.error = true
    99109                    return result
     
    102112            }
    103113            else {
    104                 result.inventoryMovementInstance = inventoryMovementInstance
    105114                result.error = true
    106115                return result
  • trunk/grails-app/services/TaskService.groovy

    r186 r191  
    5555                if(taskInstance.taskStatus.id == 3) {
    5656                    status.setRollbackOnly()
    57                     result.entryInstance.errors.rejectValue('task', "entry.task.taskIsComplete")
     57                    result.entryInstance.errors.rejectValue('task', "task.operationNotPermittedOnCompleteTask")
    5858                    result.error = true
    5959                    return result
  • trunk/grails-app/views/entryDetailed/create.gsp

    r186 r191  
    2424            <g:form action="save" method="post" >
    2525                <g:hiddenField name="task.id" value="${entryInstance.task.id}" />
     26                <g:hiddenField name="entryType.id" value="${entryInstance.entryType.id}" />
    2627                <div class="dialog">
    2728                    <table>
     
    3334                                </td>
    3435                                <td valign="top" class="name">
    35                                     ${entryInstance?.task}
     36                                    <g:link controller="taskDetailed" action="show" id="${entryInstance.task.id}" >
     37                                        ${entryInstance?.task}
     38                                    </g:link>
    3639                                </td>
    37                             </tr> 
     40                            </tr>
    3841                       
    3942                            <tr class="prop">
    4043                                <td valign="top" class="name">
    41                                     <label for="comment">Comment:</label>
     44                                    <label for="comment">${entryInstance?.entryType}:</label>
    4245                                </td>
    4346                                <td valign="top" class="value ${hasErrors(bean:entryInstance,field:'comment','errors')}">
     
    7174                                </td>
    7275                            </tr>
    73                      
    74                             <tr class="prop">
    75                                 <td valign="top" class="name">
    76                                     <label for="entryType">Entry Type:</label>
    77                                 </td>
    78                                 <td valign="top" class="value ${hasErrors(bean:entryInstance,field:'entryType','errors')}">
    79                                     <g:select optionKey="id" from="${EntryType.list()}" name="entryType.id" value="${entryInstance?.entryType?.id}" ></g:select>
    80                                 </td>
    81                             </tr>
    8276                       
    8377                        </tbody>
  • trunk/grails-app/views/inventoryMovementDetailed/create.gsp

    r177 r191  
    5959                                    </td>
    6060                                    <td valign="top" name="inventoryMovementInstance.task" class="value">
    61                                         <input type="hidden" id="task.id" name="task.id" value="${inventoryMovementInstance.task.id}" />
    62                                         ${inventoryMovementInstance.task}
     61                                        <g:hiddenField name="task.id" value="${inventoryMovementInstance.task.id}" />
     62                                        <g:link controller="taskDetailed" action="show" id="${inventoryMovementInstance.task.id}" >
     63                                            ${inventoryMovementInstance.task}
     64                                        </g:link>
    6365                                    </td>
    6466                                </tr>
  • trunk/grails-app/views/taskDetailed/show.gsp

    r184 r191  
    231231                        </div>
    232232
    233                         <div class="list">
    234                             <h1>Faults</h1>
    235                             <table>
    236                                 <thead>
    237                                     <tr>
    238                                         <th>Comment</th>
    239                                         <th>Date Done</th>
    240                                         <th>Duration</th>
    241                                         <th>Entered By</th>
    242                                         <th></th>
    243                                     </tr>
    244                                 </thead>
    245                                 <tbody>
    246                                 <g:each in="${entryFaultList}" status="i" var="entry">
    247                                         <tr class="${(i % 2) == 0 ? 'clickableOdd' : 'clickableEven'}" onclick='window.location = "${request.getContextPath()}/entryDetailed/edit/${entry.id}"'/>
    248 
    249                                             <td style="width:65%">${entry.comment}</td>
    250                                             <td><g:formatDate date="${entry.dateDone}" format="EEE, dd-MMM-yyyy"/></td>
    251                                             <td>${entry.durationHour}:${entry.durationMinute}</td>
    252                                             <td>${entry.enteredBy}</td>
    253 
    254                                             <td>
    255                                                 <g:link controller="entryDetailed" action="edit" id="${entry.id}">
    256                                                     <img  src="${resource(dir:'images/skin',file:'database_edit.png')}" alt="Edit" />
    257                                                 </g:link>
    258                                             </td>
    259 
    260                                         </tr>
    261                                 </g:each>
    262                                 </tbody>
    263                             </table>
    264                         </div>
    265 
    266                         <div class="list">
    267                             <h1>Work Done</h1>
    268                             <table>
    269                                 <thead>
    270                                     <tr>
    271                                         <th>Comment</th>
    272                                         <th>Date Done</th>
    273                                         <th>Duration</th>
    274                                         <th>Entered By</th>
    275                                         <th></th>
    276                                     </tr>
    277                                 </thead>
    278                                 <tbody>
    279                                 <g:each in="${entryWorkDoneList}" status="i" var="entry">
    280                                         <tr class="${(i % 2) == 0 ? 'clickableOdd' : 'clickableEven'}" onclick='window.location = "${request.getContextPath()}/entryDetailed/edit/${entry.id}"'/>
    281 
    282                                             <td width="65%">${entry.comment}</td>
    283                                             <td><g:formatDate date="${entry.dateDone}" format="EEE, dd-MMM-yyyy"/></td>
    284                                             <td>${entry.durationHour}:${entry.durationMinute}</td>
    285                                             <td>${entry.enteredBy}</td>
    286 
    287                                             <td>
    288                                                 <g:link controller="entryDetailed" action="edit" id="${entry.id}">
    289                                                     <img  src="${resource(dir:'images/skin',file:'database_edit.png')}" alt="Edit" />
    290                                                 </g:link>
    291                                             </td>
    292 
    293                                         </tr>
    294                                 </g:each>
    295                                 </tbody>
    296                             </table>
    297                         </div>
    298 
    299233                        <br />
     234
     235                        <g:if test="${entryFaultList.isEmpty()}">
     236                            <h1>No Faults</h1>
     237                            <br />
     238                        </g:if>
     239                        <g:else>
     240                            <div class="list">
     241                                <h1>Faults</h1>
     242                                <table>
     243                                    <thead>
     244                                        <tr>
     245                                            <th>Comment</th>
     246                                            <th>Date Done</th>
     247                                            <th>Duration</th>
     248                                            <th>Entered By</th>
     249                                            <th></th>
     250                                        </tr>
     251                                    </thead>
     252                                    <tbody>
     253                                        <g:each in="${entryFaultList}" status="i" var="entry">
     254                                                <tr class="${(i % 2) == 0 ? 'clickableOdd' : 'clickableEven'}" onclick='window.location = "${request.getContextPath()}/entryDetailed/edit/${entry.id}"'/>
     255
     256                                                    <td style="width:65%">${entry.comment}</td>
     257                                                    <td><g:formatDate date="${entry.dateDone}" format="EEE, dd-MMM-yyyy"/></td>
     258                                                    <td>${entry.durationHour}:${entry.durationMinute}</td>
     259                                                    <td>${entry.enteredBy}</td>
     260
     261                                                    <td>
     262                                                        <g:link controller="entryDetailed" action="edit" id="${entry.id}">
     263                                                            <img  src="${resource(dir:'images/skin',file:'database_edit.png')}" alt="Edit" />
     264                                                        </g:link>
     265                                                    </td>
     266
     267                                                </tr>
     268                                        </g:each>
     269                                    </tbody>
     270                                </table>
     271                            </div>
     272                        </g:else>
    300273
    301274                        <div class="buttons">
    302275                            <g:form controller="entryDetailed">
    303                                 <input type="hidden" name="taskInstance.id" value="${taskInstance?.id}" />
     276                                <g:hiddenField name="taskInstance.id" value="${taskInstance?.id}" />
     277                                <g:hiddenField name="entryType.id" value="1" />
    304278                                <span class="button">
    305                                     <g:actionSubmit value="Add Entry" action="create"  class="add"/>
     279                                    <g:actionSubmit value="Add Fault" action="create"  class="add"/>
     280                                </span>
     281                            </g:form>
     282                        </div>
     283
     284                        <br />
     285
     286                        <g:if test="${entryWorkDoneList.isEmpty()}">
     287                            <h1>No Work Done</h1>
     288                            <br />
     289                        </g:if>
     290                        <g:else>
     291                            <div class="list">
     292                                <h1>Work Done</h1>
     293                                <table>
     294                                    <thead>
     295                                        <tr>
     296                                            <th>Comment</th>
     297                                            <th>Date Done</th>
     298                                            <th>Duration</th>
     299                                            <th>Entered By</th>
     300                                            <th></th>
     301                                        </tr>
     302                                    </thead>
     303                                    <tbody>
     304                                        <g:each in="${entryWorkDoneList}" status="i" var="entry">
     305                                                <tr class="${(i % 2) == 0 ? 'clickableOdd' : 'clickableEven'}" onclick='window.location = "${request.getContextPath()}/entryDetailed/edit/${entry.id}"'/>
     306
     307                                                    <td width="65%">${entry.comment}</td>
     308                                                    <td><g:formatDate date="${entry.dateDone}" format="EEE, dd-MMM-yyyy"/></td>
     309                                                    <td>${entry.durationHour}:${entry.durationMinute}</td>
     310                                                    <td>${entry.enteredBy}</td>
     311
     312                                                    <td>
     313                                                        <g:link controller="entryDetailed" action="edit" id="${entry.id}">
     314                                                            <img  src="${resource(dir:'images/skin',file:'database_edit.png')}" alt="Edit" />
     315                                                        </g:link>
     316                                                    </td>
     317
     318                                                </tr>
     319                                        </g:each>
     320                                    </tbody>
     321                                </table>
     322                            </div>
     323                        </g:else>
     324
     325                        <div class="buttons">
     326                            <g:form controller="entryDetailed">
     327                                <g:hiddenField name="taskInstance.id" value="${taskInstance?.id}" />
     328                                <g:hiddenField name="entryType.id" value="2" />
     329                                <span class="button">
     330                                    <g:actionSubmit value="Add Work Done" action="create"  class="add"/>
    306331                                </span>
    307332                            </g:form>
Note: See TracChangeset for help on using the changeset viewer.