odoo-addon-shopfloor 16.0.2.2.1.6__py3-none-any.whl → 16.0.2.3.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.
@@ -7,7 +7,7 @@ Shopfloor
7
7
  !! This file is generated by oca-gen-addon-readme !!
8
8
  !! changes will be overwritten. !!
9
9
  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
10
- !! source digest: sha256:bb5933746c40b25c45fcadac4704a1a752a86c48bb857969ca935196736d24c6
10
+ !! source digest: sha256:4c4dc0050165bd957675ce9d57514bb2868133060d042e37d9ef7cba29c9fd6b
11
11
  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
12
12
 
13
13
  .. |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": "16.0.2.2.1",
9
+ "version": "16.0.2.3.0",
10
10
  "development_status": "Beta",
11
11
  "category": "Inventory",
12
12
  "website": "https://github.com/OCA/wms",
@@ -1,5 +1,7 @@
1
1
  # Copyright 2020 Camptocamp SA (http://www.camptocamp.com)
2
2
  # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
3
+ from collections import defaultdict
4
+
3
5
  from odoo.tools.float_utils import float_round
4
6
 
5
7
  from odoo.addons.component.core import Component
@@ -24,12 +26,47 @@ class DataDetailAction(Component):
24
26
  def _location_detail_parser(self):
25
27
  return self._location_parser + [
26
28
  "complete_name",
29
+ (
30
+ "quant_ids:products",
31
+ lambda record, fname: self._location_content(record),
32
+ ),
27
33
  (
28
34
  "reserved_move_line_ids:reserved_move_lines",
29
35
  lambda record, fname: self.move_lines(record[fname]),
30
36
  ),
31
37
  ]
32
38
 
39
+ def _location_content(self, record):
40
+ res = []
41
+ product_qties = defaultdict(lambda: defaultdict(lambda: 0))
42
+ for quant in record.quant_ids:
43
+ product_qties[quant.product_id][quant.lot_id] += quant.quantity
44
+ for product, quants_qty in product_qties.items():
45
+ val = self.product(product)
46
+ lots = []
47
+ val["lots"] = lots
48
+ qty_total = 0
49
+ for lot, qty in quants_qty.items():
50
+ qty_total += qty
51
+ if not lot:
52
+ continue
53
+ lot_val = self._location_lot(lot)
54
+ lot_val["quantity"] = qty
55
+ lots.append(lot_val)
56
+ val["quantity"] = qty_total
57
+ res.append(val)
58
+ return res
59
+
60
+ def _location_lot(self, record, **kw):
61
+ # Define a new method to not overload the base one which is used in many places
62
+ return self._jsonify(record, self._location_lot_detail_parser, **kw)
63
+
64
+ @property
65
+ def _location_lot_detail_parser(self):
66
+ return self._lot_parser + [
67
+ "removal_date",
68
+ ]
69
+
33
70
  @ensure_model("stock.picking")
34
71
  def picking_detail(self, record, **kw):
35
72
  parser = self._picking_detail_parser
@@ -92,7 +129,6 @@ class DataDetailAction(Component):
92
129
  def _lot_detail_parser(self):
93
130
  return self._lot_parser + [
94
131
  "removal_date",
95
- "expiration_date:expire_date",
96
132
  (
97
133
  "product_id:product",
98
134
  lambda record, fname: self.product_detail(record[fname]),
@@ -131,6 +167,10 @@ class DataDetailAction(Component):
131
167
  def _product_detail_parser(self):
132
168
  return self._product_parser + [
133
169
  ("image_128:image", self._product_image_url),
170
+ (
171
+ "stock_quant_ids:locations",
172
+ lambda record, fname: self._locations_for_product(record),
173
+ ),
134
174
  (
135
175
  "product_tmpl_id:manufacturer",
136
176
  lambda rec, fname: self._jsonify(
@@ -139,6 +179,36 @@ class DataDetailAction(Component):
139
179
  ),
140
180
  ]
141
181
 
182
+ def _get_product_locations(self, record):
183
+ # Retrieve all products -- maybe more than one location
184
+ product_template = record.product_tmpl_id
185
+ products = product_template.product_variant_ids
186
+ quants = self.env["stock.quant"].search(
187
+ [("product_id", "in", products.ids), ("location_id.usage", "=", "internal")]
188
+ )
189
+ return quants.location_id
190
+
191
+ def _locations_for_product(self, record):
192
+ res = []
193
+ for location in self._get_product_locations(record):
194
+ quants = location.quant_ids.filtered(lambda q: q.product_id == record)
195
+ loc = self.location(location)
196
+ loc["complete_name"] = location.complete_name
197
+ loc["quantity"] = sum(quants.mapped("quantity"))
198
+ lots = []
199
+ quants_lot_qty = defaultdict(lambda: 0)
200
+ for quant in quants:
201
+ quants_lot_qty[quant.lot_id] += quant.quantity
202
+ for lot, qty in quants_lot_qty.items():
203
+ if not lot:
204
+ continue
205
+ lot_val = self._location_lot(lot)
206
+ lot_val["quantity"] = qty
207
+ lots.append(lot_val)
208
+ loc["lots"] = lots
209
+ res.append(loc)
210
+ return res
211
+
142
212
  def _product_image_url(self, record, field_name):
143
213
  if not record[field_name]:
144
214
  return None
@@ -16,6 +16,27 @@ class ShopfloorSchemaDetailAction(Component):
16
16
  "required": True,
17
17
  },
18
18
  "reserved_move_lines": self._schema_list_of(self.move_line()),
19
+ "products": self._schema_list_of(self.location_product()),
20
+ }
21
+ )
22
+ return schema
23
+
24
+ def location_product(self):
25
+ schema = self.product()
26
+ schema.update(
27
+ {
28
+ "quantity": {"type": "float", "required": True},
29
+ "lots": self._schema_list_of(self.location_lot()),
30
+ }
31
+ )
32
+ return schema
33
+
34
+ def location_lot(self):
35
+ schema = self.lot()
36
+ schema.update(
37
+ {
38
+ "removal_date": {"type": "string", "nullable": True, "required": False},
39
+ "quantity": {"type": "float", "required": True},
19
40
  }
20
41
  )
21
42
  return schema
@@ -76,6 +97,22 @@ class ShopfloorSchemaDetailAction(Component):
76
97
  "image": {"type": "string", "nullable": True, "required": False},
77
98
  "manufacturer": self._schema_dict_of(self._simple_record()),
78
99
  "suppliers": self._schema_list_of(self.product_supplierinfo()),
100
+ "locations": self._schema_list_of(self.product_location()),
101
+ }
102
+ )
103
+ return schema
104
+
105
+ def product_location(self):
106
+ schema = self.location()
107
+ schema.update(
108
+ {
109
+ "complete_name": {
110
+ "type": "string",
111
+ "nullable": False,
112
+ "required": True,
113
+ },
114
+ "quantity": {"type": "float", "required": True},
115
+ "lots": self._schema_list_of(self.location_lot()),
79
116
  }
80
117
  )
81
118
  return schema
@@ -367,7 +367,7 @@ ul.auto-toc {
367
367
  !! This file is generated by oca-gen-addon-readme !!
368
368
  !! changes will be overwritten. !!
369
369
  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
370
- !! source digest: sha256:bb5933746c40b25c45fcadac4704a1a752a86c48bb857969ca935196736d24c6
370
+ !! source digest: sha256:4c4dc0050165bd957675ce9d57514bb2868133060d042e37d9ef7cba29c9fd6b
371
371
  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
372
372
  <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/licence-AGPL--3-blue.png" /></a> <a class="reference external image-reference" href="https://github.com/OCA/wms/tree/16.0/shopfloor"><img alt="OCA/wms" src="https://img.shields.io/badge/github-OCA%2Fwms-lightgray.png?logo=github" /></a> <a class="reference external image-reference" href="https://translation.odoo-community.org/projects/wms-16-0/wms-16-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/wms&amp;target_branch=16.0"><img alt="Try me on Runboat" src="https://img.shields.io/badge/runboat-Try%20me-875A7B.png" /></a></p>
373
373
  <p>Shopfloor is a barcode scanner application for internal warehouse operations.</p>
@@ -1,5 +1,7 @@
1
1
  # Copyright 2020 Camptocamp SA (http://www.camptocamp.com)
2
2
  # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
3
+ from collections import defaultdict
4
+
3
5
  from odoo.tools.float_utils import float_round
4
6
 
5
7
  from odoo.addons.shopfloor_base.tests.common_misc import ActionsDataTestMixin
@@ -181,6 +183,16 @@ class ActionsDataCaseBase(CommonCase, ActionsDataTestMixin):
181
183
  data.update(kw)
182
184
  return data
183
185
 
186
+ def _expected_lot(self, record, **kw):
187
+ data = {
188
+ "id": record.id,
189
+ "name": record.name,
190
+ "ref": record.ref or None,
191
+ "expiration_date": record.expiration_date or None,
192
+ }
193
+ data.update(kw)
194
+ return data
195
+
184
196
 
185
197
  class ActionsDataDetailCaseBase(ActionsDataCaseBase):
186
198
  @classmethod
@@ -206,6 +218,16 @@ class ActionsDataDetailCaseBase(ActionsDataCaseBase):
206
218
  "reserved_move_lines": self.data_detail.move_lines(
207
219
  kw.get("move_lines", [])
208
220
  ),
221
+ "products": self.data_detail._location_content(record),
222
+ }
223
+ )
224
+
225
+ def _expected_location_lot(self, record, **kw):
226
+ return dict(
227
+ **self._expected_lot(record),
228
+ **{
229
+ "removal_date": record.removal_date or None,
230
+ "quantity": sum(record.quant_ids.mapped("quantity")),
209
231
  }
210
232
  )
211
233
 
@@ -215,16 +237,35 @@ class ActionsDataDetailCaseBase(ActionsDataCaseBase):
215
237
  record.qty_available - record.free_qty,
216
238
  precision_rounding=record.uom_id.rounding,
217
239
  )
240
+ locations = self.data_detail._get_product_locations(record)
218
241
  detail = {
219
242
  "qty_available": qty_available,
220
243
  "qty_reserved": qty_reserved,
221
244
  }
245
+ locations_info = []
246
+ for location in locations:
247
+ quants = location.quant_ids.filtered(lambda q: q.product_id == record)
248
+ loc = self._expected_location(location)
249
+ loc["complete_name"] = location.complete_name
250
+ loc["quantity"] = sum(quants.mapped("quantity"))
251
+ loc["lots"] = []
252
+ quants_lot_qty = defaultdict(lambda: 0)
253
+ for quant in quants:
254
+ quants_lot_qty[quant.lot_id] += quant.quantity
255
+ for lot, qty in quants_lot_qty.items():
256
+ if not lot:
257
+ continue
258
+ lot_val = self._expected_location_lot(lot)
259
+ lot_val["quantity"] = qty
260
+ loc["lots"].append(lot_val)
261
+ locations_info.append(loc)
222
262
  if kw.get("full"):
223
263
  detail.update(
224
264
  {
225
265
  "image": "/web/image/product.product/{}/image_128".format(record.id)
226
266
  if record.image_128
227
267
  else None,
268
+ "locations": locations_info,
228
269
  "manufacturer": {
229
270
  "id": record.manufacturer_id.id,
230
271
  "name": record.manufacturer_id.name,
@@ -56,11 +56,12 @@ class TestActionsDataDetailCase(ActionsDataDetailCaseBase):
56
56
  "name": lot.name,
57
57
  "ref": "#FOO",
58
58
  "expiration_date": "2020-05-31T00:00:00",
59
+ "removal_date": "2020-05-20T00:00:00",
59
60
  "product": self._expected_product_detail(self.product_b, full=True),
60
61
  }
61
62
  # ignore time and TZ, we don't care here
62
- self.assertEqual(data.pop("removal_date").split("T")[0], "2020-05-20")
63
- self.assertEqual(data.pop("expire_date").split("T")[0], "2020-05-31")
63
+ self.assertEqual(data.get("removal_date", "").split("T")[0], "2020-05-20")
64
+ self.assertEqual(data.get("expiration_date", "").split("T")[0], "2020-05-31")
64
65
  self.assertDictEqual(data, expected)
65
66
 
66
67
  def test_data_package(self):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: odoo-addon-shopfloor
3
- Version: 16.0.2.2.1.6
3
+ Version: 16.0.2.3.0
4
4
  Summary: manage warehouse operations with barcode scanners
5
5
  Home-page: https://github.com/OCA/wms
6
6
  Author: Camptocamp, BCIM, Akretion, Odoo Community Association (OCA)
@@ -36,7 +36,7 @@ Shopfloor
36
36
  !! This file is generated by oca-gen-addon-readme !!
37
37
  !! changes will be overwritten. !!
38
38
  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
39
- !! source digest: sha256:bb5933746c40b25c45fcadac4704a1a752a86c48bb857969ca935196736d24c6
39
+ !! source digest: sha256:4c4dc0050165bd957675ce9d57514bb2868133060d042e37d9ef7cba29c9fd6b
40
40
  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
41
41
 
42
42
  .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
@@ -1,13 +1,13 @@
1
- odoo/addons/shopfloor/README.rst,sha256=1U0h74Cav3zjs92LORr6T9iXjU9F3zMclHtjAWm2uMc,5318
1
+ odoo/addons/shopfloor/README.rst,sha256=igj3JCBBGe9PVg72B3IpVRw7sJOj7cwqPPl3ZZSbV48,5318
2
2
  odoo/addons/shopfloor/__init__.py,sha256=ke3RmZ7XkX-lz4S8NHAxNIEJ5_Nvj5bjBAqD-W-q73c,91
3
- odoo/addons/shopfloor/__manifest__.py,sha256=uEOzWTHkQpWsYE52kY7ygBYjYF5x5pgXHFhKitDJv9c,2245
3
+ odoo/addons/shopfloor/__manifest__.py,sha256=A2L2IIHDaRHyEFyHu-m-r6_fqdO4z1viAx73eiFzc_s,2245
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
7
7
  odoo/addons/shopfloor/actions/change_package_lot.py,sha256=-MFk9G5vKJqWwaNYs9BSv4LHprbTLXE9xvRBNpfvFmo,6729
8
8
  odoo/addons/shopfloor/actions/completion_info.py,sha256=Q_wlx8VJHOPFZbwGrxHBYa-gt04ZAXBsRBGh0aLuRrk,1483
9
9
  odoo/addons/shopfloor/actions/data.py,sha256=ASj6VdLrkzJD6jTWsbKQ4LNZ_x2NU4BaXH_FA9RJvJQ,12846
10
- odoo/addons/shopfloor/actions/data_detail.py,sha256=m46sLSuQmxt5NHBoV1GNKsSmc26EHv-OFoMZ0Qz8l9E,6104
10
+ odoo/addons/shopfloor/actions/data_detail.py,sha256=eVW5oOpl5Tkwkpb0he0Xj_PHLRS8LkOa5VOI2w5R2Zo,8752
11
11
  odoo/addons/shopfloor/actions/inventory.py,sha256=Slg1hcV-kMb1jWHHu0VmYvQ9C0uqXtUAwAmHJUTE1zo,5976
12
12
  odoo/addons/shopfloor/actions/location_content_transfer_sorter.py,sha256=xpzea-w4zFrmpudQK3omRpZVhJdEIVQLXnuImkaZf5A,3110
13
13
  odoo/addons/shopfloor/actions/message.py,sha256=x12GUAQGq3HWOvf5D4D94NoIo_M9cARo0R6fiH1lKno,29956
@@ -15,7 +15,7 @@ odoo/addons/shopfloor/actions/move_line_search.py,sha256=Xhhx9RHaawNpa31DIgA8Q-c
15
15
  odoo/addons/shopfloor/actions/packaging.py,sha256=uZxD1bisNS_8M5ZQAHuOz2MR6l26XHR4VZY7QgA69Zs,2662
16
16
  odoo/addons/shopfloor/actions/savepoint.py,sha256=Tmqgh1k16x7L0ZSxVz9yNqIGLAyA7vFb5FWpLrb_GTI,1151
17
17
  odoo/addons/shopfloor/actions/schema.py,sha256=r7CLlzmcHRcaKL0_qQBUeMiDrxbIwYfQB_Ydq867JtU,8556
18
- odoo/addons/shopfloor/actions/schema_detail.py,sha256=7-e5tPLHKgNTamUy0tvWVsjhYHTP0pTzEP4BeZD2Bm8,3793
18
+ odoo/addons/shopfloor/actions/schema_detail.py,sha256=_xtm8ptRXAPBIMTyr8XKMQtogcjBudh-QRqKUZEEHGU,4968
19
19
  odoo/addons/shopfloor/actions/search.py,sha256=ai-pLBLWiDjKYlZ2uWZQG6PeB2jBj5-1D34XjELaXMY,6851
20
20
  odoo/addons/shopfloor/actions/stock.py,sha256=_m8b9u6V1P47G15RHw1JN4nLLy8N8bPlpe7Ip0QUpEs,10758
21
21
  odoo/addons/shopfloor/actions/stock_unreserve.py,sha256=LoFd9hzeNlTQEn0-FN3N4xWLSo1uuiw5E394OEPHm-Y,2720
@@ -84,14 +84,14 @@ odoo/addons/shopfloor/services/zone_picking.py,sha256=H6cA3NAHhxq3uUuwsCjep723fU
84
84
  odoo/addons/shopfloor/services/forms/__init__.py,sha256=nxwJdKX47hb56ERf4Qb3UE5dkdsHCbkaXMAXs4XMAd8,27
85
85
  odoo/addons/shopfloor/services/forms/picking_form.py,sha256=F15G5yw78Pd1WgPjMz00-K1JyGaTdfdvVYzG4Dubpqk,2626
86
86
  odoo/addons/shopfloor/static/description/icon.png,sha256=6xBPJauaFOF0KDHfHgQopSc28kKvxMaeoQFQWZtfZDo,9455
87
- odoo/addons/shopfloor/static/description/index.html,sha256=HEzd-EovG45y9j9WQixsl1TJCApIrkIEk8wyFu-OFC8,17547
87
+ odoo/addons/shopfloor/static/description/index.html,sha256=8N6zktuYYLeo0GK8epzFHAyjez1OTy4iwgBGr7hYokI,17547
88
88
  odoo/addons/shopfloor/tests/__init__.py,sha256=G9IP98Vs4Vx26FYbaxQcJST7xU7gjUggxTEiy8DPCMI,3902
89
89
  odoo/addons/shopfloor/tests/common.py,sha256=v1C7DQT-MvTk81xIYyv--c1BaIpwbia2ey8s35nvrK4,11611
90
90
  odoo/addons/shopfloor/tests/models.py,sha256=jNbYUqYLxkbQMn4j8bejHM3l6CRThJBDfpATl8H83OM,939
91
91
  odoo/addons/shopfloor/tests/test_actions_change_package_lot.py,sha256=iWtTEbIKKrwqvoCUyfuaq1jAtnrW3DP8BQ1xEdZk9t4,46829
92
92
  odoo/addons/shopfloor/tests/test_actions_data.py,sha256=pHuabdpTGbbvh7KSam-slLuwdIxLPy4JqZR0iLA9W4U,16514
93
- odoo/addons/shopfloor/tests/test_actions_data_base.py,sha256=vPhMBZ5xOKlY8So49PCLuxwqzRGo_GrRfZzcuwSHX4A,8920
94
- odoo/addons/shopfloor/tests/test_actions_data_detail.py,sha256=_bPJRbRVqisA7reXqrleXGfqtMb0Uq7ntakVn4C2T_Y,14016
93
+ odoo/addons/shopfloor/tests/test_actions_data_base.py,sha256=bstdEhLIwOTOzQNUrIs-M7lnPdWQ5AILIDn-cXqC4xM,10499
94
+ odoo/addons/shopfloor/tests/test_actions_data_detail.py,sha256=0eHM8z1kka0FhGMcDk-Rc8hQNvHlivNzWQEMOnZH-9A,14079
95
95
  odoo/addons/shopfloor/tests/test_actions_packaging.py,sha256=viofwEFk4aqn2tNaQGz2gGvBH6XoY25c6fO0a0uU448,1616
96
96
  odoo/addons/shopfloor/tests/test_actions_search.py,sha256=lQo4G1PRG0iiFD832-H7wDuuSgQR-iNkYmdWk0H-tBk,9139
97
97
  odoo/addons/shopfloor/tests/test_actions_search_move_line.py,sha256=ys7Y0mGdg3LNs8l1x8WCx8I_Qb9xsU9XAXOGPKuWv48,5783
@@ -185,7 +185,7 @@ odoo/addons/shopfloor/views/shopfloor_menu.xml,sha256=zAKIIMnglUsRnfvusKjKsRaZdQ
185
185
  odoo/addons/shopfloor/views/stock_location.xml,sha256=d7iqbOQZbb5YPSdAXlQ6spcj8dUvQ37DpEGuaLX5B1M,829
186
186
  odoo/addons/shopfloor/views/stock_move_line.xml,sha256=tn3pV67aRoYmn3qkm3aSgdYArY-z9SIrl_4fpJFy3Jo,1984
187
187
  odoo/addons/shopfloor/views/stock_picking_type.xml,sha256=Ckn2835hO4HtuZQX9x3382C4gs789fb94Cx0444mBkc,800
188
- odoo_addon_shopfloor-16.0.2.2.1.6.dist-info/METADATA,sha256=lrY2dwiv0TZ-4OUAgoOcao-0DUY9JTOG15lCqkdI9Z4,6763
189
- odoo_addon_shopfloor-16.0.2.2.1.6.dist-info/WHEEL,sha256=eOLhNAGa2EW3wWl_TU484h7q1UNgy0JXjjoqKoxAAQc,92
190
- odoo_addon_shopfloor-16.0.2.2.1.6.dist-info/top_level.txt,sha256=qBj40grFkGOfDZ2WDSw3y1RnDlgG0u8rP8pvGNdbz4w,5
191
- odoo_addon_shopfloor-16.0.2.2.1.6.dist-info/RECORD,,
188
+ odoo_addon_shopfloor-16.0.2.3.0.dist-info/METADATA,sha256=8wNWLnsyzRVU0_S0XBk0pnvMQgXH3gFvnXuEsZy3w5M,6761
189
+ odoo_addon_shopfloor-16.0.2.3.0.dist-info/WHEEL,sha256=eOLhNAGa2EW3wWl_TU484h7q1UNgy0JXjjoqKoxAAQc,92
190
+ odoo_addon_shopfloor-16.0.2.3.0.dist-info/top_level.txt,sha256=qBj40grFkGOfDZ2WDSw3y1RnDlgG0u8rP8pvGNdbz4w,5
191
+ odoo_addon_shopfloor-16.0.2.3.0.dist-info/RECORD,,