source: trunk/grails-app/controllers/InventoryItemDetailedController.groovy @ 423

Last change on this file since 423 was 423, checked in by gav, 14 years ago

Add Inventory import/export functionality.

File size: 12.0 KB
Line 
1import org.codehaus.groovy.grails.plugins.springsecurity.Secured
2import org.codehaus.groovy.grails.commons.ConfigurationHolder
3
4@Secured(['ROLE_AppAdmin', 'ROLE_Manager', 'ROLE_InventoryManager'])
5class InventoryItemDetailedController extends BaseController {
6
7    def filterService
8    def exportService
9    def inventoryCsvService
10    def inventoryItemService
11    def inventoryMovementService
12
13    // the delete, save and update actions only accept POST requests
14    static allowedMethods = [delete:'POST', save:'POST', update:'POST', useInventoryItem:'POST']
15
16    @Secured(['ROLE_AppAdmin', 'ROLE_Manager', 'ROLE_InventoryManager', 'ROLE_InventoryUser'])
17    def index = { redirect(action:search, params:params) }
18
19    /**
20    * Set session.inventoryItemSearchParamsMax
21    */
22    @Secured(['ROLE_AppAdmin', 'ROLE_Manager', 'ROLE_InventoryManager', 'ROLE_InventoryUser'])
23    def setSearchParamsMax = {
24        def max = 1000
25        if(params.newMax.isInteger()) {
26            def i = params.newMax.toInteger()
27            if(i > 0 && i <= max)
28                session.inventoryItemSearchParamsMax = params.newMax
29            if(i > max)
30                session.inventoryItemSearchParamsMax = max
31        }
32        forward(action: 'search', params: params)
33    }
34
35    /**
36    * Disaply the import view.
37    */
38    def importInventory = {
39    }
40
41    /**
42    * Handle the import save.
43    */
44    def importInventorySave = {
45        def result = inventoryCsvService.importInventory(request)
46
47        if(!result.error) {
48            flash.message = g.message(code: "inventory.import.success")
49            redirect(action:search)
50            return
51        }
52
53        flash.errorMessage = g.message(code: result.error.code, args: result.error.args)
54        redirect(action: importInventory)
55    }
56
57    /**
58    * Export a csv template.
59    * NOTE: IE has a 'validating' bug in dev mode that causes the export to take a long time!
60    * This does not appear to be a problem once deployed to Tomcat.
61    */
62    @Secured(['ROLE_AppAdmin', 'ROLE_Manager', 'ROLE_InventoryManager', 'ROLE_InventoryUser'])
63    def exportInventoryTemplate = {
64        response.contentType = ConfigurationHolder.config.grails.mime.types["csv"]
65        response.setHeader("Content-disposition", "attachment; filename=InventoryTemplate.csv")
66        def s = inventoryCsvService.buildInventoryTemplate()
67        render s
68    }
69
70    /**
71    * Export a csv test file.
72    */
73    def exportInventoryExample = {
74        response.contentType = ConfigurationHolder.config.grails.mime.types["csv"]
75        response.setHeader("Content-disposition", "attachment; filename=InventoryExample.csv")
76        def s = inventoryCsvService.buildInventoryExample()
77        render s
78    }
79
80    /**
81    * Export the entire inventory as a csv file.
82    */
83    @Secured(['ROLE_AppAdmin', 'ROLE_Manager', 'ROLE_InventoryManager', 'ROLE_InventoryUser'])
84    def exportInventory = {
85
86        def inventoryItemList = InventoryItem.list()
87
88        response.contentType = ConfigurationHolder.config.grails.mime.types["csv"]
89        response.setHeader("Content-disposition", "attachment; filename=Inventory.csv")
90        def s = inventoryCsvService.buildInventory(inventoryItemList)
91        render s
92    }
93
94    @Secured(['ROLE_AppAdmin', 'ROLE_Manager', 'ROLE_InventoryManager', 'ROLE_InventoryUser'])
95    def search = {
96
97        if(session.inventoryItemSearchParamsMax)
98            params.max = session.inventoryItemSearchParamsMax
99
100        params.max = Math.min( params.max ? params.max.toInteger() : 10,  100)
101
102        def inventoryItemInstanceList = []
103        def inventoryItemInstanceTotal
104        def filterParams = [:]
105
106        // Quick Search:
107        if(!params.filter) {
108            inventoryItemInstanceList = InventoryItem.list( params )
109            inventoryItemInstanceTotal = InventoryItem.count()
110            filterParams = params
111        }
112        else {
113        // filterPane:
114            inventoryItemInstanceList = filterService.filter( params, InventoryItem )
115            inventoryItemInstanceTotal = filterService.count( params, InventoryItem )
116            filterParams = com.zeddware.grails.plugins.filterpane.FilterUtils.extractFilterParams(params)
117        }
118
119        // export plugin:
120        if(params?.format && params.format != "html") {
121
122            def dateFmt = { date ->
123                formatDate(format: "EEE, dd-MMM-yyyy", date: date)
124            }
125            String title = "Inventory List."
126
127            response.contentType = ConfigurationHolder.config.grails.mime.types[params.format]
128            response.setHeader("Content-disposition", "attachment; filename=Inventory.${params.extension}")
129            List fields = ["name",
130                                "description",
131                                "unitsInStock",
132                                "unitOfMeasure",
133                                "inventoryLocation",
134                                "inventoryLocation.inventoryStore"]
135            Map labels = ["name": "Name",
136                                "description": "Description",
137                                "unitsInStock":"In Stock",
138                                "unitOfMeasure": "UOM",
139                                "inventoryLocation": "Location",
140                                "inventoryLocation.inventoryStore": "Store"]
141
142            Map formatters = [:]
143            Map parameters = [title: title, separator: ","]
144
145            exportService.export(params.format,
146                                                response.outputStream,
147                                                inventoryItemInstanceList.sort { p1, p2 -> p1.name.compareToIgnoreCase(p2.name) },
148                                                fields,
149                                                labels,
150                                                formatters,
151                                                parameters)
152        }
153
154        // Add some basic params to filterParams.
155        filterParams.max = params.max
156        filterParams.offset = params.offset?.toInteger() ?: 0
157        filterParams.sort = params.sort ?: "id"
158        filterParams.order = params.order ?: "desc"
159
160        return[ inventoryItemInstanceList: inventoryItemInstanceList,
161                inventoryItemInstanceTotal: inventoryItemInstanceTotal,
162                filterParams: filterParams ]
163    } // end search()
164
165    /**
166    * Simply assigns a passed in task id to a session variable and redirects to search.
167    */
168    @Secured(['ROLE_AppAdmin', 'ROLE_Manager', 'ROLE_InventoryManager', 'ROLE_InventoryUser'])
169    def findInventoryItemForMovement = {
170        if(!params.task?.id) {
171            flash.message = "No task id supplied, please select a task then the inventory tab."
172            redirect(controller: "taskDetailed", action: "search")
173            return
174        }
175
176        session.inventoryMovementTaskId = params.task.id
177        flash.message = "Please find and then select the inventory item."
178        redirect(action: search)
179    }
180
181    @Secured(['ROLE_AppAdmin', 'ROLE_Manager', 'ROLE_InventoryManager', 'ROLE_InventoryUser'])
182    def show = {
183
184        // In the case of an actionSubmit button, rewrite action name from 'index'.
185        if(params._action_Show)
186            params.action='show'
187
188        def result = inventoryItemService.show(params)
189
190        if(!result.error) {
191
192            def model = [ inventoryItemInstance: result.inventoryItemInstance,
193                                    inventoryMovementList: result.inventoryMovementList,
194                                    inventoryMovementListTotal: result.inventoryMovementListTotal,
195                                    inventoryMovementListMax: result.inventoryMovementListMax,
196                                    showTab: result.showTab]
197
198            if(session.inventoryMovementTaskId) {
199                model.inventoryMovementInstance = new InventoryMovement()
200                model.inventoryMovementInstance.task = Task.get(session.inventoryMovementTaskId)
201                model.inventoryMovementInstance.quantity = 1
202            }
203
204            // Success.
205            return model
206        }
207
208        flash.errorMessage = g.message(code: result.error.code, args: result.error.args)
209        redirect(action:search)
210        return
211    }
212
213    def delete = {
214        def result = inventoryItemService.delete(params)
215
216        if(!result.error) {
217            flash.message = g.message(code: "default.delete.success", args: ["InventoryItem", params.id])
218            redirect(action:search)
219            return
220        }
221
222        flash.errorMessage = g.message(code: result.error.code, args: result.error.args)
223
224        if(result.error.code == "default.not.found") {
225            redirect(action:search)
226            return
227        }
228
229        redirect(action:show, id: params.id)
230    }
231
232    def edit = {
233
234        // In the case of an actionSubmit button, rewrite action name from 'index'.
235        if(params._action_Edit)
236            params.action='edit'
237
238        def result = inventoryItemService.edit(params)
239
240        if(!result.error)
241            return [ inventoryItemInstance : result.inventoryItemInstance ]
242
243        flash.errorMessage = g.message(code: result.error.code, args: result.error.args)
244        redirect(action:search)
245    }
246
247    def update = {
248        def result = inventoryItemService.update(params)
249
250        if(!result.error) {
251            flash.message = g.message(code: "default.update.success", args: ["InventoryItem", params.id])
252            redirect(action:show, id: params.id)
253            return
254        }
255
256        if(result.error.code == "default.not.found") {
257            flash.errorMessage = g.message(code: result.error.code, args: result.error.args)
258            redirect(action:search)
259            return
260        }
261
262        render(view:'edit', model:[inventoryItemInstance: result.inventoryItemInstance.attach()])
263    }
264
265    def create = {
266        def result = inventoryItemService.create(params)
267
268        if(!result.error)
269            return [inventoryItemInstance: result.inventoryItemInstance]
270
271        //flash.errorMessage = g.message(code: result.error.code, args: result.error.args)
272        redirect(action: search)
273    }
274
275    def save = {
276        def result = inventoryItemService.save(params)
277
278        if(!result.error) {
279            flash.message = g.message(code: "default.create.success", args: ["InventoryItem", result.inventoryItemInstance.id])
280            redirect(action:show, id: result.inventoryItemInstance.id)
281            return
282        }
283
284        //flash.errorMessage = g.message(code: result.error.code, args: result.error.args)
285        render(view:'create', model:[inventoryItemInstance: result.inventoryItemInstance])
286    }
287
288    /**
289    * Handles the use inventory item form submit in the show view.
290    */
291    @Secured(['ROLE_AppAdmin', 'ROLE_Manager', 'ROLE_InventoryManager', 'ROLE_InventoryUser'])
292    def useInventoryItem = {
293
294        params.inventoryMovementType = InventoryMovementType.get(1) // Set type to "Used".
295        def result = inventoryMovementService.move(params)
296
297        if(!result.error) {
298            flash.message = "Inventory Movement for ${result.inventoryMovementInstance.inventoryItem.name.encodeAsHTML()} created."
299            redirect(controller:"taskDetailed", action:"show", id: result.taskId)
300        }
301        else {
302            if(result.inventoryMovementInstance) {
303                def p = [:]
304                p.id = result.inventoryMovementInstance.inventoryItem?.id
305                def r = inventoryItemService.show(p)
306
307                def model = [ inventoryItemInstance: r.inventoryItemInstance,
308                                        inventoryMovementList: r.inventoryMovementList,
309                                        inventoryMovementListTotal: r.inventoryMovementListTotal,
310                                        inventoryMovementListMax: r.inventoryMovementListMax,
311                                        showTab: r.showTab]
312
313                model.inventoryMovementInstance = result.inventoryMovementInstance
314
315                render(view: 'show', model: model)
316            }
317            else {
318                flash.message = "Could not create inventory movement."
319                redirect(action:"search")
320            }
321
322        }
323    }
324
325}
Note: See TracBrowser for help on using the repository browser.