odoo-addon-shopfloor 16.0.1.0.0.24__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (182) hide show
  1. odoo/addons/shopfloor/README.rst +160 -0
  2. odoo/addons/shopfloor/__init__.py +4 -0
  3. odoo/addons/shopfloor/__manifest__.py +65 -0
  4. odoo/addons/shopfloor/actions/__init__.py +15 -0
  5. odoo/addons/shopfloor/actions/change_package_lot.py +164 -0
  6. odoo/addons/shopfloor/actions/completion_info.py +42 -0
  7. odoo/addons/shopfloor/actions/data.py +329 -0
  8. odoo/addons/shopfloor/actions/data_detail.py +154 -0
  9. odoo/addons/shopfloor/actions/inventory.py +150 -0
  10. odoo/addons/shopfloor/actions/location_content_transfer_sorter.py +89 -0
  11. odoo/addons/shopfloor/actions/message.py +846 -0
  12. odoo/addons/shopfloor/actions/move_line_search.py +119 -0
  13. odoo/addons/shopfloor/actions/packaging.py +59 -0
  14. odoo/addons/shopfloor/actions/savepoint.py +44 -0
  15. odoo/addons/shopfloor/actions/schema.py +182 -0
  16. odoo/addons/shopfloor/actions/schema_detail.py +98 -0
  17. odoo/addons/shopfloor/actions/search.py +187 -0
  18. odoo/addons/shopfloor/actions/stock.py +239 -0
  19. odoo/addons/shopfloor/actions/stock_unreserve.py +66 -0
  20. odoo/addons/shopfloor/components/__init__.py +5 -0
  21. odoo/addons/shopfloor/components/scan_handler_location.py +26 -0
  22. odoo/addons/shopfloor/components/scan_handler_lot.py +26 -0
  23. odoo/addons/shopfloor/components/scan_handler_package.py +26 -0
  24. odoo/addons/shopfloor/components/scan_handler_product.py +26 -0
  25. odoo/addons/shopfloor/components/scan_handler_transfer.py +26 -0
  26. odoo/addons/shopfloor/data/shopfloor_scenario_data.xml +73 -0
  27. odoo/addons/shopfloor/demo/shopfloor_app_demo.xml +12 -0
  28. odoo/addons/shopfloor/demo/shopfloor_menu_demo.xml +64 -0
  29. odoo/addons/shopfloor/demo/shopfloor_profile_demo.xml +8 -0
  30. odoo/addons/shopfloor/demo/stock_picking_type_demo.xml +93 -0
  31. odoo/addons/shopfloor/docs/checkout_diag_seq.plantuml +61 -0
  32. odoo/addons/shopfloor/docs/checkout_diag_seq.png +0 -0
  33. odoo/addons/shopfloor/docs/cluster_picking_diag_seq.plantuml +112 -0
  34. odoo/addons/shopfloor/docs/cluster_picking_diag_seq.png +0 -0
  35. odoo/addons/shopfloor/docs/delivery_diag_seq.plantuml +56 -0
  36. odoo/addons/shopfloor/docs/delivery_diag_seq.png +0 -0
  37. odoo/addons/shopfloor/docs/location_content_transfer_diag_seq.plantuml +66 -0
  38. odoo/addons/shopfloor/docs/location_content_transfer_diag_seq.png +0 -0
  39. odoo/addons/shopfloor/docs/oca_logo.png +0 -0
  40. odoo/addons/shopfloor/docs/single_pack_transfer_diag_seq.plantuml +36 -0
  41. odoo/addons/shopfloor/docs/single_pack_transfer_diag_seq.png +0 -0
  42. odoo/addons/shopfloor/docs/zone_picking_diag_seq.plantuml +85 -0
  43. odoo/addons/shopfloor/docs/zone_picking_diag_seq.png +0 -0
  44. odoo/addons/shopfloor/exceptions.py +6 -0
  45. odoo/addons/shopfloor/i18n/ca.po +1802 -0
  46. odoo/addons/shopfloor/i18n/de.po +1791 -0
  47. odoo/addons/shopfloor/i18n/es_AR.po +2147 -0
  48. odoo/addons/shopfloor/i18n/pt_BR.po +1791 -0
  49. odoo/addons/shopfloor/i18n/shopfloor.pot +1877 -0
  50. odoo/addons/shopfloor/models/__init__.py +12 -0
  51. odoo/addons/shopfloor/models/priority_postpone_mixin.py +41 -0
  52. odoo/addons/shopfloor/models/shopfloor_app.py +9 -0
  53. odoo/addons/shopfloor/models/shopfloor_menu.py +436 -0
  54. odoo/addons/shopfloor/models/stock_location.py +76 -0
  55. odoo/addons/shopfloor/models/stock_move.py +119 -0
  56. odoo/addons/shopfloor/models/stock_move_line.py +307 -0
  57. odoo/addons/shopfloor/models/stock_package_level.py +50 -0
  58. odoo/addons/shopfloor/models/stock_picking.py +118 -0
  59. odoo/addons/shopfloor/models/stock_picking_batch.py +41 -0
  60. odoo/addons/shopfloor/models/stock_picking_type.py +26 -0
  61. odoo/addons/shopfloor/models/stock_quant.py +31 -0
  62. odoo/addons/shopfloor/models/stock_quant_package.py +101 -0
  63. odoo/addons/shopfloor/readme/CONTRIBUTORS.rst +18 -0
  64. odoo/addons/shopfloor/readme/CREDITS.rst +5 -0
  65. odoo/addons/shopfloor/readme/DESCRIPTION.rst +17 -0
  66. odoo/addons/shopfloor/readme/HISTORY.rst +4 -0
  67. odoo/addons/shopfloor/readme/ROADMAP.rst +4 -0
  68. odoo/addons/shopfloor/readme/USAGE.rst +6 -0
  69. odoo/addons/shopfloor/security/groups.xml +17 -0
  70. odoo/addons/shopfloor/services/__init__.py +16 -0
  71. odoo/addons/shopfloor/services/checkout.py +1763 -0
  72. odoo/addons/shopfloor/services/cluster_picking.py +1628 -0
  73. odoo/addons/shopfloor/services/delivery.py +828 -0
  74. odoo/addons/shopfloor/services/forms/__init__.py +1 -0
  75. odoo/addons/shopfloor/services/forms/picking_form.py +78 -0
  76. odoo/addons/shopfloor/services/location_content_transfer.py +1194 -0
  77. odoo/addons/shopfloor/services/menu.py +60 -0
  78. odoo/addons/shopfloor/services/picking_batch.py +126 -0
  79. odoo/addons/shopfloor/services/service.py +101 -0
  80. odoo/addons/shopfloor/services/single_pack_transfer.py +366 -0
  81. odoo/addons/shopfloor/services/zone_picking.py +1938 -0
  82. odoo/addons/shopfloor/static/description/icon.png +0 -0
  83. odoo/addons/shopfloor/static/description/index.html +500 -0
  84. odoo/addons/shopfloor/tests/__init__.py +83 -0
  85. odoo/addons/shopfloor/tests/common.py +324 -0
  86. odoo/addons/shopfloor/tests/models.py +29 -0
  87. odoo/addons/shopfloor/tests/test_actions_change_package_lot.py +1175 -0
  88. odoo/addons/shopfloor/tests/test_actions_data.py +376 -0
  89. odoo/addons/shopfloor/tests/test_actions_data_base.py +244 -0
  90. odoo/addons/shopfloor/tests/test_actions_data_detail.py +322 -0
  91. odoo/addons/shopfloor/tests/test_actions_search.py +248 -0
  92. odoo/addons/shopfloor/tests/test_actions_stock.py +48 -0
  93. odoo/addons/shopfloor/tests/test_checkout_auto_post.py +67 -0
  94. odoo/addons/shopfloor/tests/test_checkout_base.py +81 -0
  95. odoo/addons/shopfloor/tests/test_checkout_cancel_line.py +154 -0
  96. odoo/addons/shopfloor/tests/test_checkout_change_packaging.py +184 -0
  97. odoo/addons/shopfloor/tests/test_checkout_done.py +133 -0
  98. odoo/addons/shopfloor/tests/test_checkout_list_delivery_packaging.py +131 -0
  99. odoo/addons/shopfloor/tests/test_checkout_list_package.py +327 -0
  100. odoo/addons/shopfloor/tests/test_checkout_new_package.py +88 -0
  101. odoo/addons/shopfloor/tests/test_checkout_no_package.py +95 -0
  102. odoo/addons/shopfloor/tests/test_checkout_scan.py +174 -0
  103. odoo/addons/shopfloor/tests/test_checkout_scan_line.py +377 -0
  104. odoo/addons/shopfloor/tests/test_checkout_scan_line_base.py +25 -0
  105. odoo/addons/shopfloor/tests/test_checkout_scan_line_no_prefill_qty.py +91 -0
  106. odoo/addons/shopfloor/tests/test_checkout_scan_package_action.py +451 -0
  107. odoo/addons/shopfloor/tests/test_checkout_scan_package_action_no_prefill_qty.py +107 -0
  108. odoo/addons/shopfloor/tests/test_checkout_select.py +74 -0
  109. odoo/addons/shopfloor/tests/test_checkout_select_line.py +130 -0
  110. odoo/addons/shopfloor/tests/test_checkout_select_package_base.py +64 -0
  111. odoo/addons/shopfloor/tests/test_checkout_set_qty.py +257 -0
  112. odoo/addons/shopfloor/tests/test_checkout_summary.py +69 -0
  113. odoo/addons/shopfloor/tests/test_cluster_picking_base.py +83 -0
  114. odoo/addons/shopfloor/tests/test_cluster_picking_batch.py +109 -0
  115. odoo/addons/shopfloor/tests/test_cluster_picking_change_pack_lot.py +111 -0
  116. odoo/addons/shopfloor/tests/test_cluster_picking_is_zero.py +98 -0
  117. odoo/addons/shopfloor/tests/test_cluster_picking_scan_destination.py +376 -0
  118. odoo/addons/shopfloor/tests/test_cluster_picking_scan_destination_no_prefill_qty.py +115 -0
  119. odoo/addons/shopfloor/tests/test_cluster_picking_scan_line.py +402 -0
  120. odoo/addons/shopfloor/tests/test_cluster_picking_scan_line_location_or_pack_first.py +114 -0
  121. odoo/addons/shopfloor/tests/test_cluster_picking_scan_line_no_prefill_qty.py +70 -0
  122. odoo/addons/shopfloor/tests/test_cluster_picking_select.py +387 -0
  123. odoo/addons/shopfloor/tests/test_cluster_picking_skip.py +90 -0
  124. odoo/addons/shopfloor/tests/test_cluster_picking_stock_issue.py +364 -0
  125. odoo/addons/shopfloor/tests/test_cluster_picking_unload.py +911 -0
  126. odoo/addons/shopfloor/tests/test_delivery_base.py +155 -0
  127. odoo/addons/shopfloor/tests/test_delivery_done.py +108 -0
  128. odoo/addons/shopfloor/tests/test_delivery_list_stock_picking.py +49 -0
  129. odoo/addons/shopfloor/tests/test_delivery_reset_qty_done_line.py +119 -0
  130. odoo/addons/shopfloor/tests/test_delivery_reset_qty_done_pack.py +107 -0
  131. odoo/addons/shopfloor/tests/test_delivery_scan_deliver.py +557 -0
  132. odoo/addons/shopfloor/tests/test_delivery_select.py +38 -0
  133. odoo/addons/shopfloor/tests/test_delivery_set_qty_done_line.py +91 -0
  134. odoo/addons/shopfloor/tests/test_delivery_set_qty_done_pack.py +135 -0
  135. odoo/addons/shopfloor/tests/test_delivery_sublocation.py +180 -0
  136. odoo/addons/shopfloor/tests/test_location_content_transfer_base.py +136 -0
  137. odoo/addons/shopfloor/tests/test_location_content_transfer_get_work.py +125 -0
  138. odoo/addons/shopfloor/tests/test_location_content_transfer_mix.py +509 -0
  139. odoo/addons/shopfloor/tests/test_location_content_transfer_putaway.py +143 -0
  140. odoo/addons/shopfloor/tests/test_location_content_transfer_scan_location.py +34 -0
  141. odoo/addons/shopfloor/tests/test_location_content_transfer_set_destination_all.py +343 -0
  142. odoo/addons/shopfloor/tests/test_location_content_transfer_set_destination_package_or_line.py +1074 -0
  143. odoo/addons/shopfloor/tests/test_location_content_transfer_single.py +748 -0
  144. odoo/addons/shopfloor/tests/test_location_content_transfer_start.py +359 -0
  145. odoo/addons/shopfloor/tests/test_menu_base.py +261 -0
  146. odoo/addons/shopfloor/tests/test_menu_counters.py +61 -0
  147. odoo/addons/shopfloor/tests/test_misc.py +25 -0
  148. odoo/addons/shopfloor/tests/test_move_action_assign.py +87 -0
  149. odoo/addons/shopfloor/tests/test_openapi.py +21 -0
  150. odoo/addons/shopfloor/tests/test_picking_form.py +62 -0
  151. odoo/addons/shopfloor/tests/test_scan_anything.py +49 -0
  152. odoo/addons/shopfloor/tests/test_single_pack_transfer.py +1121 -0
  153. odoo/addons/shopfloor/tests/test_single_pack_transfer_base.py +32 -0
  154. odoo/addons/shopfloor/tests/test_single_pack_transfer_putaway.py +104 -0
  155. odoo/addons/shopfloor/tests/test_stock_split.py +204 -0
  156. odoo/addons/shopfloor/tests/test_user.py +42 -0
  157. odoo/addons/shopfloor/tests/test_zone_picking_base.py +608 -0
  158. odoo/addons/shopfloor/tests/test_zone_picking_change_pack_lot.py +140 -0
  159. odoo/addons/shopfloor/tests/test_zone_picking_select_line.py +723 -0
  160. odoo/addons/shopfloor/tests/test_zone_picking_select_line_first_scan_location.py +207 -0
  161. odoo/addons/shopfloor/tests/test_zone_picking_select_line_first_scan_location.py.bak +202 -0
  162. odoo/addons/shopfloor/tests/test_zone_picking_select_line_no_prefill_qty.py +107 -0
  163. odoo/addons/shopfloor/tests/test_zone_picking_select_picking_type.py +26 -0
  164. odoo/addons/shopfloor/tests/test_zone_picking_set_line_destination.py +643 -0
  165. odoo/addons/shopfloor/tests/test_zone_picking_set_line_destination_no_prefill_qty.py +146 -0
  166. odoo/addons/shopfloor/tests/test_zone_picking_set_line_destination_pick_pack.py +241 -0
  167. odoo/addons/shopfloor/tests/test_zone_picking_start.py +206 -0
  168. odoo/addons/shopfloor/tests/test_zone_picking_stock_issue.py +121 -0
  169. odoo/addons/shopfloor/tests/test_zone_picking_unload_all.py +353 -0
  170. odoo/addons/shopfloor/tests/test_zone_picking_unload_buffer_lines.py +113 -0
  171. odoo/addons/shopfloor/tests/test_zone_picking_unload_set_destination.py +374 -0
  172. odoo/addons/shopfloor/tests/test_zone_picking_unload_single.py +123 -0
  173. odoo/addons/shopfloor/tests/test_zone_picking_zero_check.py +43 -0
  174. odoo/addons/shopfloor/utils.py +13 -0
  175. odoo/addons/shopfloor/views/shopfloor_menu.xml +167 -0
  176. odoo/addons/shopfloor/views/stock_location.xml +20 -0
  177. odoo/addons/shopfloor/views/stock_move_line.xml +52 -0
  178. odoo/addons/shopfloor/views/stock_picking_type.xml +19 -0
  179. odoo_addon_shopfloor-16.0.1.0.0.24.dist-info/METADATA +192 -0
  180. odoo_addon_shopfloor-16.0.1.0.0.24.dist-info/RECORD +182 -0
  181. odoo_addon_shopfloor-16.0.1.0.0.24.dist-info/WHEEL +5 -0
  182. odoo_addon_shopfloor-16.0.1.0.0.24.dist-info/top_level.txt +1 -0
@@ -0,0 +1,374 @@
1
+ # Copyright 2020 Camptocamp SA (http://www.camptocamp.com)
2
+ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
3
+ from .test_zone_picking_base import ZonePickingCommonCase
4
+
5
+ # pylint: disable=missing-return
6
+
7
+
8
+ class ZonePickingUnloadSetDestinationCase(ZonePickingCommonCase):
9
+ """Tests for endpoint used from unload_set_destination
10
+
11
+ * /unload_set_destination
12
+
13
+ """
14
+
15
+ @classmethod
16
+ def setUpClassBaseData(cls, *args, **kwargs):
17
+ super().setUpClassBaseData(*args, **kwargs)
18
+ cls.product_z = (
19
+ cls.env["product.product"]
20
+ .sudo()
21
+ .create(
22
+ {
23
+ "name": "Product Z",
24
+ "type": "product",
25
+ "default_code": "Z",
26
+ "barcode": "Z",
27
+ "weight": 7,
28
+ }
29
+ )
30
+ )
31
+ cls.picking_z = cls._create_picking(lines=[(cls.product_z, 40)])
32
+ cls._update_qty_in_location(cls.zone_sublocation1, cls.product_z, 32)
33
+
34
+ def setUp(self):
35
+ super().setUp()
36
+ self.service.work.current_picking_type = self.picking1.picking_type_id
37
+
38
+ def test_unload_set_destination_wrong_parameters(self):
39
+ zone_location = self.zone_location
40
+ picking_type = self.picking1.picking_type_id
41
+ response = self.service.dispatch(
42
+ "unload_set_destination",
43
+ params={"package_id": 1234567890, "barcode": "BARCODE"},
44
+ )
45
+ move_lines = self.service._find_location_move_lines()
46
+ self.assert_response_select_line(
47
+ response,
48
+ zone_location,
49
+ picking_type,
50
+ move_lines,
51
+ message=self.service.msg_store.record_not_found(),
52
+ )
53
+
54
+ def test_unload_set_destination_no_location_found(self):
55
+ zone_location = self.zone_location
56
+ picking_type = self.picking1.picking_type_id
57
+ move_line = self.picking1.move_line_ids
58
+ # set the destination package
59
+ self.service._set_destination_package(
60
+ move_line,
61
+ move_line.reserved_uom_qty,
62
+ self.free_package,
63
+ )
64
+ response = self.service.dispatch(
65
+ "unload_set_destination",
66
+ params={"package_id": self.free_package.id, "barcode": "UNKNOWN"},
67
+ )
68
+ self.assert_response_unload_set_destination(
69
+ response,
70
+ zone_location,
71
+ picking_type,
72
+ move_line,
73
+ message=self.service.msg_store.no_location_found(),
74
+ )
75
+
76
+ def test_unload_set_destination_location_not_allowed(self):
77
+ zone_location = self.zone_location
78
+ picking_type = self.picking1.picking_type_id
79
+ move_line = self.picking1.move_line_ids
80
+ # set the destination package
81
+ self.service._set_destination_package(
82
+ move_line,
83
+ move_line.reserved_uom_qty,
84
+ self.free_package,
85
+ )
86
+ response = self.service.dispatch(
87
+ "unload_set_destination",
88
+ params={
89
+ "package_id": self.free_package.id,
90
+ "barcode": self.customer_location.barcode,
91
+ },
92
+ )
93
+ self.assert_response_unload_set_destination(
94
+ response,
95
+ zone_location,
96
+ picking_type,
97
+ move_line,
98
+ message=self.service.msg_store.dest_location_not_allowed(),
99
+ )
100
+
101
+ def test_unload_set_destination_location_move_not_allowed(self):
102
+ zone_location = self.zone_location
103
+ picking_type = self.picking1.picking_type_id
104
+ move_line = self.picking1.move_line_ids
105
+ move_line[0].move_id.location_dest_id = self.packing_sublocation_a
106
+ move_line[0].picking_id.location_dest_id = self.packing_sublocation_a
107
+ # set the destination package
108
+ self.service._set_destination_package(
109
+ move_line,
110
+ move_line.reserved_uom_qty,
111
+ self.free_package,
112
+ )
113
+ response = self.service.dispatch(
114
+ "unload_set_destination",
115
+ params={
116
+ "package_id": self.free_package.id,
117
+ "barcode": self.packing_sublocation_b.barcode,
118
+ },
119
+ )
120
+ self.assert_response_unload_set_destination(
121
+ response,
122
+ zone_location,
123
+ picking_type,
124
+ move_line,
125
+ message=self.service.msg_store.dest_location_not_allowed(),
126
+ )
127
+ # Ensure that when unload_package_at_destination is False,
128
+ # the result_package_id remains.
129
+ self.assertEqual(move_line.result_package_id, self.free_package)
130
+
131
+ def test_unload_set_destination_unload_package_enabled(self):
132
+ move_line = self.picking1.move_line_ids
133
+ packing_sublocation1 = (
134
+ self.env["stock.location"]
135
+ .sudo()
136
+ .create(
137
+ {
138
+ "name": "Packing sublocation-1",
139
+ "location_id": self.packing_location.id,
140
+ "barcode": "PACKING_SUBLOCATIO_1",
141
+ }
142
+ )
143
+ )
144
+ packing_sublocation2 = (
145
+ self.env["stock.location"]
146
+ .sudo()
147
+ .create(
148
+ {
149
+ "name": "Packing sublocation-2",
150
+ "location_id": self.packing_location.id,
151
+ "barcode": "PACKING_SUBLOCATIO_2",
152
+ }
153
+ )
154
+ )
155
+ # set the destination package
156
+ self.service._set_destination_package(
157
+ move_line,
158
+ move_line.reserved_uom_qty,
159
+ self.free_package,
160
+ )
161
+ move_line.location_dest_id = packing_sublocation1
162
+ # Enable unload_package_at_destination
163
+ self.menu.sudo().write({"unload_package_at_destination": True})
164
+ self.service.dispatch(
165
+ "unload_set_destination",
166
+ params={
167
+ "package_id": self.free_package.id,
168
+ "barcode": packing_sublocation2.barcode,
169
+ "confirmation": True,
170
+ },
171
+ )
172
+ # Response has already been tested in the test above
173
+ # result package should be False
174
+ self.assertFalse(move_line.result_package_id)
175
+
176
+ def test_unload_set_destination_confirm_location(self):
177
+ zone_location = self.zone_location
178
+ picking_type = self.picking1.picking_type_id
179
+ move_line = self.picking1.move_line_ids
180
+ packing_sublocation1 = (
181
+ self.env["stock.location"]
182
+ .sudo()
183
+ .create(
184
+ {
185
+ "name": "Packing sublocation-1",
186
+ "location_id": self.packing_location.id,
187
+ "barcode": "PACKING_SUBLOCATIO_1",
188
+ }
189
+ )
190
+ )
191
+ packing_sublocation2 = (
192
+ self.env["stock.location"]
193
+ .sudo()
194
+ .create(
195
+ {
196
+ "name": "Packing sublocation-2",
197
+ "location_id": self.packing_location.id,
198
+ "barcode": "PACKING_SUBLOCATIO_2",
199
+ }
200
+ )
201
+ )
202
+ # set the destination package
203
+ self.service._set_destination_package(
204
+ move_line,
205
+ move_line.reserved_uom_qty,
206
+ self.free_package,
207
+ )
208
+ move_line.location_dest_id = packing_sublocation1
209
+ response = self.service.dispatch(
210
+ "unload_set_destination",
211
+ params={
212
+ "package_id": self.free_package.id,
213
+ "barcode": packing_sublocation2.barcode,
214
+ },
215
+ )
216
+ self.assert_response_unload_set_destination(
217
+ response,
218
+ zone_location,
219
+ picking_type,
220
+ move_line,
221
+ message=self.service.msg_store.confirm_location_changed(
222
+ packing_sublocation1, packing_sublocation2
223
+ ),
224
+ confirmation_required=True,
225
+ )
226
+
227
+ def test_unload_set_destination_ok_buffer_empty(self):
228
+ zone_location = self.zone_location
229
+ picking_type = self.picking1.picking_type_id
230
+ move_line = self.picking1.move_line_ids
231
+ packing_sublocation = (
232
+ self.env["stock.location"]
233
+ .sudo()
234
+ .create(
235
+ {
236
+ "name": "Packing sublocation",
237
+ "location_id": self.packing_location.id,
238
+ "barcode": "PACKING_SUBLOCATION",
239
+ }
240
+ )
241
+ )
242
+ # set the destination package
243
+ self.service._set_destination_package(
244
+ move_line,
245
+ move_line.reserved_uom_qty,
246
+ self.free_package,
247
+ )
248
+ response = self.service.dispatch(
249
+ "unload_set_destination",
250
+ params={
251
+ "package_id": self.free_package.id,
252
+ "barcode": packing_sublocation.barcode,
253
+ "confirmation": True,
254
+ },
255
+ )
256
+ # check data
257
+ self.assertEqual(move_line.location_dest_id, packing_sublocation)
258
+ self.assertEqual(move_line.move_id.state, "done")
259
+ # check response
260
+ move_lines = self.service._find_location_move_lines()
261
+ self.assert_response_select_line(
262
+ response,
263
+ zone_location,
264
+ picking_type,
265
+ move_lines,
266
+ message=self.service.msg_store.buffer_complete(),
267
+ )
268
+
269
+ def test_unload_set_destination_ok_buffer_not_empty(self):
270
+ zone_location = self.zone_location
271
+ picking_type = self.picking5.picking_type_id
272
+ # put several lines in the buffer
273
+ self.another_package = self.env["stock.quant.package"].create(
274
+ {"name": "ANOTHER_PACKAGE"}
275
+ )
276
+ move_lines = self.picking5.move_line_ids
277
+ for move_line, package_dest in zip(
278
+ move_lines, self.free_package | self.another_package
279
+ ):
280
+ self.service._set_destination_package(
281
+ move_line,
282
+ move_line.reserved_uom_qty,
283
+ package_dest,
284
+ )
285
+ free_package_line = move_lines.filtered(
286
+ lambda l: l.result_package_id == self.free_package
287
+ )
288
+ another_package_line = move_lines - free_package_line
289
+
290
+ # process 1/2 buffer line
291
+ response = self.service.dispatch(
292
+ "unload_set_destination",
293
+ params={
294
+ "package_id": self.free_package.id,
295
+ "barcode": self.packing_location.barcode,
296
+ },
297
+ )
298
+ # check data
299
+ done_picking = self.picking5.backorder_ids
300
+ self.assertEqual(done_picking.state, "done")
301
+ self.assertEqual(done_picking.move_line_ids, free_package_line)
302
+
303
+ self.assertEqual(free_package_line.location_dest_id, self.packing_location)
304
+ self.assertEqual(free_package_line.move_id.state, "done")
305
+
306
+ self.assertEqual(self.picking5.move_line_ids, another_package_line)
307
+
308
+ # check response
309
+ buffer_line = self.service._find_buffer_move_lines()
310
+ completion_info = self.service._actions_for("completion.info")
311
+ completion_info_popup = completion_info.popup(buffer_line)
312
+ self.assert_response_unload_single(
313
+ response,
314
+ zone_location,
315
+ picking_type,
316
+ buffer_line,
317
+ popup=completion_info_popup,
318
+ )
319
+
320
+ def test_unload_set_destination_partially_available_backorder(self):
321
+ zone_location = self.zone_location
322
+ picking_type = self.picking_z.picking_type_id
323
+ self.assertEqual(self.picking_z.move_ids[0].product_uom_qty, 40)
324
+ self.picking_z.action_assign()
325
+ move_line = self.picking_z.move_line_ids
326
+ self.assertEqual(move_line.reserved_uom_qty, 32)
327
+ self.assertEqual(move_line.move_id.state, "partially_available")
328
+ packing_sublocation = (
329
+ self.env["stock.location"]
330
+ .sudo()
331
+ .create(
332
+ {
333
+ "name": "Packing sublocation",
334
+ "location_id": self.packing_location.id,
335
+ "barcode": "PACKING_SUBLOCATION",
336
+ }
337
+ )
338
+ )
339
+ # set the destination package
340
+ self.service._set_destination_package(
341
+ move_line,
342
+ move_line.reserved_uom_qty,
343
+ self.free_package,
344
+ )
345
+ response = self.service.dispatch(
346
+ "unload_set_destination",
347
+ params={
348
+ "package_id": self.free_package.id,
349
+ "barcode": packing_sublocation.barcode,
350
+ "confirmation": True,
351
+ },
352
+ )
353
+ # check data
354
+ # move line has been moved to a new picking
355
+ # move line has been validated in the new picking
356
+ self.assertNotEqual(move_line.move_id.picking_id, self.picking_z)
357
+ backorder = move_line.move_id.picking_id.backorder_id
358
+ self.assertEqual(backorder, self.picking_z)
359
+ # the backorder contains a new line w/ the rest of the qty
360
+ # that couldn't be processed
361
+ self.assertEqual(backorder.move_ids[0].product_uom_qty, 8)
362
+ self.assertEqual(backorder.state, "confirmed")
363
+ # the line has been processed
364
+ self.assertEqual(move_line.location_dest_id, packing_sublocation)
365
+ self.assertEqual(move_line.move_id.state, "done")
366
+ # check response
367
+ move_lines = self.service._find_location_move_lines()
368
+ self.assert_response_select_line(
369
+ response,
370
+ zone_location,
371
+ picking_type,
372
+ move_lines,
373
+ message=self.service.msg_store.buffer_complete(),
374
+ )
@@ -0,0 +1,123 @@
1
+ # Copyright 2020 Camptocamp SA (http://www.camptocamp.com)
2
+ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
3
+ from .test_zone_picking_base import ZonePickingCommonCase
4
+
5
+ # pylint: disable=missing-return
6
+
7
+
8
+ class ZonePickingUnloadSingleCase(ZonePickingCommonCase):
9
+ """Tests for endpoint used from unload_single
10
+
11
+ * /unload_scan_pack
12
+
13
+ """
14
+
15
+ def setUp(self):
16
+ super().setUp()
17
+ self.service.work.current_picking_type = self.picking1.picking_type_id
18
+
19
+ def test_unload_scan_pack_wrong_parameters(self):
20
+ zone_location = self.zone_location
21
+ picking_type = self.picking1.picking_type_id
22
+ move_line = self.picking1.move_line_ids
23
+ # wrong package ID, and there is still a move line to unload
24
+ # => get back on 'unload_single' screen
25
+ self.service._set_destination_package(
26
+ move_line,
27
+ move_line.reserved_uom_qty,
28
+ self.free_package,
29
+ )
30
+ response = self.service.dispatch(
31
+ "unload_scan_pack",
32
+ params={"package_id": 1234567890, "barcode": "UNKNOWN"},
33
+ )
34
+ completion_info = self.service._actions_for("completion.info")
35
+ completion_info_popup = completion_info.popup(move_line)
36
+ self.assert_response_unload_single(
37
+ response,
38
+ zone_location,
39
+ picking_type,
40
+ move_line,
41
+ message=self.service.msg_store.record_not_found(),
42
+ popup=completion_info_popup,
43
+ )
44
+ # wrong package ID, and there is no more move line to unload from the buffer
45
+ # => get back on 'select_line' screen
46
+ move_line.write(
47
+ {"qty_done": 0, "shopfloor_user_id": False, "result_package_id": False}
48
+ )
49
+ response = self.service.dispatch(
50
+ "unload_scan_pack",
51
+ params={"package_id": 1234567890, "barcode": "UNKNOWN"},
52
+ )
53
+ move_lines = self.service._find_location_move_lines()
54
+ self.assert_response_select_line(
55
+ response,
56
+ zone_location,
57
+ picking_type,
58
+ move_lines,
59
+ message=self.service.msg_store.buffer_complete(),
60
+ )
61
+ # wrong package ID, and there is no more move line to process in picking type
62
+ # => get back on 'start' screen
63
+ self.pickings.move_ids._do_unreserve()
64
+ response = self.service.dispatch(
65
+ "unload_scan_pack",
66
+ params={"package_id": 1234567890, "barcode": "UNKNOWN"},
67
+ )
68
+ self.assert_response_start(
69
+ response,
70
+ message=self.service.msg_store.picking_type_complete(picking_type),
71
+ )
72
+
73
+ def test_unload_scan_pack_barcode_match(self):
74
+ zone_location = self.zone_location
75
+ picking_type = self.picking1.picking_type_id
76
+ move_line = self.picking1.move_line_ids
77
+ # set the destination package
78
+ self.service._set_destination_package(
79
+ move_line,
80
+ move_line.reserved_uom_qty,
81
+ self.free_package,
82
+ )
83
+ response = self.service.dispatch(
84
+ "unload_scan_pack",
85
+ params={
86
+ "package_id": move_line.result_package_id.id,
87
+ "barcode": self.free_package.name,
88
+ },
89
+ )
90
+ self.assert_response_unload_set_destination(
91
+ response,
92
+ zone_location,
93
+ picking_type,
94
+ move_line,
95
+ )
96
+
97
+ def test_unload_scan_pack_barcode_not_match(self):
98
+ zone_location = self.zone_location
99
+ picking_type = self.picking1.picking_type_id
100
+ move_line = self.picking1.move_line_ids
101
+ self.wrong_package = self.env["stock.quant.package"].create(
102
+ {"name": "WRONG_PACKAGE"}
103
+ )
104
+ # set the destination package
105
+ self.service._set_destination_package(
106
+ move_line,
107
+ move_line.reserved_uom_qty,
108
+ self.free_package,
109
+ )
110
+ response = self.service.dispatch(
111
+ "unload_scan_pack",
112
+ params={
113
+ "package_id": move_line.result_package_id.id,
114
+ "barcode": self.wrong_package.name,
115
+ },
116
+ )
117
+ self.assert_response_unload_single(
118
+ response,
119
+ zone_location,
120
+ picking_type,
121
+ move_line,
122
+ message=self.service.msg_store.barcode_no_match(self.free_package.name),
123
+ )
@@ -0,0 +1,43 @@
1
+ # Copyright 2020 Camptocamp SA (http://www.camptocamp.com)
2
+ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
3
+ from .test_zone_picking_base import ZonePickingCommonCase
4
+
5
+
6
+ # pylint: disable=missing-return
7
+ class ZonePickingZeroCheckCase(ZonePickingCommonCase):
8
+ """Tests for endpoint used from zero_check
9
+
10
+ * /is_zero
11
+
12
+ """
13
+
14
+ def setUp(self):
15
+ super().setUp()
16
+ self.service.work.current_picking_type = self.picking1.picking_type_id
17
+
18
+ def test_is_zero_wrong_parameters(self):
19
+ response = self.service.dispatch(
20
+ "is_zero",
21
+ params={"move_line_id": 1234567890, "zero": True},
22
+ )
23
+ self.assert_response_start(
24
+ response,
25
+ message=self.service.msg_store.record_not_found(),
26
+ )
27
+
28
+ def test_is_zero_is_empty(self):
29
+ """call /is_zero confirming it's empty"""
30
+ zone_location = self.zone_location
31
+ picking_type = self.picking1.picking_type_id
32
+ move_line = self.picking1.move_line_ids[0]
33
+ response = self.service.dispatch(
34
+ "is_zero",
35
+ params={"move_line_id": move_line.id, "zero": True},
36
+ )
37
+ move_lines = self.service._find_location_move_lines()
38
+ self.assert_response_select_line(
39
+ response,
40
+ zone_location,
41
+ picking_type,
42
+ move_lines,
43
+ )
@@ -0,0 +1,13 @@
1
+ # Copyright 2020 Camptocamp SA (http://www.camptocamp.com)
2
+ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
3
+
4
+
5
+ def to_float(val):
6
+ if isinstance(val, float):
7
+ return val
8
+ if isinstance(val, int):
9
+ return float(val)
10
+ if isinstance(val, str):
11
+ if val.replace(".", "", 1).isdigit():
12
+ return float(val)
13
+ return None