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

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

Arrange and add some fields to the InventoryItemPurchase search page export function.

File size: 19.5 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", "inventoryItem.description", "inventoryItem.name", "orderValueAmount",
157                            "orderValueCurrency", "purchaseOrderNumber", "date", "costCode", "invoiceNumber",
158                                    "inventoryItemPurchaseType"]
159            Map labels = ["quantity": "Quantity", "inventoryItem.description": "Description",
160                            "inventoryItem.name": "Name", "orderValueAmount": "Order Value",
161                            "orderValueCurrency": "Currency",
162                            "purchaseOrderNumber": "P/Order Number", "date": "Date", "costCode": "Cost Code",
163                            "invoiceNumber": "Invoice Number",
164                            "inventoryItemPurchaseType": "Type"]
165            Map formatters = [ date: dateFmt]
166            Map parameters = [title: title, separator: ","]
167
168            exportService.export(params.format, response.outputStream, inventoryItemPurchaseList, fields, labels, formatters, parameters)
169        }
170
171        // Add some basic params to filterParams.
172        filterParams.max = params.max
173        filterParams.offset = params.offset?.toInteger() ?: 0
174        filterParams.sort = params.sort ?: "purchaseOrderNumber"
175        filterParams.order = params.order ?: "desc"
176
177        // Get some associatedProperty values for filterpane.
178        def associatedPropertyValues = [:]
179        def startOfYearRange = dateUtilService.getYearFromDate(dateUtilService.plusYear(new Date(), -10))
180        def endOfYearRange = dateUtilService.getYearFromDate(dateUtilService.plusYear(new Date(), 10))
181        associatedPropertyValues.yearRange = startOfYearRange..endOfYearRange
182
183        return[ inventoryItemPurchaseList: inventoryItemPurchaseList,
184                        inventoryItemPurchaseTotal: inventoryItemPurchaseTotal,
185                        filterParams: filterParams,
186                        associatedPropertyValues: associatedPropertyValues ]
187
188    } // end search()
189
190    def show = {
191        def inventoryItemPurchaseInstance = InventoryItemPurchase.read( params.id )
192        params.returnTo = params.returnTo ?: 'inventoryItem'
193
194        if(!inventoryItemPurchaseInstance) {
195            flash.message = "InventoryItemPurchase not found with id ${params.id}"
196            redirect(controller: 'inventoryItemDetailed', action:'search')
197        }
198        else { return [ inventoryItemPurchaseInstance : inventoryItemPurchaseInstance ] }
199    }
200
201    def delete = {
202        def result = inventoryPurchaseService.delete(params)
203
204        if(!result.error) {
205            flash.message = g.message(code: "default.delete.success", args: ["InventoryItemPurchase", params.id])
206            if(params.returnTo == 'inventoryItem') {
207                redirect(controller: 'inventoryItemDetailed',
208                                action: 'show',
209                                id: result.inventoryItemId,
210                                params: [showTab: "showPurchasingTab"])
211            }
212            else {
213                redirect(action: 'search')
214            }
215            return
216        }
217
218        flash.errorMessage = g.message(code: result.error.code, args: result.error.args)
219
220        if(result.error.code == "default.not.found") {
221            redirect(controller: 'inventoryItemDetailed', action: 'search')
222            return
223        }
224
225        redirect(action:show, id: params.id)
226    }
227
228    def edit = {
229        def result = inventoryPurchaseService.edit(params)
230        params.returnTo = params.returnTo ?: 'inventoryItem'
231
232        def costCodes = []
233
234        if(!result.error) {
235            if(inventoryPurchaseService.isPersonInPurchasingGroup(result.inventoryItemPurchaseInstance.costCode.purchasingGroup))
236                costCodes = inventoryPurchaseService.getCostCodesByPerson()
237
238            return [ inventoryItemPurchaseInstance : result.inventoryItemPurchaseInstance,
239                            'costCodes': costCodes ]
240        }
241
242        flash.errorMessage = g.message(code: result.error.code, args: result.error.args)
243        redirect(controller: 'inventoryItemDetailed', action:'search', params:params)
244    }
245
246    def update = {
247        def result = inventoryPurchaseService.update(params)
248
249        if(!result.error) {
250            flash.message = g.message(code: "default.update.success", args: ["Inventory Purchase", params.id])
251            redirect(action:show, id: params.id)
252            return
253        }
254
255        if(result.error.code == "default.not.found") {
256            flash.message = g.message(code: result.error.code, args: result.error.args)
257            redirect(controller: 'inventoryItemDetailed', action:'search', params:params)
258            return
259        }
260
261        result.inventoryItemPurchaseInstance.attach()
262        result.inventoryItemPurchaseInstance.costCode.attach()
263        result.inventoryItemPurchaseInstance.costCode.purchasingGroup.attach()
264
265        def costCodes = []
266        if(inventoryPurchaseService.isPersonInPurchasingGroup(result.inventoryItemPurchaseInstance.costCode.purchasingGroup))
267            costCodes = inventoryPurchaseService.getCostCodesByPerson()
268
269        render(view:'edit', model:[inventoryItemPurchaseInstance: result.inventoryItemPurchaseInstance,
270                                                'costCodes': costCodes])
271    }
272
273    def create = {
274        def inventoryItemPurchaseInstance = new InventoryItemPurchase()
275        inventoryItemPurchaseInstance.properties = params
276        params.returnTo = params.returnTo ?: 'inventoryItem'
277
278        if(!inventoryItemPurchaseInstance.inventoryItem) {
279            flash.message = "Please select an inventory item then the 'purchasing' tab."
280            redirect(controller: 'inventoryItemDetailed', action: 'search')
281            return
282        }
283
284        def costCodes = inventoryPurchaseService.getCostCodesByPerson()
285
286        return ['inventoryItemPurchaseInstance': inventoryItemPurchaseInstance,
287                        'costCodes': costCodes]
288    }
289
290    def save = {
291        def result = inventoryPurchaseService.save(params)
292
293        if(!result.error) {
294            flash.message = g.message(code: "default.create.success", args: ["Inventory Purchase", ''])
295            if(params.returnTo == 'inventoryItem') {
296                redirect(controller: 'inventoryItemDetailed',
297                                action: 'show',
298                                id: result.inventoryItemId,
299                                params: [showTab: "showPurchasingTab"])
300            }
301            else {
302                redirect(action: 'search')
303            }
304            return
305        }
306
307        def costCodes = inventoryPurchaseService.getCostCodesByPerson()
308
309        params.errorMessage = g.message(code: result.error.code, args: result.error.args)
310        render(view:'create', model:['inventoryItemPurchaseInstance': result.inventoryItemPurchaseInstance,
311                                                    'costCodes': costCodes])
312    }
313
314    def receive = {
315        def inventoryItemPurchaseInstance = InventoryItemPurchase.read( params.id )
316
317        if(!inventoryItemPurchaseInstance) {
318            flash.message = "InventoryItemPurchase not found with id ${params.id}"
319            redirect(controller: 'inventoryItemDetailed', action:'search')
320            return
321        }
322
323        inventoryItemPurchaseInstance.properties = params
324        params.returnTo = params.returnTo ?: 'inventoryItem'
325        def calcQuantities = inventoryPurchaseService.calcQuantities(inventoryItemPurchaseInstance)
326        inventoryItemPurchaseInstance.quantity = calcQuantities.thisOrderRemaining
327        inventoryItemPurchaseInstance.orderValueAmount = calcQuantities.thisOrderRemainingAmount
328        return ['inventoryItemPurchaseInstance':inventoryItemPurchaseInstance,
329                        'orderId': inventoryItemPurchaseInstance.id]
330    }
331
332    def receiveSave = {
333        def result = inventoryPurchaseService.receiveSave(params)
334
335        if(!result.error) {
336            flash.message = g.message(code: "default.create.success", args: ["Inventory Purchase", ''])
337            if(params.returnTo == 'inventoryItem') {
338                redirect(controller: 'inventoryItemDetailed',
339                                action: 'show',
340                                id: result.inventoryItemId,
341                                params: [showTab: "showPurchasingTab"])
342            }
343            else {
344                redirect(action: 'search')
345            }
346            return
347        }
348
349        flash.errorMessage = g.message(code: result.error.code, args: result.error.args)
350
351        if(result.error.code == "default.not.found") {
352            redirect(controller: 'inventoryItemDetailed', action: 'search')
353            return
354        }
355
356        // Prevent lazy initialization error.
357        result.inventoryItemPurchaseInstance.costCode.attach()
358
359        render(view:'receive',
360                        model:['inventoryItemPurchaseInstance': result.inventoryItemPurchaseInstance,
361                                    'orderId': result.orderId])
362    }
363
364    def approveInvoicePayment = {
365        // Read the values from Order Received.
366        def inventoryItemPurchaseInstance = InventoryItemPurchase.read( params.id )
367
368        if(!inventoryItemPurchaseInstance) {
369            flash.message = "InventoryItemPurchase not found with id ${params.id}"
370            redirect(controller: 'inventoryItemDetailed', action:'search')
371            return
372        }
373
374        inventoryItemPurchaseInstance.properties = params
375        params.returnTo = params.returnTo ?: 'inventoryItem'
376        return ['inventoryItemPurchaseInstance':inventoryItemPurchaseInstance,
377                        'receivedId': inventoryItemPurchaseInstance.id]
378    }
379
380    def approveInvoicePaymentSave = {
381        def result = inventoryPurchaseService.approveInvoicePaymentSave(params)
382
383        if(!result.error) {
384            flash.message = g.message(code: "default.create.success", args: ["Inventory Purchase", ''])
385            if(params.returnTo == 'inventoryItem') {
386                redirect(controller: 'inventoryItemDetailed',
387                                action: 'show',
388                                id: result.inventoryItemId,
389                                params: [showTab: "showPurchasingTab"])
390            }
391            else {
392                redirect(action: 'search')
393            }
394            return
395        }
396
397        if(result.error.code == "default.not.found") {
398            flash.errorMessage = g.message(code: result.error.code, args: result.error.args)
399            redirect(controller: 'inventoryItemDetailed', action: 'search')
400            return
401        }
402
403        // Prevent lazy initialization error.
404        result.inventoryItemPurchaseInstance.costCode.attach()
405
406        render(view:'approveInvoicePayment',
407                    model:['inventoryItemPurchaseInstance': result.inventoryItemPurchaseInstance,
408                                    'receivedId': result.receivedId])
409    }
410}
Note: See TracBrowser for help on using the repository browser.