source: branches/features/purchaseOrders/grails-app/controllers/InventoryItemPurchaseDetailedController.groovy @ 891

Last change on this file since 891 was 891, checked in by gav, 13 years ago

Purchase Order first draft as per ticket #30, by John Yesberg.

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    def purchaseOrderService
14
15    def index = {
16        redirect(action:'search', params:params)
17    }
18
19    // the delete, save and update actions only accept POST requests
20    static allowedMethods = [delete:'POST', save:'POST', update:'POST']
21
22    def setSearchParamsMax = {
23        def max = 1000
24        if(params.newMax?.isInteger()) {
25            def i = params.newMax.toInteger()
26            if(i > 0 && i <= max)
27                session.inventoryItemPurchaseSearchParamsMax = params.newMax
28            if(i > max)
29                session.inventoryItemPurchaseSearchParamsMax = max
30        }
31        forward(action: 'search', params: params)
32    }
33
34    def search = {
35
36        if(session.inventoryItemPurchaseSearchParamsMax)
37            params.max = session.inventoryItemPurchaseSearchParamsMax
38
39        // Protect filterPane.
40        params.max = Math.min( params.max ? params.max.toInteger() : 10,  1000 )
41        params.offset = params.offset?.toInteger() ?: 0
42
43        def inventoryItemPurchaseList = []
44        def inventoryItemPurchaseTotal
45        def filterParams = com.zeddware.grails.plugins.filterpane.FilterUtils.extractFilterParams(params)
46        def isFilterApplied = FilterUtils.isFilterApplied(params)
47
48        // Restore search unless a new search is being requested.
49        if(!params.quickSearch && !filterParams) {
50            if(session.inventoryItemPurchaseQuickSearch)
51                params.quickSearch = session.inventoryItemPurchaseQuickSearch
52            else if(session.inventoryItemPurchaseSearchFilterParams) {
53                session.inventoryItemPurchaseSearchFilterParams.each() { params[it.key] = it.value }
54                params.filter = session.inventoryItemPurchaseSearchFilter
55                isFilterApplied = FilterUtils.isFilterApplied(params)
56            }
57        }
58
59        // Remember sort if supplied, otherwise try to restore.
60        if(params.sort && params.order) {
61            // Reset to defaultSort if requested.
62            if(params.sort == 'defaultSort') {
63                params.sort = null
64                params.order = null
65                session.removeAttribute("inventoryItemPurchaseSearchSort")
66                session.removeAttribute("inventoryItemPurchaseSearchOrder")
67            }
68            else {
69                session.inventoryItemPurchaseSearchSort = params.sort
70                session.inventoryItemPurchaseSearchOrder = params.order
71            }
72        }
73        else if(session.inventoryItemPurchaseSearchSort && session.inventoryItemPurchaseSearchOrder) {
74            params.sort = session.inventoryItemPurchaseSearchSort
75            params.order = session.inventoryItemPurchaseSearchOrder
76        }
77        else {
78            params.sort = "id"
79            params.order = "asc"
80        }
81
82        if(isFilterApplied) {
83            // filterPane:
84            //if(params.sort == "attentionFlag") // See ticket #64 in Trac.
85                //params.sort = "id"
86
87            // Call filterService.
88            inventoryItemPurchaseList = filterService.filter( params, InventoryItemPurchase )
89            inventoryItemPurchaseTotal = filterService.count( params, InventoryItemPurchase )
90            filterParams = com.zeddware.grails.plugins.filterpane.FilterUtils.extractFilterParams(params)
91            // Remember search.
92            session.inventoryItemPurchaseSearchFilterParams = new LinkedHashMap(filterParams)
93            session.inventoryItemPurchaseSearchFilter = new LinkedHashMap(params.filter)
94            session.removeAttribute("inventoryItemPurchaseQuickSearch")
95        }
96        else {
97            // Quick Search:
98
99            if(params.quickSearch == "searchAllOrders") {
100                def orderType = InventoryItemPurchaseType.read(1)
101                inventoryItemPurchaseList = InventoryItemPurchase.findAllByInventoryItemPurchaseType(orderType,
102                                                                                                                                                                [max:params.max,
103                                                                                                                                                                offset:params.offset,
104                                                                                                                                                                sort:params.sort,
105                                                                                                                                                                order:params.order])
106                inventoryItemPurchaseTotal = InventoryItemPurchase.countByInventoryItemPurchaseType(orderType)
107                if(inventoryItemPurchaseTotal > 0) { params.message = "All Orders." }
108                else { params.message = "No orders found." }
109            }
110            else if(params.quickSearch == "searchAllReceived") {
111                def receivedBackOrderType = InventoryItemPurchaseType.read(2)
112                def receivedCompleteType = InventoryItemPurchaseType.read(3)
113                inventoryItemPurchaseList = InventoryItemPurchase.findAllByInventoryItemPurchaseTypeOrInventoryItemPurchaseType(receivedBackOrderType,
114                                                                                                                                                                                                                receivedCompleteType,
115                                                                                                                                                                                                                [max:params.max,
116                                                                                                                                                                                                                offset:params.offset,
117                                                                                                                                                                                                                sort:params.sort,
118                                                                                                                                                                                                                order:params.order])
119                inventoryItemPurchaseTotal = InventoryItemPurchase.countByInventoryItemPurchaseTypeOrInventoryItemPurchaseType(receivedBackOrderType,
120                                                                                                                                                                                                                receivedCompleteType)
121                if(inventoryItemPurchaseTotal > 0) { params.message = "All Received." }
122                else { params.message = "No orders found." }
123            }
124            else {
125                //Default:
126                inventoryItemPurchaseList = InventoryItemPurchase.list(max:params.max,
127                                                                                                            offset:params.offset,
128                                                                                                            sort:params.sort,
129                                                                                                            order:params.order)
130                inventoryItemPurchaseTotal = InventoryItemPurchase.count()
131                if(inventoryItemPurchaseTotal > 0) { params.message = "All Purchases." }
132                else { params.message = "No orders found." }
133            }
134
135            filterParams.quickSearch = params.quickSearch
136            // Remember search.
137            session.removeAttribute("inventoryItemPurchaseSearchFilterParams")
138            session.removeAttribute("inventoryItemPurchaseSearchFilter")
139            session.inventoryItemPurchaseQuickSearch = params.quickSearch
140        }
141
142        // export plugin:
143        if(params?.format && params.format != "html") {
144
145            def dateFmt = { date ->
146                formatDate(format: "EEE, dd-MMM-yyyy", date: date)
147            }
148
149            String title
150            if(params.quickSearch)
151                title = "${params.quickSearch} inventory purchases."
152            else
153                title = "Filtered inventory purchases."
154
155            response.contentType = ConfigurationHolder.config.grails.mime.types[params.format]
156            response.setHeader("Content-disposition", "attachment; filename=Purchases.${params.extension}")
157            List fields = ["purchaseOrderNumber", "date", "costCode", "quantity", "orderValueAmount", "invoiceNumber",
158                                    "inventoryItemPurchaseType"]
159            Map labels = ["purchaseOrderNumber": "Order Number", "date": "Date", "costCode": "Cost Code",
160                                    "quantity": "Quantity", "orderValueAmount": "Order \$", "invoiceNumber": "Invoice Number",
161                                    "inventoryItemPurchaseType": "Type"]
162            Map formatters = [ date: dateFmt]
163            Map parameters = [title: title, separator: ","]
164
165            exportService.export(params.format, response.outputStream, inventoryItemPurchaseList, fields, labels, formatters, parameters)
166        }
167
168        // Add some basic params to filterParams.
169        filterParams.max = params.max
170        filterParams.offset = params.offset?.toInteger() ?: 0
171        filterParams.sort = params.sort ?: "purchaseOrderNumber"
172        filterParams.order = params.order ?: "desc"
173
174        // Get some associatedProperty values for filterpane.
175        def associatedPropertyValues = [:]
176        def startOfYearRange = dateUtilService.getYearFromDate(dateUtilService.plusYear(new Date(), -10))
177        def endOfYearRange = dateUtilService.getYearFromDate(dateUtilService.plusYear(new Date(), 10))
178        associatedPropertyValues.yearRange = startOfYearRange..endOfYearRange
179
180        return[ inventoryItemPurchaseList: inventoryItemPurchaseList,
181                        inventoryItemPurchaseTotal: inventoryItemPurchaseTotal,
182                        filterParams: filterParams,
183                        associatedPropertyValues: associatedPropertyValues ]
184
185    } // end search()
186
187    def show = {
188        def inventoryItemPurchaseInstance = InventoryItemPurchase.read( params.id )
189        params.returnTo = params.returnTo ?: 'inventoryItem'
190
191        if(!inventoryItemPurchaseInstance) {
192            flash.message = "InventoryItemPurchase not found with id ${params.id}"
193            redirect(controller: 'inventoryItemDetailed', action:'search')
194        }
195        else { return [ inventoryItemPurchaseInstance : inventoryItemPurchaseInstance ] }
196    }
197
198    def delete = {
199        def result = inventoryPurchaseService.delete(params)
200
201        if(!result.error) {
202            flash.message = g.message(code: "default.delete.success", args: ["InventoryItemPurchase", params.id])
203            if(params.returnTo == 'inventoryItem') {
204                redirect(controller: 'inventoryItemDetailed',
205                                action: 'show',
206                                id: result.inventoryItemId,
207                                params: [showTab: "showPurchasingTab"])
208            }
209            else {
210                redirect(action: 'search')
211            }
212            return
213        }
214
215        flash.errorMessage = g.message(code: result.error.code, args: result.error.args)
216
217        if(result.error.code == "default.not.found") {
218            redirect(controller: 'inventoryItemDetailed', action: 'search')
219            return
220        }
221
222        redirect(action:show, id: params.id)
223    }
224
225    def edit = {
226        def result = inventoryPurchaseService.edit(params)
227        params.returnTo = params.returnTo ?: 'inventoryItem'
228
229        def costCodes = []
230
231        if(!result.error) {
232            if(inventoryPurchaseService.isPersonInPurchasingGroup(result.inventoryItemPurchaseInstance.costCode.purchasingGroup))
233                costCodes = inventoryPurchaseService.getCostCodesByPerson()
234
235            return [ inventoryItemPurchaseInstance : result.inventoryItemPurchaseInstance,
236                            'costCodes': costCodes ]
237        }
238
239        flash.errorMessage = g.message(code: result.error.code, args: result.error.args)
240        redirect(controller: 'inventoryItemDetailed', action:'search', params:params)
241    }
242
243    def update = {
244        def result = inventoryPurchaseService.update(params)
245
246        if(!result.error) {
247            flash.message = g.message(code: "default.update.success", args: ["Inventory Purchase", params.id])
248            redirect(action:show, id: params.id)
249            return
250        }
251
252        if(result.error.code == "default.not.found") {
253            flash.message = g.message(code: result.error.code, args: result.error.args)
254            redirect(controller: 'inventoryItemDetailed', action:'search', params:params)
255            return
256        }
257
258        result.inventoryItemPurchaseInstance.attach()
259        result.inventoryItemPurchaseInstance.costCode.attach()
260        result.inventoryItemPurchaseInstance.costCode.purchasingGroup.attach()
261
262        def costCodes = []
263        if(inventoryPurchaseService.isPersonInPurchasingGroup(result.inventoryItemPurchaseInstance.costCode.purchasingGroup))
264            costCodes = inventoryPurchaseService.getCostCodesByPerson()
265
266        render(view:'edit', model:[inventoryItemPurchaseInstance: result.inventoryItemPurchaseInstance,
267                                                'costCodes': costCodes])
268    }
269
270    def create = {
271        def inventoryItemPurchaseInstance = new InventoryItemPurchase()
272        inventoryItemPurchaseInstance.properties = params
273        params.returnTo = params.returnTo ?: 'inventoryItem'
274
275        if(!inventoryItemPurchaseInstance.inventoryItem) {
276            flash.message = "Please select an inventory item then the 'purchasing' tab."
277            redirect(controller: 'inventoryItemDetailed', action: 'search')
278            return
279        }
280
281        def costCodes = inventoryPurchaseService.getCostCodesByPerson()
282
283        def purchaseOrderNumbers = [purchaseOrderService.findNextUnusedPurchaseOrderNumber()]
284        purchaseOrderNumbers += purchaseOrderService.findDraftPurchaseOrderNumbers()
285
286        return ['inventoryItemPurchaseInstance': inventoryItemPurchaseInstance,
287                        'costCodes': costCodes, purchaseOrderNumbers:purchaseOrderNumbers]
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.