odoo-addon-shopfloor 16.0.2.2.1.6__py3-none-any.whl → 16.0.2.4.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:ae2b67a7a72797798a86c8d85d4a2336941d01d21bf28ffde3b646be05924595
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.4.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
@@ -686,12 +686,19 @@ class MessageAction(Component):
686
686
  "body": _("The picked quantity must be a value above zero."),
687
687
  }
688
688
 
689
- def selected_lines_qty_done_higher_than_allowed(self):
689
+ def selected_lines_qty_done_higher_than_allowed(self, line):
690
+ """
691
+ :param line: The selected line
692
+ """
690
693
  return {
691
694
  "message_type": "warning",
692
695
  "body": _(
693
696
  "The quantity scanned for one or more lines cannot be "
694
- "higher than the maximum allowed."
697
+ "higher than the maximum allowed. "
698
+ "(%(product_name)s : %(quantity_done)s > %(quantity_reserved)s)",
699
+ product_name=line.product_id.name,
700
+ quantity_done=str(line.qty_done),
701
+ quantity_reserved=str(line.reserved_uom_qty),
695
702
  ),
696
703
  }
697
704
 
@@ -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
@@ -1673,7 +1673,7 @@ msgstr ""
1673
1673
  #, python-format
1674
1674
  msgid ""
1675
1675
  "The quantity scanned for one or more lines cannot be higher than the maximum"
1676
- " allowed."
1676
+ " allowed. (%(product_name)s : %(quantity_done)s > %(quantity_reserved)s)"
1677
1677
  msgstr ""
1678
1678
 
1679
1679
  #. module: shopfloor
@@ -1216,7 +1216,9 @@ class Checkout(Component):
1216
1216
  return self._response_for_select_package(
1217
1217
  picking,
1218
1218
  lines,
1219
- message=self.msg_store.selected_lines_qty_done_higher_than_allowed(),
1219
+ message=self.msg_store.selected_lines_qty_done_higher_than_allowed(
1220
+ line
1221
+ ),
1220
1222
  )
1221
1223
 
1222
1224
  def _set_dest_package_from_selection(self, picking, selected_lines, package):
@@ -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:ae2b67a7a72797798a86c8d85d4a2336941d01d21bf28ffde3b646be05924595
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,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 odoo.fields import first
4
+
3
5
  from .common import CommonCase
4
6
 
5
7
 
@@ -71,6 +73,7 @@ class CheckoutCommonCase(CommonCase):
71
73
  return data
72
74
 
73
75
  def _assert_select_package_qty_above(self, response, picking):
76
+ line = first(picking.move_line_ids)
74
77
  self.assert_response(
75
78
  response,
76
79
  next_state="select_package",
@@ -86,6 +89,12 @@ class CheckoutCommonCase(CommonCase):
86
89
  message={
87
90
  "message_type": "warning",
88
91
  "body": "The quantity scanned for one or more lines cannot be "
89
- "higher than the maximum allowed.",
92
+ "higher than the maximum allowed. "
93
+ "(%(product_name)s : %(quantity_done)s > %(quantity_reserved)s)"
94
+ % dict(
95
+ product_name=line.product_id.name,
96
+ quantity_done=str(line.qty_done),
97
+ quantity_reserved=str(line.reserved_uom_qty),
98
+ ),
90
99
  },
91
100
  )
@@ -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.4.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:ae2b67a7a72797798a86c8d85d4a2336941d01d21bf28ffde3b646be05924595
40
40
  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
41
41
 
42
42
  .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
@@ -1,21 +1,21 @@
1
- odoo/addons/shopfloor/README.rst,sha256=1U0h74Cav3zjs92LORr6T9iXjU9F3zMclHtjAWm2uMc,5318
1
+ odoo/addons/shopfloor/README.rst,sha256=L7bBz1XK-F0EdnF5TGAmEVwnVSKSBNjmOaCf3XXFezk,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=G-bPsQX4Uap-GwxSmuRn5ZNVL3WXg7Qf9h6S85mikvg,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
- odoo/addons/shopfloor/actions/message.py,sha256=x12GUAQGq3HWOvf5D4D94NoIo_M9cARo0R6fiH1lKno,29956
13
+ odoo/addons/shopfloor/actions/message.py,sha256=3LcFU5PvfVoBOU0CP27XQFqqKRrCi8qXTHV9j2NpBRA,30271
14
14
  odoo/addons/shopfloor/actions/move_line_search.py,sha256=Xhhx9RHaawNpa31DIgA8Q-cE_YmvBzqJlqkte_lgyY4,7719
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
@@ -48,7 +48,7 @@ odoo/addons/shopfloor/i18n/de.po,sha256=LSdchGr1zUVNlN6MYpa4B7T9opLsruAVF1wagA70
48
48
  odoo/addons/shopfloor/i18n/es_AR.po,sha256=X4Io7boNJLC5a4pU7pMbaLu4B-JWFtuRrIq_diev74Y,80012
49
49
  odoo/addons/shopfloor/i18n/it.po,sha256=E9CFPLju8IV8HS9lyf8ipN8ZaLpKNTRH87pAoiYpNHA,80252
50
50
  odoo/addons/shopfloor/i18n/pt_BR.po,sha256=ulg9i8rJdOYqIsejyRnlRUXBWgO1XQ_Fe_jimPUStZw,57574
51
- odoo/addons/shopfloor/i18n/shopfloor.pot,sha256=MTONXXg0MaL7fbQ0GuPdFHeu0DsCysIo-oLbzAsOLRk,57564
51
+ odoo/addons/shopfloor/i18n/shopfloor.pot,sha256=5JKZf-V6X6R7vTdOEHkX0xYuYneyzf_GbSzK7dL96DU,57627
52
52
  odoo/addons/shopfloor/migrations/16.0.2.0.0/post-migration.py,sha256=WfXnS5fj_K78VFaUAe0UiNhFX1C8LA0lkh6Zofllvc4,1311
53
53
  odoo/addons/shopfloor/migrations/16.0.2.2.1/post-init_search_move_line_options.py,sha256=OfsDBUUEKtWQOv9pU86edeFlnT2YiPli4PMpv74Q8IY,1176
54
54
  odoo/addons/shopfloor/models/__init__.py,sha256=hQY6dfl-ATXYffWa6cRlVQbyZ2BYc3voUNiNSC32miA,368
@@ -72,7 +72,7 @@ odoo/addons/shopfloor/readme/ROADMAP.rst,sha256=jIuyexuxAbyDWBPfoHzWU57KLUto6z56
72
72
  odoo/addons/shopfloor/readme/USAGE.rst,sha256=6Of9b6ec7gH1SKhdpBIaavsON0JWBFAzhb8KNz7Nmhc,308
73
73
  odoo/addons/shopfloor/security/groups.xml,sha256=hdLqRUZM_4RQnleinRYhxDxqW4VOI5li4oTsB7m96LQ,578
74
74
  odoo/addons/shopfloor/services/__init__.py,sha256=4lhF0VNx8QosVEZj9QJYgv6oWD0kl9FX80rL5WMrXf4,303
75
- odoo/addons/shopfloor/services/checkout.py,sha256=sNCRIJi7THcCoBWNIybfzJ2b82L_0MXWP1IS6a9I3AQ,76251
75
+ odoo/addons/shopfloor/services/checkout.py,sha256=HuXAH5S5QHeYSAXjQYQj-eng-CMssaFD1h6CZL0OcSs,76301
76
76
  odoo/addons/shopfloor/services/cluster_picking.py,sha256=v3UduBo5iIUW85nP7JtNFAsFr3LmePvGSK-DXvn_WYI,68221
77
77
  odoo/addons/shopfloor/services/delivery.py,sha256=ko2xre3q-P2LaGd4CMKFWJoavk9QXTI8WKXghf8PoL0,33226
78
78
  odoo/addons/shopfloor/services/location_content_transfer.py,sha256=gn-8W_u2tFT-A69Cot8B6CKG6pFB_21EjC2MYisfDME,49472
@@ -84,20 +84,20 @@ 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=lcZGBlNZMWcsyyZEyq9DN-QPKNudIQZlqODKvheUUB0,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
98
98
  odoo/addons/shopfloor/tests/test_actions_stock.py,sha256=f4OEAIa39szfOMvVUx686iKrmIusNLgLD9DesOpNH4k,1936
99
99
  odoo/addons/shopfloor/tests/test_checkout_auto_post.py,sha256=enJwyDLRz4N1yv1cCJXijoMZp8lvn1REhh6zCyIsO9c,3107
100
- odoo/addons/shopfloor/tests/test_checkout_base.py,sha256=tTHRsm4zEyVMi4ggKF0I0f-diHQHGxvk18PZHuwTmps,3162
100
+ odoo/addons/shopfloor/tests/test_checkout_base.py,sha256=39wOgGznoAq7-pl_qxKY6JGtX59ztVEtIAmnW63n6-w,3536
101
101
  odoo/addons/shopfloor/tests/test_checkout_cancel_line.py,sha256=Fpavj9awDAhjcU9XviMlmXGVHjwxZTra0i8qUT3jQkw,5366
102
102
  odoo/addons/shopfloor/tests/test_checkout_change_packaging.py,sha256=XuqbtEzRTn30o-C_IZejzND_eiPD40ZWgXpAQbpF2zQ,6321
103
103
  odoo/addons/shopfloor/tests/test_checkout_done.py,sha256=8lmJakrwSoZYmT-P_lqhFCnVSoHtJdsfNDYXNXzxuo8,6178
@@ -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.4.0.dist-info/METADATA,sha256=93M-wlrrg1iosk5_6VfLfPxmlG7hzpr2OoFJLgcDAPU,6761
189
+ odoo_addon_shopfloor-16.0.2.4.0.dist-info/WHEEL,sha256=eOLhNAGa2EW3wWl_TU484h7q1UNgy0JXjjoqKoxAAQc,92
190
+ odoo_addon_shopfloor-16.0.2.4.0.dist-info/top_level.txt,sha256=qBj40grFkGOfDZ2WDSw3y1RnDlgG0u8rP8pvGNdbz4w,5
191
+ odoo_addon_shopfloor-16.0.2.4.0.dist-info/RECORD,,