odoo-addon-shopfloor 18.0.0.4.0__py3-none-any.whl → 18.0.0.5.0__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.
@@ -11,7 +11,7 @@ Shopfloor
11
11
  !! This file is generated by oca-gen-addon-readme !!
12
12
  !! changes will be overwritten. !!
13
13
  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
14
- !! source digest: sha256:18da2d0922f39feb5fd987c2133de7d50cfbdc21f6d61cd82e799cb95182bae6
14
+ !! source digest: sha256:82699fc8ed59ec349f18149761cdefd28a4d13c4b41274373aa4e1ff02cc593b
15
15
  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
16
16
 
17
17
  .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
@@ -6,7 +6,7 @@
6
6
  {
7
7
  "name": "Shopfloor",
8
8
  "summary": "manage warehouse operations with barcode scanners",
9
- "version": "18.0.0.4.0",
9
+ "version": "18.0.0.5.0",
10
10
  "development_status": "Beta",
11
11
  "category": "Inventory",
12
12
  "website": "https://github.com/OCA/stock-logistics-shopfloor",
@@ -379,7 +379,7 @@ class ClusterPicking(Component):
379
379
  """Get the last line picked and put in a pack for this picking"""
380
380
  return fields.first(
381
381
  picking.move_line_ids.filtered(
382
- lambda x: x.qty_done > 0
382
+ lambda x: x.picked
383
383
  and x.result_package_id
384
384
  # if we are moving the entire package, we shouldn't
385
385
  # add stuff inside it, it's not a new package
@@ -737,7 +737,7 @@ class ClusterPicking(Component):
737
737
  * zero_check: if the quantity of product moved is 0 in the
738
738
  source location after the move (beware: at this point the product we put in
739
739
  a bin is still considered to be in the source location, so we have to compute
740
- the source location's quantity - qty_done).
740
+ the source location's quantity - qty_picked).
741
741
  * unload_all: when all lines have a destination package and they all
742
742
  have the same destination.
743
743
  * unload_single: when all lines have a destination package and they all
@@ -795,10 +795,10 @@ class ClusterPicking(Component):
795
795
  },
796
796
  qty_done=quantity,
797
797
  )
798
- move_line.write({"qty_done": quantity, "result_package_id": bin_package.id})
798
+ move_line.write({"qty_picked": quantity, "result_package_id": bin_package.id})
799
799
  # Only apply zero check if the product is of type "product".
800
800
  zero_check = (
801
- move_line.product_id.type == "product"
801
+ move_line.product_id.is_storable
802
802
  and move_line.picking_id.picking_type_id.shopfloor_zero_check
803
803
  )
804
804
  if zero_check and move_line.location_id.planned_qty_in_location_is_empty():
@@ -807,7 +807,7 @@ class ClusterPicking(Component):
807
807
  return self._pick_next_line(
808
808
  batch,
809
809
  message=self.msg_store.x_units_put_in_package(
810
- move_line.qty_done, move_line.product_id, move_line.result_package_id
810
+ move_line.qty_picked, move_line.product_id, move_line.result_package_id
811
811
  ),
812
812
  # if we split the move line, we want to process the one generated by the
813
813
  # split right now
@@ -866,7 +866,7 @@ class ClusterPicking(Component):
866
866
  def _filter_for_unload(self, line):
867
867
  return (
868
868
  line.state in ("assigned", "partially_available")
869
- and line.qty_done > 0
869
+ and line.picked
870
870
  and line.result_package_id
871
871
  and not line.shopfloor_unloaded
872
872
  )
@@ -917,7 +917,7 @@ class ClusterPicking(Component):
917
917
  return self._pick_next_line(
918
918
  batch,
919
919
  message=self.msg_store.x_units_put_in_package(
920
- move_line.qty_done, move_line.product_id, move_line.result_package_id
920
+ move_line.qty_picked, move_line.product_id, move_line.result_package_id
921
921
  ),
922
922
  )
923
923
 
@@ -1014,6 +1014,13 @@ class ClusterPicking(Component):
1014
1014
  inventory.create_stock_issue(move, location, package, lot)
1015
1015
 
1016
1016
  # try to reassign the moves in case we have stock in another location
1017
+ for move in unreserve_moves:
1018
+ picked_lines = move.move_line_ids.filtered(lambda line: line.picked)
1019
+ # extract picked lin
1020
+ if picked_lines != move.move_line_ids:
1021
+ # Extract picked lines in another move, because _action_assign will
1022
+ # not do anything if the moved is picked.
1023
+ move.split_other_move_lines(picked_lines, intersection=True)
1017
1024
  unreserve_moves._action_assign()
1018
1025
 
1019
1026
  return self._pick_next_line(batch)
@@ -1036,7 +1043,7 @@ class ClusterPicking(Component):
1036
1043
  ("package_id", "=", package.id),
1037
1044
  ("lot_id", "=", lot.id),
1038
1045
  ("state", "not in", ("cancel", "done")),
1039
- ("qty_done", "=", 0),
1046
+ ("picked", "=", False),
1040
1047
  ("picking_id.batch_id", "=", batch.id),
1041
1048
  ]
1042
1049
  return domain
@@ -372,7 +372,7 @@ ul.auto-toc {
372
372
  !! This file is generated by oca-gen-addon-readme !!
373
373
  !! changes will be overwritten. !!
374
374
  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
375
- !! source digest: sha256:18da2d0922f39feb5fd987c2133de7d50cfbdc21f6d61cd82e799cb95182bae6
375
+ !! source digest: sha256:82699fc8ed59ec349f18149761cdefd28a4d13c4b41274373aa4e1ff02cc593b
376
376
  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
377
377
  <p><a class="reference external image-reference" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external image-reference" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/license-AGPL--3-blue.png" /></a> <a class="reference external image-reference" href="https://github.com/OCA/stock-logistics-shopfloor/tree/18.0/shopfloor"><img alt="OCA/stock-logistics-shopfloor" src="https://img.shields.io/badge/github-OCA%2Fstock--logistics--shopfloor-lightgray.png?logo=github" /></a> <a class="reference external image-reference" href="https://translation.odoo-community.org/projects/stock-logistics-shopfloor-18-0/stock-logistics-shopfloor-18-0-shopfloor"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external image-reference" href="https://runboat.odoo-community.org/builds?repo=OCA/stock-logistics-shopfloor&amp;target_branch=18.0"><img alt="Try me on Runboat" src="https://img.shields.io/badge/runboat-Try%20me-875A7B.png" /></a></p>
378
378
  <p>Shopfloor is a barcode scanner application for internal warehouse
@@ -10,19 +10,19 @@ from . import test_actions_stock
10
10
 
11
11
  # from . import test_single_pack_transfer
12
12
  # from . import test_single_pack_transfer_putaway
13
- # from . import test_cluster_picking_base
14
- # from . import test_cluster_picking_batch
15
- # from . import test_cluster_picking_select
16
- # from . import test_cluster_picking_scan_line
17
- # from . import test_cluster_picking_scan_line_location_or_pack_first
18
- # from . import test_cluster_picking_scan_line_no_prefill_qty
19
- # from . import test_cluster_picking_scan_destination
20
- # from . import test_cluster_picking_scan_destination_no_prefill_qty
21
- # from . import test_cluster_picking_is_zero
22
- # from . import test_cluster_picking_skip
23
- # from . import test_cluster_picking_stock_issue
24
- # from . import test_cluster_picking_change_pack_lot
25
- # from . import test_cluster_picking_unload
13
+ from . import test_cluster_picking_base
14
+ from . import test_cluster_picking_batch
15
+ from . import test_cluster_picking_select
16
+ from . import test_cluster_picking_scan_line
17
+ from . import test_cluster_picking_scan_line_location_or_pack_first
18
+ from . import test_cluster_picking_scan_line_no_prefill_qty
19
+ from . import test_cluster_picking_scan_destination
20
+ from . import test_cluster_picking_scan_destination_no_prefill_qty
21
+ from . import test_cluster_picking_is_zero
22
+ from . import test_cluster_picking_skip
23
+ from . import test_cluster_picking_stock_issue
24
+ from . import test_cluster_picking_change_pack_lot
25
+ from . import test_cluster_picking_unload
26
26
  from . import test_checkout_base
27
27
  from . import test_checkout_scan
28
28
  from . import test_checkout_select
@@ -53,7 +53,7 @@ class ClusterPickingCommonCase(CommonCase, PickingBatchMixin):
53
53
  for line in move_lines:
54
54
  line.write(
55
55
  {
56
- "qty_done": line.quantity,
56
+ "qty_picked": line.quantity,
57
57
  "result_package_id": dest_package.id,
58
58
  }
59
59
  )
@@ -28,7 +28,7 @@ class ClusterPickingChangePackLotCase(ClusterPickingCommonCase):
28
28
  "picking_batch_id": batch.id,
29
29
  "move_line_id": line.id,
30
30
  "barcode": barcode,
31
- "quantity": line.qty_done,
31
+ "quantity": line.qty_picked,
32
32
  },
33
33
  )
34
34
  if success:
@@ -57,7 +57,10 @@ class ClusterPickingIsZeroCase(ClusterPickingCommonCase):
57
57
  data=self._line_data(self.next_line),
58
58
  message={
59
59
  "message_type": "success",
60
- "body": f"{self.line.qty_done} {self.line.product_id.display_name} put in {self.bin1.name}", # noqa
60
+ "body": (
61
+ f"{self.line.qty_picked} {self.line.product_id.display_name} "
62
+ f"put in {self.bin1.name}"
63
+ ),
61
64
  },
62
65
  )
63
66
 
@@ -85,6 +88,6 @@ class ClusterPickingIsZeroCase(ClusterPickingCommonCase):
85
88
  data=self._line_data(self.next_line),
86
89
  message={
87
90
  "message_type": "success",
88
- "body": f"{self.line.qty_done} {self.line.product_id.display_name} put in {self.bin1.name}", # noqa
91
+ "body": f"{self.line.qty_picked} {self.line.product_id.display_name} put in {self.bin1.name}", # noqa
89
92
  },
90
93
  )
@@ -45,18 +45,18 @@ class ClusterPickingScanDestinationPackCase(ClusterPickingCommonCase):
45
45
  """
46
46
  line = self.batch.picking_ids.move_line_ids[0]
47
47
  next_line = self.batch.picking_ids.move_line_ids[1]
48
- qty_done = line.quantity
48
+ qty_picked = line.quantity
49
49
  response = self.service.dispatch(
50
50
  "scan_destination_pack",
51
51
  params={
52
52
  "picking_batch_id": self.batch.id,
53
53
  "move_line_id": line.id,
54
54
  "barcode": self.bin1.name,
55
- "quantity": qty_done,
55
+ "quantity": qty_picked,
56
56
  },
57
57
  )
58
58
  self.assertRecordValues(
59
- line, [{"qty_done": qty_done, "result_package_id": self.bin1.id}]
59
+ line, [{"qty_picked": qty_picked, "result_package_id": self.bin1.id}]
60
60
  )
61
61
  self.assert_response(
62
62
  response,
@@ -64,7 +64,7 @@ class ClusterPickingScanDestinationPackCase(ClusterPickingCommonCase):
64
64
  data=self._line_data(next_line),
65
65
  message={
66
66
  "message_type": "success",
67
- "body": f"{line.qty_done} {line.product_id.display_name} put in {self.bin1.name}", # noqa
67
+ "body": f"{line.qty_picked} {line.product_id.display_name} put in {self.bin1.name}", # noqa
68
68
  },
69
69
  )
70
70
 
@@ -79,18 +79,18 @@ class ClusterPickingScanDestinationPackCase(ClusterPickingCommonCase):
79
79
  )
80
80
  # this is the only remaining line to pick
81
81
  line = self.two_lines_picking.move_line_ids[1]
82
- qty_done = line.quantity
82
+ qty_picked = line.quantity
83
83
  response = self.service.dispatch(
84
84
  "scan_destination_pack",
85
85
  params={
86
86
  "picking_batch_id": self.batch.id,
87
87
  "move_line_id": line.id,
88
88
  "barcode": self.bin2.name,
89
- "quantity": qty_done,
89
+ "quantity": qty_picked,
90
90
  },
91
91
  )
92
92
  self.assertRecordValues(
93
- line, [{"qty_done": qty_done, "result_package_id": self.bin2.id}]
93
+ line, [{"qty_picked": qty_picked, "result_package_id": self.bin2.id}]
94
94
  )
95
95
  data = self._data_for_batch(self.batch, self.packing_location)
96
96
  self.assert_response(
@@ -140,7 +140,7 @@ class ClusterPickingScanDestinationPackCase(ClusterPickingCommonCase):
140
140
  "quantity": line.quantity,
141
141
  },
142
142
  )
143
- self.assertRecordValues(line, [{"qty_done": 0, "result_package_id": False}])
143
+ self.assertRecordValues(line, [{"qty_picked": 0, "result_package_id": False}])
144
144
  self.assert_response(
145
145
  response,
146
146
  next_state="scan_destination",
@@ -177,7 +177,7 @@ class ClusterPickingScanDestinationPackCase(ClusterPickingCommonCase):
177
177
  line,
178
178
  [
179
179
  {
180
- "qty_done": 10,
180
+ "qty_picked": 10,
181
181
  "result_package_id": self.bin1.id,
182
182
  "quantity": 10,
183
183
  }
@@ -185,7 +185,7 @@ class ClusterPickingScanDestinationPackCase(ClusterPickingCommonCase):
185
185
  )
186
186
  self.assertRecordValues(
187
187
  new_line,
188
- [{"qty_done": 0, "result_package_id": False, "quantity": 10}],
188
+ [{"qty_picked": 0, "result_package_id": False, "quantity": 10}],
189
189
  )
190
190
 
191
191
  def test_scan_destination_pack_bin_not_found(self):
@@ -267,17 +267,17 @@ class ClusterPickingScanDestinationPackCase(ClusterPickingCommonCase):
267
267
  data=self._line_data(new_line),
268
268
  message={
269
269
  "message_type": "success",
270
- "body": f"{line.qty_done} {line.product_id.display_name} put in {self.bin1.name}", # noqa
270
+ "body": f"{line.qty_picked} {line.product_id.display_name} put in {self.bin1.name}", # noqa
271
271
  },
272
272
  )
273
273
 
274
274
  self.assertRecordValues(
275
275
  line,
276
- [{"qty_done": 7, "result_package_id": self.bin1.id, "quantity": 7}],
276
+ [{"qty_picked": 7, "result_package_id": self.bin1.id, "quantity": 7}],
277
277
  )
278
278
  self.assertRecordValues(
279
279
  new_line,
280
- [{"qty_done": 0, "result_package_id": False, "quantity": 3}],
280
+ [{"qty_picked": 0, "result_package_id": False, "quantity": 3}],
281
281
  )
282
282
  # the reserved quantity on the quant must stay the same
283
283
  self.assertRecordValues(quant, [{"quantity": 40.0, "reserved_quantity": 20.0}])
@@ -307,9 +307,9 @@ class ClusterPickingScanDestinationPackCase(ClusterPickingCommonCase):
307
307
  # ensure we have activated the zero check
308
308
  self.one_line_picking.picking_type_id.sudo().shopfloor_zero_check = True
309
309
  # Update the quantity in the location to be equal to the line's
310
- # so when scan_destination_pack sets the qty_done, the planned
310
+ # so when scan_destination_pack sets the qty_picked, the planned
311
311
  # qty should be zero and trigger a zero check
312
- self._update_qty_in_location(location, product, qty)
312
+ self._update_qty_in_location(location, product, qty / 2)
313
313
  # Reserve goods (now the move line has the expected source location)
314
314
  self.one_line_picking.move_ids.location_id = location
315
315
  self.one_line_picking.action_assign()
@@ -340,7 +340,7 @@ class ClusterPickingScanDestinationPackCase(ClusterPickingCommonCase):
340
340
  # ensure we have deactivated the zero check
341
341
  self.one_line_picking.picking_type_id.sudo().shopfloor_zero_check = False
342
342
  # Update the quantity in the location to be equal to the line's
343
- # so when scan_destination_pack sets the qty_done, the planned
343
+ # so when scan_destination_pack sets the qty_picked, the planned
344
344
  # qty should be zero and trigger a zero check
345
345
  self._update_qty_in_location(line.location_id, line.product_id, line.quantity)
346
346
  response = self.service.dispatch(
@@ -361,6 +361,6 @@ class ClusterPickingScanDestinationPackCase(ClusterPickingCommonCase):
361
361
  data=self._line_data(next_line),
362
362
  message={
363
363
  "message_type": "success",
364
- "body": f"{line.qty_done} {line.product_id.display_name} put in {self.bin1.name}", # noqa
364
+ "body": f"{line.qty_picked} {line.product_id.display_name} put in {self.bin1.name}", # noqa
365
365
  },
366
366
  )
@@ -42,21 +42,21 @@ class ClusterPickingScanDestinationPackPrefillQtyCase(ClusterPickingCommonCase):
42
42
  def test_scan_destination_pack_increment_with_product(self):
43
43
  """Check quantity increment by scanning the product."""
44
44
  line = self.batch.picking_ids.move_line_ids[0]
45
- previous_qty_done = line.qty_done
46
- for qty_done in range(1, 2):
45
+ previous_qty_picked = line.qty_picked
46
+ for qty_picked in range(1, 2):
47
47
  response = self.service.dispatch(
48
48
  "scan_destination_pack",
49
49
  params={
50
50
  "picking_batch_id": self.batch.id,
51
51
  "move_line_id": line.id,
52
52
  "barcode": line.product_id.barcode,
53
- "quantity": qty_done,
53
+ "quantity": qty_picked,
54
54
  },
55
55
  )
56
56
  # Ensure the qty has not changed.
57
- self.assertEqual(line.qty_done, previous_qty_done)
57
+ self.assertEqual(line.qty_picked, previous_qty_picked)
58
58
 
59
- expected_qty_done = qty_done + 1
59
+ expected_qty_done = qty_picked + 1
60
60
  self.assert_response(
61
61
  response,
62
62
  next_state="scan_destination",
@@ -66,24 +66,24 @@ class ClusterPickingScanDestinationPackPrefillQtyCase(ClusterPickingCommonCase):
66
66
  def test_scan_destination_pack_increment_with_wrong_product(self):
67
67
  """Check quantity is not incremented by scanning the wrong product."""
68
68
  line = self.batch.picking_ids.move_line_ids[0]
69
- previous_qty_done = line.qty_done
70
- qty_done = 2
69
+ previous_qty_picked = line.qty_picked
70
+ qty_picked = 2
71
71
  response = self.service.dispatch(
72
72
  "scan_destination_pack",
73
73
  params={
74
74
  "picking_batch_id": self.batch.id,
75
75
  "move_line_id": line.id,
76
76
  "barcode": self.product_b.barcode,
77
- "quantity": qty_done,
77
+ "quantity": qty_picked,
78
78
  },
79
79
  )
80
80
  # Ensure the qty has not changed.
81
- self.assertEqual(line.qty_done, previous_qty_done)
81
+ self.assertEqual(line.qty_picked, previous_qty_picked)
82
82
  new_move_line = self.env["stock.move.line"].search(
83
83
  [("move_id", "=", line.move_id.id), ("id", ">", line.id)]
84
84
  )
85
85
  self.assertFalse(new_move_line)
86
- expected_qty_done = qty_done
86
+ expected_qty_done = qty_picked
87
87
  self.assert_response(
88
88
  response,
89
89
  next_state="scan_destination",
@@ -94,22 +94,22 @@ class ClusterPickingScanDestinationPackPrefillQtyCase(ClusterPickingCommonCase):
94
94
  def test_scan_destination_pack_increment_with_packaging(self):
95
95
  """Check quantity incremented by scanning the packaging."""
96
96
  line = self.batch.picking_ids.move_line_ids[0]
97
- previous_qty_done = line.qty_done
97
+ previous_qty_picked = line.qty_picked
98
98
  packaging = self.product_a_packaging
99
- qty_done = 2
99
+ qty_picked = 2
100
100
  response = self.service.dispatch(
101
101
  "scan_destination_pack",
102
102
  params={
103
103
  "picking_batch_id": self.batch.id,
104
104
  "move_line_id": line.id,
105
105
  "barcode": packaging.barcode,
106
- "quantity": qty_done,
106
+ "quantity": qty_picked,
107
107
  },
108
108
  )
109
109
  # Ensure the qty has not changed in the record.
110
- self.assertEqual(line.qty_done, previous_qty_done)
110
+ self.assertEqual(line.qty_picked, previous_qty_picked)
111
111
 
112
- expected_qty_done = qty_done + packaging.qty
112
+ expected_qty_done = qty_picked + packaging.qty
113
113
  self.assert_response(
114
114
  response,
115
115
  next_state="scan_destination",
@@ -16,7 +16,7 @@ class ClusterPickingScanLineCase(ClusterPickingLineCommonCase):
16
16
 
17
17
  def _scan_line_ok(self, line, scanned, expected_qty_done=1):
18
18
  batch = line.picking_id.batch_id
19
- previous_qty_done = line.qty_done
19
+ previous_qty_done = line.qty_picked
20
20
  response = self.service.dispatch(
21
21
  "scan_line",
22
22
  params={
@@ -28,7 +28,7 @@ class ClusterPickingScanLineCase(ClusterPickingLineCommonCase):
28
28
  # For any barcode scanned, the quantity done is set in
29
29
  # the response data to fully done but the record is not updated.
30
30
  # We ensure the qty has not changed in the record.
31
- self.assertEqual(line.qty_done, previous_qty_done)
31
+ self.assertEqual(line.qty_picked, previous_qty_done)
32
32
 
33
33
  self.assert_response(
34
34
  response,
@@ -195,7 +195,7 @@ class ClusterPickingStockIssue(ClusterPickingCommonCase):
195
195
  [
196
196
  {
197
197
  "location_id": self.shelf1.id,
198
- "qty_done": 5.0,
198
+ "qty_picked": 5.0,
199
199
  "result_package_id": self.dest_package.id,
200
200
  }
201
201
  ],
@@ -349,7 +349,8 @@ class ClusterPickingStockIssue(ClusterPickingCommonCase):
349
349
  [
350
350
  {
351
351
  "location_id": self.shelf1.id,
352
- "qty_done": 1.0,
352
+ "qty_picked": 1.0,
353
+ "picked": True,
353
354
  "result_package_id": self.dest_package.id,
354
355
  }
355
356
  ],
@@ -155,19 +155,25 @@ class ClusterPickingSetDestinationAllCase(ClusterPickingUnloadingCommonCase):
155
155
  [
156
156
  {
157
157
  "shopfloor_unloaded": True,
158
- "qty_done": 10,
158
+ "qty_picked": 10,
159
+ "quantity": 10,
160
+ "picked": True,
159
161
  "state": "done",
160
162
  "location_dest_id": self.packing_location.id,
161
163
  },
162
164
  {
163
165
  "shopfloor_unloaded": True,
164
- "qty_done": 10,
166
+ "qty_picked": 10,
167
+ "quantity": 10,
168
+ "picked": True,
165
169
  "state": "done",
166
170
  "location_dest_id": self.packing_location.id,
167
171
  },
168
172
  {
169
173
  "shopfloor_unloaded": True,
170
- "qty_done": 10,
174
+ "qty_picked": 10,
175
+ "quantity": 10,
176
+ "picked": True,
171
177
  "state": "done",
172
178
  "location_dest_id": self.packing_location.id,
173
179
  },
@@ -178,6 +184,7 @@ class ClusterPickingSetDestinationAllCase(ClusterPickingUnloadingCommonCase):
178
184
  response,
179
185
  next_state="start",
180
186
  message={"message_type": "success", "body": "Batch Transfer complete"},
187
+ popup=self.ANY,
181
188
  )
182
189
 
183
190
  def test_set_destination_all_remaining_lines(self):
@@ -209,14 +216,18 @@ class ClusterPickingSetDestinationAllCase(ClusterPickingUnloadingCommonCase):
209
216
  [
210
217
  {
211
218
  "shopfloor_unloaded": True,
212
- "qty_done": 10,
219
+ "qty_picked": 10,
220
+ "quantity": 10,
221
+ "picked": True,
213
222
  "state": "done",
214
223
  "picking_id": self.one_line_picking.id,
215
224
  "location_dest_id": self.packing_location.id,
216
225
  },
217
226
  {
218
227
  "shopfloor_unloaded": True,
219
- "qty_done": 10,
228
+ "qty_picked": 10,
229
+ "quantity": 10,
230
+ "picked": True,
220
231
  # will be done when the second line of the picking is unloaded
221
232
  "state": "assigned",
222
233
  "picking_id": self.two_lines_picking.id,
@@ -224,7 +235,9 @@ class ClusterPickingSetDestinationAllCase(ClusterPickingUnloadingCommonCase):
224
235
  },
225
236
  {
226
237
  "shopfloor_unloaded": False,
227
- "qty_done": 0,
238
+ "qty_picked": 0,
239
+ "quantity": 10,
240
+ "picked": False,
228
241
  "state": "assigned",
229
242
  "picking_id": self.two_lines_picking.id,
230
243
  "location_dest_id": self.packing_location.id,
@@ -239,6 +252,7 @@ class ClusterPickingSetDestinationAllCase(ClusterPickingUnloadingCommonCase):
239
252
  next_state="start_line",
240
253
  data=self._line_data(self.move_lines[2]),
241
254
  message={"body": "Batch Transfer line done", "message_type": "success"},
255
+ popup=self.ANY,
242
256
  )
243
257
 
244
258
  def test_set_destination_all_picking_unassigned(self):
@@ -278,6 +292,7 @@ class ClusterPickingSetDestinationAllCase(ClusterPickingUnloadingCommonCase):
278
292
  response,
279
293
  next_state="start",
280
294
  message=self.service.msg_store.batch_transfer_complete(),
295
+ popup=self.ANY,
281
296
  )
282
297
 
283
298
  def test_set_destination_all_but_different_dest(self):
@@ -358,8 +373,8 @@ class ClusterPickingSetDestinationAllCase(ClusterPickingUnloadingCommonCase):
358
373
  """
359
374
  move_lines = self.move_lines
360
375
  self._set_dest_package_and_done(move_lines, self.bin1)
361
- move_lines[0].move_id.location_dest_id = self.packing_a_location
362
- move_lines[0].picking_id.location_dest_id = self.packing_a_location
376
+ # writing dest loc on all moves to avoid entering _are_all_dest_location_same
377
+ move_lines.picking_id.location_dest_id = self.packing_a_location
363
378
 
364
379
  response = self.service.dispatch(
365
380
  "set_destination_all",
@@ -427,6 +442,7 @@ class ClusterPickingSetDestinationAllCase(ClusterPickingUnloadingCommonCase):
427
442
  response,
428
443
  next_state="start",
429
444
  message={"message_type": "success", "body": "Batch Transfer complete"},
445
+ popup=self.ANY,
430
446
  )
431
447
 
432
448
  def test_set_destination_all_check_confirmation(self):
@@ -589,7 +605,9 @@ class ClusterPickingUnloadScanDestinationCase(ClusterPickingUnloadingCommonCase)
589
605
  [
590
606
  {
591
607
  "shopfloor_unloaded": True,
592
- "qty_done": 10,
608
+ "qty_picked": 10,
609
+ "quantity": 10,
610
+ "picked": True,
593
611
  "state": "done",
594
612
  "picking_id": self.one_line_picking.id,
595
613
  "location_dest_id": self.packing_a_location.id,
@@ -601,14 +619,18 @@ class ClusterPickingUnloadScanDestinationCase(ClusterPickingUnloadingCommonCase)
601
619
  [
602
620
  {
603
621
  "shopfloor_unloaded": False,
604
- "qty_done": 10,
622
+ "qty_picked": 10,
623
+ "quantity": 10,
624
+ "picked": True,
605
625
  "state": "assigned",
606
626
  "picking_id": self.two_lines_picking.id,
607
627
  "location_dest_id": self.packing_b_location.id,
608
628
  },
609
629
  {
610
630
  "shopfloor_unloaded": False,
611
- "qty_done": 10,
631
+ "qty_picked": 10,
632
+ "quantity": 10,
633
+ "picked": True,
612
634
  "state": "assigned",
613
635
  "picking_id": self.two_lines_picking.id,
614
636
  "location_dest_id": self.packing_b_location.id,
@@ -619,10 +641,15 @@ class ClusterPickingUnloadScanDestinationCase(ClusterPickingUnloadingCommonCase)
619
641
 
620
642
  location = self.bin2_lines[0].location_dest_id
621
643
  data = self._data_for_batch(self.batch, location, pack=self.bin2)
644
+ # Odoo might create new destination moves which will yield a popup message.
645
+ # We are not testing anything else than the next state here, which should
646
+ # be unload_single, as the only thing that matters here is that we were
647
+ # able to process the picking.
622
648
  self.assert_response(
623
649
  response,
624
650
  next_state="unload_single",
625
651
  data=data,
652
+ popup=self.ANY,
626
653
  )
627
654
 
628
655
  def test_scan_destination_unload_package_enabled(self):
@@ -705,7 +732,9 @@ class ClusterPickingUnloadScanDestinationCase(ClusterPickingUnloadingCommonCase)
705
732
  [
706
733
  {
707
734
  "shopfloor_unloaded": True,
708
- "qty_done": 10,
735
+ "qty_picked": 10,
736
+ "quantity": 10,
737
+ "picked": True,
709
738
  "state": "assigned",
710
739
  "picking_id": self.two_lines_picking.id,
711
740
  "location_dest_id": self.packing_b_location.id,
@@ -717,7 +746,9 @@ class ClusterPickingUnloadScanDestinationCase(ClusterPickingUnloadingCommonCase)
717
746
  [
718
747
  {
719
748
  "shopfloor_unloaded": False,
720
- "qty_done": 10,
749
+ "qty_picked": 10,
750
+ "quantity": 10,
751
+ "picked": True,
721
752
  "state": "assigned",
722
753
  "picking_id": self.two_lines_picking.id,
723
754
  "location_dest_id": self.packing_b_location.id,
@@ -765,7 +796,9 @@ class ClusterPickingUnloadScanDestinationCase(ClusterPickingUnloadingCommonCase)
765
796
  [
766
797
  {
767
798
  "shopfloor_unloaded": True,
768
- "qty_done": 10,
799
+ "qty_picked": 10,
800
+ "quantity": 10,
801
+ "picked": True,
769
802
  "state": "done",
770
803
  "picking_id": self.two_lines_picking.id,
771
804
  "location_dest_id": self.packing_b_location.id,
@@ -774,10 +807,15 @@ class ClusterPickingUnloadScanDestinationCase(ClusterPickingUnloadingCommonCase)
774
807
  )
775
808
  self.assertRecordValues(self.batch, [{"state": "done"}])
776
809
 
810
+ # Odoo might create new destination moves which will yield a popup message.
811
+ # We are not testing anything else than the next state here, which should
812
+ # be unload_single, as the only thing that matters here is that we were
813
+ # able to process the picking.
777
814
  self.assert_response(
778
815
  response,
779
816
  next_state="start",
780
817
  message={"body": "Batch Transfer complete", "message_type": "success"},
818
+ popup=self.ANY,
781
819
  )
782
820
 
783
821
  def test_unload_scan_destination_error_location_not_found(self):
@@ -895,7 +933,13 @@ class ClusterPickingUnloadScanDestinationCase(ClusterPickingUnloadingCommonCase)
895
933
  {"location_dest_id": self.packing_a_location.id},
896
934
  ],
897
935
  )
898
- self.assert_response(response, next_state="unload_single", data=self.ANY)
936
+ # Odoo might create new destination moves which will yield a popup message.
937
+ # We are not testing anything else than the next state here, which should
938
+ # be unload_single, as the only thing that matters here is that we were
939
+ # able to process the picking.
940
+ self.assert_response(
941
+ response, next_state="unload_single", data=self.ANY, popup=self.ANY
942
+ )
899
943
 
900
944
  def test_unload_scan_destination_completion_info(self):
901
945
  """/unload_scan_destination that make chained picking ready"""
@@ -192,8 +192,10 @@ class TestStockSplit(TransactionCase):
192
192
  )
193
193
  # this method adds the quantity to the current quantity, so remove it
194
194
  quantity -= sum(quants.mapped("quantity"))
195
+ if not quantity:
196
+ return
195
197
  cls.env["stock.quant"]._update_available_quantity(
196
- product, location, quantity, package_id=package, lot_id=lot
198
+ product, location, quantity=quantity, package_id=package, lot_id=lot
197
199
  )
198
200
 
199
201
  def test_split_pickings_from_source_location(self):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: odoo-addon-shopfloor
3
- Version: 18.0.0.4.0
3
+ Version: 18.0.0.5.0
4
4
  Requires-Python: >=3.10
5
5
  Requires-Dist: odoo-addon-base_rest==18.0.*
6
6
  Requires-Dist: odoo-addon-jsonifier==18.0.*
@@ -42,7 +42,7 @@ Shopfloor
42
42
  !! This file is generated by oca-gen-addon-readme !!
43
43
  !! changes will be overwritten. !!
44
44
  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
45
- !! source digest: sha256:18da2d0922f39feb5fd987c2133de7d50cfbdc21f6d61cd82e799cb95182bae6
45
+ !! source digest: sha256:82699fc8ed59ec349f18149761cdefd28a4d13c4b41274373aa4e1ff02cc593b
46
46
  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
47
47
 
48
48
  .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
@@ -1,6 +1,6 @@
1
- odoo/addons/shopfloor/README.rst,sha256=6jFu8T4E7daW_crxxPsI0tG-LhZapP_S4RMNOPEfFag,6138
1
+ odoo/addons/shopfloor/README.rst,sha256=bWxl7EQ4nkZ2hXJJWTOwcvr7BSSbMzTj7VsfucYWi6I,6138
2
2
  odoo/addons/shopfloor/__init__.py,sha256=ke3RmZ7XkX-lz4S8NHAxNIEJ5_Nvj5bjBAqD-W-q73c,91
3
- odoo/addons/shopfloor/__manifest__.py,sha256=BsNXrwKnOHmt_Wir4-JNtg4oROPafHUR7PjFIpIJquM,2572
3
+ odoo/addons/shopfloor/__manifest__.py,sha256=ZOAsrUj9vnrx8654PRYNGoku-2pBFJ9QB__MvaAzrkA,2572
4
4
  odoo/addons/shopfloor/exceptions.py,sha256=81KpIGVkuYRhA0cIuml4pg4G3izqkAAhLqoXZbUd4X8,197
5
5
  odoo/addons/shopfloor/utils.py,sha256=Be7J8Tu7ivOW4lpe8IjKxwqfTwfmK-ZkeFEavoYIIF4,375
6
6
  odoo/addons/shopfloor/actions/__init__.py,sha256=_yTf-NtaJmSylBJIoJJvKNYEI-wlqpyRw-S5eJRRzEM,400
@@ -71,7 +71,7 @@ odoo/addons/shopfloor/readme/USAGE.md,sha256=YHN8xXpASu7XGNvmpV453zK86e5UyWeHPm-
71
71
  odoo/addons/shopfloor/security/groups.xml,sha256=hdLqRUZM_4RQnleinRYhxDxqW4VOI5li4oTsB7m96LQ,578
72
72
  odoo/addons/shopfloor/services/__init__.py,sha256=4lhF0VNx8QosVEZj9QJYgv6oWD0kl9FX80rL5WMrXf4,303
73
73
  odoo/addons/shopfloor/services/checkout.py,sha256=E40wOnnuKhpc98Q27ePz0nAvd9xB3-o6GSz8C7Hj6oc,82616
74
- odoo/addons/shopfloor/services/cluster_picking.py,sha256=zbcD74GsGuC1EQzmj4_uXNV0oBULWw4C7uFm85YMh0w,68729
74
+ odoo/addons/shopfloor/services/cluster_picking.py,sha256=mHnJnqTeeJkiD7pCKOb45E2Zd4mSEAYK2KcO2qgW8WA,69142
75
75
  odoo/addons/shopfloor/services/delivery.py,sha256=Gxbwp0x9XPLx9AJ3GFDSH69xHrQCD_R8m2i78kuuS6s,34352
76
76
  odoo/addons/shopfloor/services/location_content_transfer.py,sha256=ovx3w4xnACTlc-24JmUcGtcKgaTb1FXpZ31m2FhTGM4,50431
77
77
  odoo/addons/shopfloor/services/menu.py,sha256=m1eNOReTda_xD-p-m8k2Pn5cJQOLWTiaBGW46zxsYsk,2354
@@ -82,8 +82,8 @@ odoo/addons/shopfloor/services/zone_picking.py,sha256=BI25T234hcjlgGDIMjsO6PfDUK
82
82
  odoo/addons/shopfloor/services/forms/__init__.py,sha256=nxwJdKX47hb56ERf4Qb3UE5dkdsHCbkaXMAXs4XMAd8,27
83
83
  odoo/addons/shopfloor/services/forms/picking_form.py,sha256=pX1hbALlCqTVG3m1HYY5xtgbTcSHVnpaGaqm3akBS-U,2718
84
84
  odoo/addons/shopfloor/static/description/icon.png,sha256=6xBPJauaFOF0KDHfHgQopSc28kKvxMaeoQFQWZtfZDo,9455
85
- odoo/addons/shopfloor/static/description/index.html,sha256=dprCSPujzJVNU6_LDHNZUb4mDg-rmODadUjENbgDoUo,18540
86
- odoo/addons/shopfloor/tests/__init__.py,sha256=8t1Eocv-42M2tzBAkG3Wa6tsfhZIUIgxOspm3hqRCd4,4012
85
+ odoo/addons/shopfloor/static/description/index.html,sha256=HoTSlz9robP64j8fSLEEAOSJ0mq8WwUwi2j7tACozmg,18540
86
+ odoo/addons/shopfloor/tests/__init__.py,sha256=1L6fBScnX0sYhGhRfdrJAgc0BVT2bzO_43WJ8aiIhIU,3986
87
87
  odoo/addons/shopfloor/tests/common.py,sha256=lFdSQRXBjwCr7StVJltEwLtA_a4V77JcBcKkGAnAL5M,11676
88
88
  odoo/addons/shopfloor/tests/models.py,sha256=PWNPC6DgFMbrarojSxUqwycnBdePX-4Q5Z0rn1WwQqY,940
89
89
  odoo/addons/shopfloor/tests/test_actions_change_package_lot.py,sha256=bUn-FXPWY-eo4kaS0S7jU4ge_xl1A9jfU_rNZQT8ZPs,47528
@@ -115,19 +115,19 @@ odoo/addons/shopfloor/tests/test_checkout_select_line.py,sha256=LlyFiY5CL5i_kqXc
115
115
  odoo/addons/shopfloor/tests/test_checkout_select_package_base.py,sha256=Bm7J9lkq0NjXDB5o8wciK_tMW829EVRa-nQ_1wxB9og,2559
116
116
  odoo/addons/shopfloor/tests/test_checkout_set_qty.py,sha256=PFWh3_T3ccqS7q-ISuI6PKD1WjCGG3vrIv-kfGCUcRA,9491
117
117
  odoo/addons/shopfloor/tests/test_checkout_summary.py,sha256=n34MsVtM99B2rWHGyLDT-r2itWIhDXHbOKs47j2mDHE,2338
118
- odoo/addons/shopfloor/tests/test_cluster_picking_base.py,sha256=XN_LkgtCEnCoLgR9_WW38pmWqhOfJujn_InekRPY40c,2994
118
+ odoo/addons/shopfloor/tests/test_cluster_picking_base.py,sha256=U4Iv5AKQ05D4BgDXlwtAnfVAICqSdvYfjqduYzppPXE,2996
119
119
  odoo/addons/shopfloor/tests/test_cluster_picking_batch.py,sha256=my3zHY8L-zuIkGl9riexR5zWmL6cr00g1dWr5nEb4Uk,4074
120
- odoo/addons/shopfloor/tests/test_cluster_picking_change_pack_lot.py,sha256=mAZv4W0crG-we4RPZjWORGQ9Z0F9POhFObmvHR6SSbw,4165
121
- odoo/addons/shopfloor/tests/test_cluster_picking_is_zero.py,sha256=SQgXLkhyBVC1064ZXlpVsny3wdRrRyiFKsaB77f0UA8,3322
122
- odoo/addons/shopfloor/tests/test_cluster_picking_scan_destination.py,sha256=YXf97IhOEF9WXKZJjb-155dS_-Um5bKWQsqIeAjXlBA,14043
123
- odoo/addons/shopfloor/tests/test_cluster_picking_scan_destination_no_prefill_qty.py,sha256=hboVxHXNFqZ0DDTBqUBW9r6Dq428Vq5uj7fgaGIdPAg,4464
124
- odoo/addons/shopfloor/tests/test_cluster_picking_scan_line.py,sha256=bHOK4eraF83SBYWCbu4lcJfJ7VYw0XgEDQaKMHn_wBY,15654
120
+ odoo/addons/shopfloor/tests/test_cluster_picking_change_pack_lot.py,sha256=wQUwiRBjSSVOPVLqAYD3Rlz5Esx5nns5hzSgaTSzhjM,4167
121
+ odoo/addons/shopfloor/tests/test_cluster_picking_is_zero.py,sha256=1PbboD9FHq6X7ONY-4ZeWHVvUhbJU_SeV-CLHvH8zbY,3382
122
+ odoo/addons/shopfloor/tests/test_cluster_picking_scan_destination.py,sha256=ID1FZSBtJeq_9c_gAlYFfOrxDdIN3grV1MOaU80mMnI,14083
123
+ odoo/addons/shopfloor/tests/test_cluster_picking_scan_destination_no_prefill_qty.py,sha256=W2aSmQjyeJCzsETp-CvcU9Olbp7BJGaL9-m8aN8G9fU,4506
124
+ odoo/addons/shopfloor/tests/test_cluster_picking_scan_line.py,sha256=mHqqL9bvyOnWNRdvOrUpDSdBDyUnVKiIgMovMvNgphY,15658
125
125
  odoo/addons/shopfloor/tests/test_cluster_picking_scan_line_location_or_pack_first.py,sha256=cYzOtirVzMJUgO8oElrrRikq8ML1HXuHidBmEdVeL7M,4434
126
126
  odoo/addons/shopfloor/tests/test_cluster_picking_scan_line_no_prefill_qty.py,sha256=T-8V-Xug-T0cPe0XK09AlvL0S319QJk_-IPGP6v9es4,2897
127
127
  odoo/addons/shopfloor/tests/test_cluster_picking_select.py,sha256=BvuQznmCtOAipvgEhiUiTyeKR6nDkC5u9hCUZIF7MEc,15240
128
128
  odoo/addons/shopfloor/tests/test_cluster_picking_skip.py,sha256=CGTvP200X4XPX1sKIapTTJTw9Rs6aYh97c4k11IKBI8,3584
129
- odoo/addons/shopfloor/tests/test_cluster_picking_stock_issue.py,sha256=gpiRbyIjXkA_5Wbv75dc8ulFltFyj2iaBHijbf1stis,15790
130
- odoo/addons/shopfloor/tests/test_cluster_picking_unload.py,sha256=LWy1Fx7Pe1DJdwUdZPqQqKJVRG9UaL_0qo_vsE6JGDM,37029
129
+ odoo/addons/shopfloor/tests/test_cluster_picking_stock_issue.py,sha256=lcPC-w5PlkoknO7BVEl_aJitrtcn1_7YHCXIx7dnxJw,15830
130
+ odoo/addons/shopfloor/tests/test_cluster_picking_unload.py,sha256=3GqAj4jyCLaXEscCoNgS-wTSpbgO_1OoBp5a2vNZyxw,38989
131
131
  odoo/addons/shopfloor/tests/test_delivery_base.py,sha256=XlreffzVgz4aVlG2Vo5Q02ZB5cMV9kI5F1UUMGC9xQA,5005
132
132
  odoo/addons/shopfloor/tests/test_delivery_done.py,sha256=kKNvdxpIBmSMkDngENDBgpcQ-dA2x3863N42Si2N5Nw,4149
133
133
  odoo/addons/shopfloor/tests/test_delivery_list_stock_picking.py,sha256=g-oaXqQofQ8txnOmjt1WCogROhALNARHiZAgMTqXHt0,1922
@@ -158,7 +158,7 @@ odoo/addons/shopfloor/tests/test_scan_anything.py,sha256=3kgnAS60fmTYEsy6pK8pluK
158
158
  odoo/addons/shopfloor/tests/test_single_pack_transfer.py,sha256=GAzjurV-4e4xsWymo2LepjJq-aQI9lPNsoJBub9qVro,40934
159
159
  odoo/addons/shopfloor/tests/test_single_pack_transfer_base.py,sha256=kU_UyP0G3u3j9HmzMoNawd79w-hbN7zNxMiQ1CKSUyg,1255
160
160
  odoo/addons/shopfloor/tests/test_single_pack_transfer_putaway.py,sha256=ZcnzbrHpVFUeJJB2BywfkXpg8e7nyzvLP9v2Aqm2YPY,4415
161
- odoo/addons/shopfloor/tests/test_stock_split.py,sha256=OLADJMkFKcSU5E6hQe2eJqWEYEkPs2tsJvUgrWG2XOU,11208
161
+ odoo/addons/shopfloor/tests/test_stock_split.py,sha256=VW0f3iuvp8sFJJGv2FTXPYepiAsUS1MajaWh1pQYGSg,11261
162
162
  odoo/addons/shopfloor/tests/test_user.py,sha256=tpjFFS1lJ4VwT8fwfz2GseXJy-JhAWC6TjNizFT_uSg,1423
163
163
  odoo/addons/shopfloor/tests/test_zone_picking_base.py,sha256=I4mw2TP74mwU1lTxKulbP-Wm6i0xyOndrFSNWlkyqEI,20121
164
164
  odoo/addons/shopfloor/tests/test_zone_picking_change_pack_lot.py,sha256=9Bg29Zp-vfgnF-P4U1xgXhHWhOWxfQkzzublZU2Ee-A,5414
@@ -183,7 +183,7 @@ odoo/addons/shopfloor/views/shopfloor_menu.xml,sha256=LK_XdKawKqXPTaE1tq4r5dXR62
183
183
  odoo/addons/shopfloor/views/stock_location.xml,sha256=d7iqbOQZbb5YPSdAXlQ6spcj8dUvQ37DpEGuaLX5B1M,829
184
184
  odoo/addons/shopfloor/views/stock_move_line.xml,sha256=AmIO95-G0AD5i5C3x_BQL_NARXvyCfe4mg9iM97wD1U,1996
185
185
  odoo/addons/shopfloor/views/stock_picking_type.xml,sha256=M3U8xijiL6ZJUx2IiYelIYECsCRtOCU1J6lwlWzx3Jo,778
186
- odoo_addon_shopfloor-18.0.0.4.0.dist-info/METADATA,sha256=l7qaQJWVEmBnpeXx6NnXKyncdXAkw-PzaCVVLB7WElk,7580
187
- odoo_addon_shopfloor-18.0.0.4.0.dist-info/WHEEL,sha256=ZhOvUsYhy81Dx67gN3TV0RchQWBIIzutDZaJODDg2Vo,81
188
- odoo_addon_shopfloor-18.0.0.4.0.dist-info/top_level.txt,sha256=QE6RBQ0QX5f4eFuUcGgU5Kbq1A_qJcDs-e_vpr6pmfU,4
189
- odoo_addon_shopfloor-18.0.0.4.0.dist-info/RECORD,,
186
+ odoo_addon_shopfloor-18.0.0.5.0.dist-info/METADATA,sha256=SN5p3DSulKpV2ckquBp006l1wwKvsLtYpbg1Gy-inOY,7580
187
+ odoo_addon_shopfloor-18.0.0.5.0.dist-info/WHEEL,sha256=ZhOvUsYhy81Dx67gN3TV0RchQWBIIzutDZaJODDg2Vo,81
188
+ odoo_addon_shopfloor-18.0.0.5.0.dist-info/top_level.txt,sha256=QE6RBQ0QX5f4eFuUcGgU5Kbq1A_qJcDs-e_vpr6pmfU,4
189
+ odoo_addon_shopfloor-18.0.0.5.0.dist-info/RECORD,,