source: trunk/grails-app/controllers/InventoryItemPurchaseDetailedController.groovy

Last change on this file was 966, checked in by gav, 12 years ago

Arrange and add some fields to the InventoryItemPurchase search page export function.
Part 2 - Code formatting and add inventoryItem.unitOfMeasure.

File size: 20.0 KB
Line 
1import org.codehaus.groovy.grails.plugins.springsecurity.Secured
2import org.codehaus.groovy.grails.commons.ConfigurationHolder
3import com.zeddware.grails.plugins.filterpane.FilterUtils
4
5@Secured(['ROLE_AppAdmin', 'ROLE_Manager', 'ROLE_InventoryManager'])
6class InventoryItemPurchaseDetailedController extends BaseController {
7
8    def authService
9    def filterService
10    def exportService
11    def dateUtilService
12    def inventoryPurchaseService
13
14    def index = {
15        redirect(action:'search', params:params)
16    }
17
18    // the delete, save and update actions only accept POST requests
19    static allowedMethods = [delete:'POST', save:'POST', update:'POST']
20
21    def setSearchParamsMax = {
22        def max = 1000
23        if(params.newMax?.isInteger()) {
24            def i = params.newMax.toInteger()
25            if(i > 0 && i <= max)
26                session.inventoryItemPurchaseSearchParamsMax = params.newMax
27            if(i > max)
28                session.inventoryItemPurchaseSearchParamsMax = max
29        }
30        forward(action: 'search', params: params)
31    }
32
33    def search = {
34
35        if(session.inventoryItemPurchaseSearchParamsMax)
36            params.max = session.inventoryItemPurchaseSearchParamsMax
37
38        // Protect filterPane.
39        params.max = Math.min( params.max ? params.max.toInteger() : 10,  1000 )
40        params.offset = params.offset?.toInteger() ?: 0
41
42        def inventoryItemPurchaseList = []
43        def inventoryItemPurchaseTotal
44        def filterParams = com.zeddware.grails.plugins.filterpane.FilterUtils.extractFilterParams(params)
45        def isFilterApplied = FilterUtils.isFilterApplied(params)
46
47        // Restore search unless a new search is being requested.
48        if(!params.quickSearch && !filterParams) {
49            if(session.inventoryItemPurchaseQuickSearch)
50                params.quickSearch = session.inventoryItemPurchaseQuickSearch
51            else if(session.inventoryItemPurchaseSearchFilterParams) {
52                session.inventoryItemPurchaseSearchFilterParams.each() { params[it.key] = it.value }
53                params.filter = session.inventoryItemPurchaseSearchFilter
54                isFilterApplied = FilterUtils.isFilterApplied(params)
55            }
56        }
57
58        // Remember sort if supplied, otherwise try to restore.
59        if(params.sort && params.order) {
60            // Reset to defaultSort if requested.
61            if(params.sort == 'defaultSort') {
62                params.sort = null
63                params.order = null
64                session.removeAttribute("inventoryItemPurchaseSearchSort")
65                session.removeAttribute("inventoryItemPurchaseSearchOrder")
66            }
67            else {
68                session.inventoryItemPurchaseSearchSort = params.sort
69                session.inventoryItemPurchaseSearchOrder = params.order
70            }
71        }
72        else if(session.inventoryItemPurchaseSearchSort && session.inventoryItemPurchaseSearchOrder) {
73            params.sort = session.inventoryItemPurchaseSearchSort
74            params.order = session.inventoryItemPurchaseSearchOrder
75        }
76        else {
77            params.sort = "id"
78            params.order = "asc"
79        }
80
81        if(isFilterApplied) {
82            // filterPane:
83            //if(params.sort == "attentionFlag") // See ticket #64 in Trac.
84                //params.sort = "id"
85
86            // Call filterService.
87            inventoryItemPurchaseList = filterService.filter( params, InventoryItemPurchase )
88            inventoryItemPurchaseTotal = filterService.count( params, InventoryItemPurchase )
89            filterParams = com.zeddware.grails.plugins.filterpane.FilterUtils.extractFilterParams(params)
90            // Remember search.
91            session.inventoryItemPurchaseSearchFilterParams = new LinkedHashMap(filterParams)
92            session.inventoryItemPurchaseSearchFilter = new LinkedHashMap(params.filter)
93            session.removeAttribute("inventoryItemPurchaseQuickSearch")
94        }
95        else {
96            // Quick Search:
97
98            if(params.quickSearch == "searchAllOrders") {
99                def orderType = InventoryItemPurchaseType.read(1)
100                inventoryItemPurchaseList = InventoryItemPurchase.findAllByInventoryItemPurchaseType(orderType,
101                                                                                                                                                                [max:params.max,
102                                                                                                                                                                offset:params.offset,
103                                                                                                                                                                sort:params.sort,
104                                                                                                                                                                order:params.order])
105                inventoryItemPurchaseTotal = InventoryItemPurchase.countByInventoryItemPurchaseType(orderType)
106                if(inventoryItemPurchaseTotal > 0) { params.message = "All Orders." }
107                else { params.message = "No orders found." }
108            }
109            else if(params.quickSearch == "searchAllReceived") {
110                def receivedBackOrderType = InventoryItemPurchaseType.read(2)
111                def receivedCompleteType = InventoryItemPurchaseType.read(3)
112                inventoryItemPurchaseList = InventoryItemPurchase.findAllByInventoryItemPurchaseTypeOrInventoryItemPurchaseType(receivedBackOrderType,
113                                                                                                                                                                                                                receivedCompleteType,
114                                                                                                                                                                                                                [max:params.max,
115                                                                                                                                                                                                                offset:params.offset,
116                                                                                                                                                                                                                sort:params.sort,
117                                                                                                                                                                                                                order:params.order])
118                inventoryItemPurchaseTotal = InventoryItemPurchase.countByInventoryItemPurchaseTypeOrInventoryItemPurchaseType(receivedBackOrderType,
119                                                                                                                                                                                                                receivedCompleteType)
120                if(inventoryItemPurchaseTotal > 0) { params.message = "All Received." }
121                else { params.message = "No orders found." }
122            }
123            else {
124                //Default:
125                inventoryItemPurchaseList = InventoryItemPurchase.list(max:params.max,
126                                                                                                            offset:params.offset,
127                                                                                                            sort:params.sort,
128                                                                                                            order:params.order)
129                inventoryItemPurchaseTotal = InventoryItemPurchase.count()
130                if(inventoryItemPurchaseTotal > 0) { params.message = "All Purchases." }
131                else { params.message = "No orders found." }
132            }
133
134            filterParams.quickSearch = params.quickSearch
135            // Remember search.
136            session.removeAttribute("inventoryItemPurchaseSearchFilterParams")
137            session.removeAttribute("inventoryItemPurchaseSearchFilter")
138            session.inventoryItemPurchaseQuickSearch = params.quickSearch
139        }
140
141        // export plugin:
142        if(params?.format && params.format != "html") {
143
144            def dateFmt = { domain, value ->
145                formatDate(format: "EEE, dd-MMM-yyyy", date: value)
146            }
147
148            String title
149            if(params.quickSearch)
150                title = "${params.quickSearch} inventory purchases."
151            else
152                title = "Filtered inventory purchases."
153
154            response.contentType = ConfigurationHolder.config.grails.mime.types[params.format]
155            response.setHeader("Content-disposition", "attachment; filename=Purchases.${params.extension}")
156            List fields = ["quantity",
157                            "inventoryItem.unitOfMeasure",
158                            "inventoryItem.description",
159                            "inventoryItem.name",
160                            "orderValueAmount",
161                            "orderValueCurrency",
162                            "purchaseOrderNumber",
163                            "date",
164                            "costCode",
165                            "invoiceNumber",
166                            "inventoryItemPurchaseType"]
167            Map labels = ["quantity": "Quantity",
168                            "inventoryItem.unitOfMeasure": "UOM",
169                            "inventoryItem.description": "Description",
170                            "inventoryItem.name": "Name",
171                            "orderValueAmount": "Order Value",
172                            "orderValueCurrency": "Currency",
173                            "purchaseOrderNumber": "P/Order Number",
174                            "date": "Date",
175                            "costCode": "Cost Code",
176                            "invoiceNumber": "Invoice Number",
177                            "inventoryItemPurchaseType": "Type"]
178            Map formatters = [ date: dateFmt]
179            Map parameters = [title: title, separator: ","]
180
181            exportService.export(params.format, response.outputStream, inventoryItemPurchaseList, fields, labels, formatters, parameters)
182        }
183
184        // Add some basic params to filterParams.
185        filterParams.max = params.max
186        filterParams.offset = params.offset?.toInteger() ?: 0
187        filterParams.sort = params.sort ?: "purchaseOrderNumber"
188        filterParams.order = params.order ?: "desc"
189
190        // Get some associatedProperty values for filterpane.
191        def associatedPropertyValues = [:]
192        def startOfYearRange = dateUtilService.getYearFromDate(dateUtilService.plusYear(new Date(), -10))
193        def endOfYearRange = dateUtilService.getYearFromDate(dateUtilService.plusYear(new Date(), 10))
194        associatedPropertyValues.yearRange = startOfYearRange..endOfYearRange
195
196        return[ inventoryItemPurchaseList: inventoryItemPurchaseList,
197                        inventoryItemPurchaseTotal: inventoryItemPurchaseTotal,
198                        filterParams: filterParams,
199                        associatedPropertyValues: associatedPropertyValues ]
200
201    } // end search()
202
203    def show = {
204        def inventoryItemPurchaseInstance = InventoryItemPurchase.read( params.id )
205        params.returnTo = params.returnTo ?: 'inventoryItem'
206
207        if(!inventoryItemPurchaseInstance) {
208            flash.message = "InventoryItemPurchase not found with id ${params.id}"
209            redirect(controller: 'inventoryItemDetailed', action:'search')
210        }
211        else { return [ inventoryItemPurchaseInstance : inventoryItemPurchaseInstance ] }
212    }
213
214    def delete = {
215        def result = inventoryPurchaseService.delete(params)
216
217        if(!result.error) {
218            flash.message = g.message(code: "default.delete.success", args: ["InventoryItemPurchase", params.id])
219            if(params.returnTo == 'inventoryItem') {
220                redirect(controller: 'inventoryItemDetailed',
221                                action: 'show',
222                                id: result.inventoryItemId,
223                                params: [showTab: "showPurchasingTab"])
224            }
225            else {
226                redirect(action: 'search')
227            }
228            return
229        }
230
231        flash.errorMessage = g.message(code: result.error.code, args: result.error.args)
232
233        if(result.error.code == "default.not.found") {
234            redirect(controller: 'inventoryItemDetailed', action: 'search')
235            return
236        }
237
238        redirect(action:show, id: params.id)
239    }
240
241    def edit = {
242        def result = inventoryPurchaseService.edit(params)
243        params.returnTo = params.returnTo ?: 'inventoryItem'
244
245        def costCodes = []
246
247        if(!result.error) {
248            if(inventoryPurchaseService.isPersonInPurchasingGroup(result.inventoryItemPurchaseInstance.costCode.purchasingGroup))
249                costCodes = inventoryPurchaseService.getCostCodesByPerson()
250
251            return [ inventoryItemPurchaseInstance : result.inventoryItemPurchaseInstance,
252                            'costCodes': costCodes ]
253        }
254
255        flash.errorMessage = g.message(code: result.error.code, args: result.error.args)
256        redirect(controller: 'inventoryItemDetailed', action:'search', params:params)
257    }
258
259    def update = {
260        def result = inventoryPurchaseService.update(params)
261
262        if(!result.error) {
263            flash.message = g.message(code: "default.update.success", args: ["Inventory Purchase", params.id])
264            redirect(action:show, id: params.id)
265            return
266        }
267
268        if(result.error.code == "default.not.found") {
269            flash.message = g.message(code: result.error.code, args: result.error.args)
270            redirect(controller: 'inventoryItemDetailed', action:'search', params:params)
271            return
272        }
273
274        result.inventoryItemPurchaseInstance.attach()
275        result.inventoryItemPurchaseInstance.costCode.attach()
276        result.inventoryItemPurchaseInstance.costCode.purchasingGroup.attach()
277
278        def costCodes = []
279        if(inventoryPurchaseService.isPersonInPurchasingGroup(result.inventoryItemPurchaseInstance.costCode.purchasingGroup))
280            costCodes = inventoryPurchaseService.getCostCodesByPerson()
281
282        render(view:'edit', model:[inventoryItemPurchaseInstance: result.inventoryItemPurchaseInstance,
283                                                'costCodes': costCodes])
284    }
285
286    def create = {
287        def inventoryItemPurchaseInstance = new InventoryItemPurchase()
288        inventoryItemPurchaseInstance.properties = params
289        params.returnTo = params.returnTo ?: 'inventoryItem'
290
291        if(!inventoryItemPurchaseInstance.inventoryItem) {
292            flash.message = "Please select an inventory item then the 'purchasing' tab."
293            redirect(controller: 'inventoryItemDetailed', action: 'search')
294            return
295        }
296
297        def costCodes = inventoryPurchaseService.getCostCodesByPerson()
298
299        return ['inventoryItemPurchaseInstance': inventoryItemPurchaseInstance,
300                        'costCodes': costCodes]
301    }
302
303    def save = {
304        def result = inventoryPurchaseService.save(params)
305
306        if(!result.error) {
307            flash.message = g.message(code: "default.create.success", args: ["Inventory Purchase", ''])
308            if(params.returnTo == 'inventoryItem') {
309                redirect(controller: 'inventoryItemDetailed',
310                                action: 'show',
311                                id: result.inventoryItemId,
312                                params: [showTab: "showPurchasingTab"])
313            }
314            else {
315                redirect(action: 'search')
316            }
317            return
318        }
319
320        def costCodes = inventoryPurchaseService.getCostCodesByPerson()
321
322        params.errorMessage = g.message(code: result.error.code, args: result.error.args)
323        render(view:'create', model:['inventoryItemPurchaseInstance': result.inventoryItemPurchaseInstance,
324                                                    'costCodes': costCodes])
325    }
326
327    def receive = {
328        def inventoryItemPurchaseInstance = InventoryItemPurchase.read( params.id )
329
330        if(!inventoryItemPurchaseInstance) {
331            flash.message = "InventoryItemPurchase not found with id ${params.id}"
332            redirect(controller: 'inventoryItemDetailed', action:'search')
333            return
334        }
335
336        inventoryItemPurchaseInstance.properties = params
337        params.returnTo = params.returnTo ?: 'inventoryItem'
338        def calcQuantities = inventoryPurchaseService.calcQuantities(inventoryItemPurchaseInstance)
339        inventoryItemPurchaseInstance.quantity = calcQuantities.thisOrderRemaining
340        inventoryItemPurchaseInstance.orderValueAmount = calcQuantities.thisOrderRemainingAmount
341        return ['inventoryItemPurchaseInstance':inventoryItemPurchaseInstance,
342                        'orderId': inventoryItemPurchaseInstance.id]
343    }
344
345    def receiveSave = {
346        def result = inventoryPurchaseService.receiveSave(params)
347
348        if(!result.error) {
349            flash.message = g.message(code: "default.create.success", args: ["Inventory Purchase", ''])
350            if(params.returnTo == 'inventoryItem') {
351                redirect(controller: 'inventoryItemDetailed',
352                                action: 'show',
353                                id: result.inventoryItemId,
354                                params: [showTab: "showPurchasingTab"])
355            }
356            else {
357                redirect(action: 'search')
358            }
359            return
360        }
361
362        flash.errorMessage = g.message(code: result.error.code, args: result.error.args)
363
364        if(result.error.code == "default.not.found") {
365            redirect(controller: 'inventoryItemDetailed', action: 'search')
366            return
367        }
368
369        // Prevent lazy initialization error.
370        result.inventoryItemPurchaseInstance.costCode.attach()
371
372        render(view:'receive',
373                        model:['inventoryItemPurchaseInstance': result.inventoryItemPurchaseInstance,
374                                    'orderId': result.orderId])
375    }
376
377    def approveInvoicePayment = {
378        // Read the values from Order Received.
379        def inventoryItemPurchaseInstance = InventoryItemPurchase.read( params.id )
380
381        if(!inventoryItemPurchaseInstance) {
382            flash.message = "InventoryItemPurchase not found with id ${params.id}"
383            redirect(controller: 'inventoryItemDetailed', action:'search')
384            return
385        }
386
387        inventoryItemPurchaseInstance.properties = params
388        params.returnTo = params.returnTo ?: 'inventoryItem'
389        return ['inventoryItemPurchaseInstance':inventoryItemPurchaseInstance,
390                        'receivedId': inventoryItemPurchaseInstance.id]
391    }
392
393    def approveInvoicePaymentSave = {
394        def result = inventoryPurchaseService.approveInvoicePaymentSave(params)
395
396        if(!result.error) {
397            flash.message = g.message(code: "default.create.success", args: ["Inventory Purchase", ''])
398            if(params.returnTo == 'inventoryItem') {
399                redirect(controller: 'inventoryItemDetailed',
400                                action: 'show',
401                                id: result.inventoryItemId,
402                                params: [showTab: "showPurchasingTab"])
403            }
404            else {
405                redirect(action: 'search')
406            }
407            return
408        }
409
410        if(result.error.code == "default.not.found") {
411            flash.errorMessage = g.message(code: result.error.code, args: result.error.args)
412            redirect(controller: 'inventoryItemDetailed', action: 'search')
413            return
414        }
415
416        // Prevent lazy initialization error.
417        result.inventoryItemPurchaseInstance.costCode.attach()
418
419        render(view:'approveInvoicePayment',
420                    model:['inventoryItemPurchaseInstance': result.inventoryItemPurchaseInstance,
421                                    'receivedId': result.receivedId])
422    }
423}
Note: See TracBrowser for help on using the repository browser.