source: trunk/grails-app/services/InventoryMovementService.groovy @ 406

Last change on this file since 406 was 406, checked in by gav, 10 years ago

Fix a bug in inventory movement when no task present.

File size: 6.5 KB
Line 
1class InventoryMovementService {
2
3    boolean transactional = false
4
5    def authService
6
7    def reverseMove(params) {
8        InventoryMovement.withTransaction { status ->
9            def result = [:]
10            result.inventoryMovementInstance = InventoryMovement.lock(params.id)
11            if(result.inventoryMovementInstance) {
12
13                // Used type must have a task that is not complete or in the trash
14                if(result.inventoryMovementInstance.inventoryMovementType.id == 1)  {
15
16                    // Unlike move, if the task does not exist at all then deletion is still allowed.
17                    if(result.inventoryMovementInstance.task?.trash) {
18                        status.setRollbackOnly()
19                        result.inventoryMovementInstance.errors.rejectValue("task", "task.operationNotPermittedOnTaskInTrash")
20                        result.error = true
21                        return result
22                    }
23
24                    if(result.inventoryMovementInstance.task?.taskStatus?.id == 3) {
25                        status.setRollbackOnly()
26                        result.inventoryMovementInstance.errors.rejectValue('task', "task.operationNotPermittedOnCompleteTask")
27                        result.error = true
28                        return result
29                    }
30                }
31
32                result.inventoryItemInstance = InventoryItem.lock(result.inventoryMovementInstance.inventoryItem.id)
33                result.taskId = result.inventoryMovementInstance.task?.id
34
35                if(!result.inventoryItemInstance) {
36                        status.setRollbackOnly()
37                        result.inventoryMovementInstance.errors.rejectValue('inventoryItem', "inventoryMovement.inventoryItem.notFound")
38                        result.error = true
39                        return result
40                }
41
42                // Reverse the movement of inventory.
43                if(!result.inventoryMovementInstance.inventoryMovementType.incrementsInventory) {
44                    result.inventoryItemInstance.unitsInStock += result.inventoryMovementInstance.quantity
45                }
46                else {
47                    if(result.inventoryItemInstance.unitsInStock >= result.inventoryMovementInstance.quantity) {
48                        result.inventoryItemInstance.unitsInStock -= result.inventoryMovementInstance.quantity
49                    }
50                    else {
51                        status.setRollbackOnly()
52                        result.inventoryMovementInstance.errors.rejectValue('quantity', "inventoryMovement.quantity.insufficientItemsInStock")
53                        result.error = true
54                        return result
55                    }
56                }
57
58                if(result.inventoryItemInstance.save() ) {
59                    // All went well if we get to this point.
60                    result.inventoryMovementInstance.delete()
61                    return result
62                }
63                else {
64                    status.setRollbackOnly()
65                    result.error = true
66                    return result
67                }
68
69            }
70            else {
71                result.error = true
72                return result
73            }
74
75        } // end withTransaction
76    } //end reverseMove()
77
78    def move(params) {
79        InventoryMovement.withTransaction { status ->
80            def result = [:]
81            result.inventoryMovementInstance = new InventoryMovement(params)
82
83            result.inventoryMovementInstance.person = authService.currentUser
84
85            // Used type must have a task that is not complete or in the trash
86            if(result.inventoryMovementInstance.inventoryMovementType.id == 1)  {
87
88                if(!result.inventoryMovementInstance.task) {
89                    status.setRollbackOnly()
90                    result.inventoryMovementInstance.errors.rejectValue('task', "task.notFound")
91                    result.error = true
92                    return result
93                }
94
95                if(result.inventoryMovementInstance.task.trash) {
96                    status.setRollbackOnly()
97                    result.inventoryMovementInstance.errors.rejectValue("task", "task.operationNotPermittedOnTaskInTrash")
98                    result.error = true
99                    return result
100                }
101
102                if(result.inventoryMovementInstance.task.taskStatus.id == 3) {
103                    status.setRollbackOnly()
104                    result.inventoryMovementInstance.errors.rejectValue('task', "task.operationNotPermittedOnCompleteTask")
105                    result.error = true
106                    return result
107                }
108            }
109
110            if(result.inventoryMovementInstance.validate()) {
111                def inventoryItem = InventoryItem.lock(result.inventoryMovementInstance.inventoryItem.id)
112                result.taskId = result.inventoryMovementInstance.task?.id
113
114                if(!inventoryItem) {
115                    status.setRollbackOnly()
116                    result.inventoryMovementInstance.errors.rejectValue('inventoryItem', "inventoryMovement.inventoryItem.notFound")
117                    result.error = true
118                    return result
119                }
120
121                // Perform the movement of inventory.
122                if(result.inventoryMovementInstance.inventoryMovementType.incrementsInventory) {
123                    inventoryItem.unitsInStock += result.inventoryMovementInstance.quantity
124                }
125                else {
126                    if(inventoryItem.unitsInStock >= result.inventoryMovementInstance.quantity) {
127                        inventoryItem.unitsInStock -= result.inventoryMovementInstance.quantity
128                    }
129                    else {
130                        status.setRollbackOnly()
131                        result.inventoryMovementInstance.errors.rejectValue('quantity', "inventoryMovement.quantity.insufficientItemsInStock")
132                        result.error = true
133                        return result
134                    }
135                }
136
137                if(inventoryItem.save() && result.inventoryMovementInstance.save()) {
138                    // All went well if we get to this point.
139                    return result
140                }
141                else {
142                    status.setRollbackOnly()
143                    result.error = true
144                    return result
145                }
146
147            }
148            else {
149                result.error = true
150                return result
151            }
152
153        } // end withTransaction
154    } // end move()
155
156} // end class
Note: See TracBrowser for help on using the repository browser.