odoo-addon-shopfloor 18.0.0.5.0__py3-none-any.whl → 18.0.0.6.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:82699fc8ed59ec349f18149761cdefd28a4d13c4b41274373aa4e1ff02cc593b
14
+ !! source digest: sha256:63709bb5049a329746f85dcd55988b47e5e77d8a3be50ced7fc3768892762c22
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.5.0",
9
+ "version": "18.0.0.6.0",
10
10
  "development_status": "Beta",
11
11
  "category": "Inventory",
12
12
  "website": "https://github.com/OCA/stock-logistics-shopfloor",
@@ -6,7 +6,7 @@ msgid ""
6
6
  msgstr ""
7
7
  "Project-Id-Version: Odoo Server 14.0\n"
8
8
  "Report-Msgid-Bugs-To: \n"
9
- "PO-Revision-Date: 2025-05-28 10:54+0000\n"
9
+ "PO-Revision-Date: 2025-08-16 13:26+0000\n"
10
10
  "Last-Translator: mymage <stefano.consolaro@mymage.it>\n"
11
11
  "Language-Team: none\n"
12
12
  "Language: it\n"
@@ -1894,7 +1894,7 @@ msgstr "Il record su cui si stava lavorando non esiste più."
1894
1894
  #: code:addons/shopfloor/models/stock_move.py:0
1895
1895
  #, python-format
1896
1896
  msgid "The split order {} has been created."
1897
- msgstr "L'ordine sddiviso {} è stato creato."
1897
+ msgstr "L'ordine suddiviso {} è stato creato."
1898
1898
 
1899
1899
  #. module: shopfloor
1900
1900
  #: model:ir.model.fields,help:shopfloor.field_stock_move_line__picking_id
@@ -287,6 +287,15 @@ msgstr ""
287
287
  msgid "Bulk Line Count"
288
288
  msgstr ""
289
289
 
290
+ #. module: shopfloor
291
+ #: model:ir.model.fields,help:shopfloor.field_shopfloor_menu__move_line_processing_sort_order
292
+ msgid ""
293
+ "By priority & location:\n"
294
+ "> each line is sorted by priority and then by location to perform a smart path in the warehouse.\n"
295
+ "By location grouped by product:\n"
296
+ "> in case of multiple move lines for the same product, break the sorting to finalize a started product by processing all other move lines for that product in order to group a product on a picking device. When stacking products on a pallet, this prevents to spread a same product at different level on the stack."
297
+ msgstr ""
298
+
290
299
  #. module: shopfloor
291
300
  #. odoo-python
292
301
  #: code:addons/shopfloor/actions/message.py:0
@@ -354,6 +363,7 @@ msgid "Creation of moves is not allowed for menu {}."
354
363
  msgstr ""
355
364
 
356
365
  #. module: shopfloor
366
+ #: model:ir.model.fields.selection,name:shopfloor.selection__shopfloor_menu__move_line_processing_sort_order__custom_code
357
367
  #: model:ir.model.fields.selection,name:shopfloor.selection__shopfloor_menu__move_line_search_sort_order__custom_code
358
368
  msgid "Custom code"
359
369
  msgstr ""
@@ -363,11 +373,6 @@ msgstr ""
363
373
  msgid "Custom code to construct the key to sort move lines"
364
374
  msgstr ""
365
375
 
366
- #. module: shopfloor
367
- #: model:ir.model.fields,field_description:shopfloor.field_shopfloor_menu__move_line_search_sort_order_custom_code
368
- msgid "Custom sort key code"
369
- msgstr ""
370
-
371
376
  #. module: shopfloor
372
377
  #. odoo-python
373
378
  #: code:addons/shopfloor/models/shopfloor_menu.py:0
@@ -430,6 +435,14 @@ msgstr ""
430
435
  msgid "Do not pre-fill quantity to pick"
431
436
  msgstr ""
432
437
 
438
+ #. module: shopfloor
439
+ #. odoo-python
440
+ #: code:addons/shopfloor/services/cluster_picking.py:0
441
+ msgid ""
442
+ "Error when evaluating the move lines sorting code:\n"
443
+ " %s"
444
+ msgstr ""
445
+
433
446
  #. module: shopfloor
434
447
  #: model:ir.model.fields,help:shopfloor.field_stock_picking_type__shopfloor_zero_check
435
448
  msgid ""
@@ -529,6 +542,7 @@ msgid "Lines have different destination location."
529
542
  msgstr ""
530
543
 
531
544
  #. module: shopfloor
545
+ #: model:ir.model.fields.selection,name:shopfloor.selection__shopfloor_menu__move_line_processing_sort_order__location
532
546
  #: model:ir.model.fields.selection,name:shopfloor.selection__shopfloor_menu__move_line_search_sort_order__location
533
547
  msgid "Location"
534
548
  msgstr ""
@@ -545,6 +559,11 @@ msgstr ""
545
559
  msgid "Location Content Transfer"
546
560
  msgstr ""
547
561
 
562
+ #. module: shopfloor
563
+ #: model:ir.model.fields.selection,name:shopfloor.selection__shopfloor_menu__move_line_processing_sort_order__location_grouped_product
564
+ msgid "Location Grouping products"
565
+ msgstr ""
566
+
548
567
  #. module: shopfloor
549
568
  #: model:shopfloor.scenario,name:shopfloor.scenario_location_content_transfer
550
569
  msgid "Location content transfer"
@@ -645,11 +664,26 @@ msgstr ""
645
664
  msgid "Move Line Count"
646
665
  msgstr ""
647
666
 
667
+ #. module: shopfloor
668
+ #: model:ir.model.fields,field_description:shopfloor.field_shopfloor_menu__move_line_processing_sort_order_custom_code
669
+ msgid "Move Line Processing Sort Order Custom Code"
670
+ msgstr ""
671
+
672
+ #. module: shopfloor
673
+ #: model:ir.model.fields,field_description:shopfloor.field_shopfloor_menu__move_line_processing_sort_order_is_possible
674
+ msgid "Move Line Processing Sort Order Is Possible"
675
+ msgstr ""
676
+
648
677
  #. module: shopfloor
649
678
  #: model:ir.model.fields,field_description:shopfloor.field_shopfloor_menu__move_line_search_additional_domain_is_possible
650
679
  msgid "Move Line Search Additional Domain Is Possible"
651
680
  msgstr ""
652
681
 
682
+ #. module: shopfloor
683
+ #: model:ir.model.fields,field_description:shopfloor.field_shopfloor_menu__move_line_search_sort_order_custom_code
684
+ msgid "Move Line Search Sort Order Custom Code"
685
+ msgstr ""
686
+
653
687
  #. module: shopfloor
654
688
  #: model:ir.model.fields,field_description:shopfloor.field_shopfloor_menu__move_line_search_sort_order_is_possible
655
689
  msgid "Move Line Search Sort Order Is Possible"
@@ -1157,7 +1191,12 @@ msgstr ""
1157
1191
 
1158
1192
  #. module: shopfloor
1159
1193
  #: model:ir.model.fields,help:shopfloor.field_shopfloor_menu__move_line_search_sort_order_custom_code
1160
- msgid "Python code to sort move lines. "
1194
+ msgid "Python code to sort move lines on search. "
1195
+ msgstr ""
1196
+
1197
+ #. module: shopfloor
1198
+ #: model:ir.model.fields,help:shopfloor.field_shopfloor_menu__move_line_processing_sort_order_custom_code
1199
+ msgid "Python code to sort processing move lines."
1161
1200
  msgstr ""
1162
1201
 
1163
1202
  #. module: shopfloor
@@ -1437,6 +1476,11 @@ msgstr ""
1437
1476
  msgid "Someone is already working on these transfers"
1438
1477
  msgstr ""
1439
1478
 
1479
+ #. module: shopfloor
1480
+ #: model:ir.model.fields,field_description:shopfloor.field_shopfloor_menu__move_line_processing_sort_order
1481
+ msgid "Sort method used when processing move lines"
1482
+ msgstr ""
1483
+
1440
1484
  #. module: shopfloor
1441
1485
  #: model:ir.model.fields,field_description:shopfloor.field_shopfloor_menu__move_line_search_sort_order
1442
1486
  msgid "Sort method used when searching move lines"
@@ -55,6 +55,30 @@ If enabled, they will also be allowed
55
55
  to scan a destination package.
56
56
  """
57
57
 
58
+ MOVE_LINE_PROCESSING_SORT_ORDER_HELP = (
59
+ "By priority & location:\n"
60
+ "> each line is sorted by priority and then by location to perform a smart path in"
61
+ " the warehouse.\n"
62
+ "By location grouped by product:\n"
63
+ "> in case of multiple move lines for the same product, break the sorting to"
64
+ " finalize a started product by processing all other move lines for that product"
65
+ " in order to group a product on a picking device. When stacking products on a"
66
+ " pallet, this prevents to spread a same product at different level on the stack."
67
+ )
68
+
69
+ CUSTOM_CODE_DEFAULT = (
70
+ "# Available variables:\n"
71
+ "# - env: Odoo Environment on which the action is triggered\n"
72
+ "# - time, datetime, dateutil, timezone: useful Python libraries\n"
73
+ "# - records: lines to sort\n"
74
+ "# - default_filter_func: default filtering function\n"
75
+ "#\n"
76
+ "# To provide the order for stock.move.line records to be processed, define eg.:\n"
77
+ "# move_lines = records.filtered(default_filter_func).sorted()\n"
78
+ "\n"
79
+ "\n"
80
+ )
81
+
58
82
 
59
83
  class ShopfloorMenu(models.Model):
60
84
  _inherit = "shopfloor.menu"
@@ -247,7 +271,7 @@ class ShopfloorMenu(models.Model):
247
271
  default="priority",
248
272
  )
249
273
  move_line_search_sort_order_custom_code = fields.Text(
250
- string="Custom sort key code", help="Python code to sort move lines. "
274
+ help="Python code to sort move lines on search. "
251
275
  )
252
276
  require_destination_package = fields.Boolean(
253
277
  string="Destination package required",
@@ -260,6 +284,25 @@ class ShopfloorMenu(models.Model):
260
284
  require_destination_package_is_possible = fields.Boolean(
261
285
  compute="_compute_require_destination_package_is_possible"
262
286
  )
287
+ move_line_processing_sort_order_is_possible = fields.Boolean(
288
+ compute="_compute_move_line_processing_sort_order_is_possible"
289
+ )
290
+ move_line_processing_sort_order = fields.Selection(
291
+ selection=[
292
+ ("location", "Location"),
293
+ ("location_grouped_product", "Location Grouping products"),
294
+ ("custom_code", "Custom code"),
295
+ ],
296
+ string="Sort method used when processing move lines",
297
+ default="location",
298
+ required=True,
299
+ help=MOVE_LINE_PROCESSING_SORT_ORDER_HELP,
300
+ )
301
+
302
+ move_line_processing_sort_order_custom_code = fields.Text(
303
+ default=CUSTOM_CODE_DEFAULT,
304
+ help="Python code to sort processing move lines.",
305
+ )
263
306
 
264
307
  @api.onchange("unload_package_at_destination")
265
308
  def _onchange_unload_package_at_destination(self):
@@ -585,3 +628,20 @@ class ShopfloorMenu(models.Model):
585
628
  ):
586
629
  vals["move_line_search_sort_order_custom_code"] = ""
587
630
  return super().write(vals)
631
+
632
+ @api.depends("scenario_id")
633
+ def _compute_move_line_processing_sort_order_is_possible(self):
634
+ for menu in self:
635
+ menu.move_line_processing_sort_order_is_possible = (
636
+ menu.scenario_id.has_option("allow_move_line_processing_sort_order")
637
+ )
638
+
639
+ @api.constrains("move_line_processing_sort_order_custom_code")
640
+ def _check_python_code(self):
641
+ for menu in self.sudo().filtered("move_line_processing_sort_order_custom_code"):
642
+ msg = test_python_expr(
643
+ expr=menu.move_line_processing_sort_order_custom_code.strip(),
644
+ mode="exec",
645
+ )
646
+ if msg:
647
+ raise exceptions.ValidationError(msg)
@@ -2,9 +2,23 @@
2
2
  # Copyright 2020-2022 Jacques-Etienne Baudoux (BCIM) <je@bcim.be>
3
3
  # Copyright 2023 Michael Tietz (MT Software) <mtietz@mt-software.de>
4
4
  # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
5
- from odoo import _, fields
5
+ from pytz import timezone
6
+
7
+ from odoo import _, exceptions, fields
6
8
  from odoo.osv import expression
7
9
  from odoo.tools import str2bool
10
+ from odoo.tools.safe_eval import (
11
+ datetime as safe_datetime,
12
+ )
13
+ from odoo.tools.safe_eval import (
14
+ dateutil as safe_dateutil,
15
+ )
16
+ from odoo.tools.safe_eval import (
17
+ safe_eval,
18
+ )
19
+ from odoo.tools.safe_eval import (
20
+ time as safe_time,
21
+ )
8
22
 
9
23
  from odoo.addons.base_rest.components.service import to_int
10
24
  from odoo.addons.component.core import Component
@@ -362,17 +376,81 @@ class ClusterPicking(Component):
362
376
  # after ALL the other lines in the batch are processed.
363
377
  return lines.sorted(key=self._sort_key_lines)
364
378
 
379
+ @staticmethod
380
+ def _lines_filtering(line):
381
+ return (
382
+ line.state in ("assigned", "partially_available")
383
+ # On 'StockPicking.action_assign()', result_package_id is set to
384
+ # the same package as 'package_id'. Here, we need to exclude lines
385
+ # that were already put into a bin, i.e. the destination package
386
+ # is different.
387
+ and (
388
+ not line.result_package_id or line.result_package_id == line.package_id
389
+ )
390
+ )
391
+
392
+ def _group_by_product(self, lines):
393
+ grouped_line_ids = []
394
+ product_ids_checked = set()
395
+ for line in lines:
396
+ if line.product_id.id not in product_ids_checked:
397
+ same_product_line_ids = lines.filtered(
398
+ lambda x, line=line: x.product_id == line.product_id
399
+ ).ids
400
+ grouped_line_ids.extend(same_product_line_ids)
401
+ product_ids_checked.add(line.product_id.id)
402
+ lines = self.env["stock.move.line"].browse(grouped_line_ids)
403
+ return lines
404
+
365
405
  def _lines_to_pick(self, picking_batch):
366
- return self._lines_for_picking_batch(
367
- picking_batch,
368
- filter_func=lambda x: (
369
- x.state in ("assigned", "partially_available")
370
- # On 'StockPicking.action_assign()', result_package_id is set to
371
- # the same package as 'package_id'. Here, we need to exclude lines
372
- # that were already put into a bin, i.e. the destination package
373
- # is different.
374
- and (not x.result_package_id or x.result_package_id == x.package_id)
375
- ),
406
+ order = self.work.menu.move_line_processing_sort_order
407
+ if order == "location":
408
+ lines = self._lines_for_picking_batch(
409
+ picking_batch, filter_func=self._lines_filtering
410
+ )
411
+ elif order == "location_grouped_product":
412
+ # we need to call _lines_for_picking_batch
413
+ # without passing a filter_func so that the ordering is computed
414
+ # taking into account all lines in the batch,
415
+ # including those that have already been processed.
416
+ lines = self._lines_for_picking_batch(
417
+ picking_batch,
418
+ filter_func=lambda x: x,
419
+ )
420
+ lines = self._group_by_product(lines).filtered(self._lines_filtering)
421
+ elif order == "custom_code":
422
+ lines = self._eval_custom_code(picking_batch)
423
+ return lines
424
+
425
+ def _eval_context(self, move_lines):
426
+ return {
427
+ "uid": self.env.uid,
428
+ "user": self.env.user,
429
+ "time": safe_time,
430
+ "datetime": safe_datetime,
431
+ "dateutil": safe_dateutil,
432
+ "timezone": timezone,
433
+ # orm
434
+ "env": self.env,
435
+ # record
436
+ "records": move_lines,
437
+ # filter
438
+ "default_filter_func": self._lines_filtering,
439
+ }
440
+
441
+ def _eval_custom_code(self, picking_batch):
442
+ expr = self.work.menu.move_line_processing_sort_order_custom_code
443
+ move_lines = picking_batch.mapped("picking_ids.move_line_ids")
444
+ eval_context = self._eval_context(move_lines)
445
+ try:
446
+ safe_eval(expr, eval_context, mode="exec", nocopy=True)
447
+ except Exception as err:
448
+ msg = self.env._(
449
+ "Error when evaluating the move lines sorting code:\n %s", err
450
+ )
451
+ raise exceptions.UserError(msg) from err
452
+ return eval_context.get(
453
+ "move_lines", move_lines.filtered(self._lines_filtering)
376
454
  )
377
455
 
378
456
  def _last_picked_line(self, picking):
@@ -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:82699fc8ed59ec349f18149761cdefd28a4d13c4b41274373aa4e1ff02cc593b
375
+ !! source digest: sha256:63709bb5049a329746f85dcd55988b47e5e77d8a3be50ced7fc3768892762c22
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
@@ -0,0 +1,104 @@
1
+ # Copyright 2023 Camptocamp SA (https://www.camptocamp.com)
2
+ # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
3
+
4
+ from odoo import fields
5
+ from odoo.tests import tagged
6
+
7
+ from .test_cluster_picking_base import ClusterPickingCommonCase
8
+
9
+
10
+ @tagged("post_install", "-at_install")
11
+ class ClusterPickingSortOrder(ClusterPickingCommonCase):
12
+ @classmethod
13
+ def setUpClassBaseData(cls, *args, **kwargs):
14
+ super().setUpClassBaseData(*args, **kwargs)
15
+ cls.batch = cls._create_picking_batch(
16
+ [
17
+ [cls.BatchProduct(product=cls.product_a, quantity=1)],
18
+ [cls.BatchProduct(product=cls.product_b, quantity=1)],
19
+ [cls.BatchProduct(product=cls.product_d, quantity=1)],
20
+ [cls.BatchProduct(product=cls.product_c, quantity=1)],
21
+ [cls.BatchProduct(product=cls.product_b, quantity=1)],
22
+ ]
23
+ )
24
+ cls._simulate_batch_selected(cls.batch, in_package=True)
25
+ cls.menu.sudo().move_line_processing_sort_order = "location_grouped_product"
26
+ return
27
+
28
+ def test_custom_lines_order(self):
29
+ """The sorting of the lines in the batch groups lines with the same product"""
30
+ batch = self.batch
31
+
32
+ expected_lines_order = self._assign_different_locations(batch)
33
+
34
+ for expected_line in expected_lines_order:
35
+ # We are going to call this empoint once per line
36
+ # to simulate the fact that the lines have to be treated
37
+ # one at a time.
38
+ response = self.service.dispatch(
39
+ "confirm_start",
40
+ params={"picking_batch_id": batch.id},
41
+ )
42
+ returned_line = batch.move_line_ids.filtered(
43
+ lambda line,
44
+ response_line_id=response["data"]["start_line"]["id"]: line.id
45
+ == response_line_id
46
+ )
47
+ self.assertEqual(returned_line.id, expected_line.id)
48
+ returned_line.state = "confirmed"
49
+
50
+ def _assign_different_locations(self, batch):
51
+ # We assign one unique location to each line of the batch
52
+ # and we make sure each location has the sequence required for the test.
53
+ locations = self.env["stock.location"].search(
54
+ [("usage", "!=", "view")], limit=5
55
+ )
56
+ # The line with product A will have the lowest sequence.
57
+ line_product_a = batch.move_line_ids.filtered(
58
+ lambda line: line.product_id == self.product_a
59
+ )
60
+ line_product_a.location_id = locations[0]
61
+ line_product_a.location_id.shopfloor_picking_sequence = 1
62
+ line_product_a.state = "assigned"
63
+
64
+ # One of the lines with product B will have the second lowest sequence.
65
+ line_product_b_1 = fields.first(
66
+ batch.move_line_ids.filtered(lambda line: line.product_id == self.product_b)
67
+ )
68
+ line_product_b_1.location_id = locations[1]
69
+ line_product_b_1.location_id.shopfloor_picking_sequence = 2
70
+ line_product_b_1.state = "assigned"
71
+
72
+ # The line with product D will have the third lowest sequence.
73
+ line_product_d = batch.move_line_ids.filtered(
74
+ lambda line: line.product_id == self.product_d
75
+ )
76
+ line_product_d.location_id = locations[2]
77
+ line_product_d.location_id.shopfloor_picking_sequence = 3
78
+ line_product_d.state = "assigned"
79
+
80
+ # The line with product C will have the second highest sequence.
81
+ line_product_c = batch.move_line_ids.filtered(
82
+ lambda line: line.product_id == self.product_c
83
+ )
84
+ line_product_c.location_id = locations[3]
85
+ line_product_c.location_id.shopfloor_picking_sequence = 4
86
+ line_product_c.state = "assigned"
87
+
88
+ # The other line with product B will have the highest sequence.
89
+ line_product_b_2 = batch.move_line_ids.filtered(
90
+ lambda line: line.product_id == self.product_b
91
+ and line.location_id != locations[1]
92
+ )
93
+ line_product_b_2.location_id = locations[4]
94
+ line_product_b_2.location_id.shopfloor_picking_sequence = 5
95
+ line_product_b_2.state = "assigned"
96
+
97
+ # Return the lines in the order we expect once we sort by product.
98
+ return (
99
+ line_product_a,
100
+ line_product_b_1,
101
+ line_product_b_2,
102
+ line_product_d,
103
+ line_product_c,
104
+ )
@@ -171,6 +171,22 @@
171
171
  />
172
172
  </div>
173
173
  </group>
174
+ <group
175
+ name="move_line_processing_sort_order"
176
+ invisible="not move_line_processing_sort_order_is_possible"
177
+ >
178
+ <field name="move_line_processing_sort_order" />
179
+ </group>
180
+ </group>
181
+ <group name="options" position="after">
182
+ <group name="move_line_processing_sort_order_custom_code">
183
+ <field
184
+ name="move_line_processing_sort_order_custom_code"
185
+ invisible="move_line_processing_sort_order != 'custom_code'"
186
+ widget="ace"
187
+ options="{'mode': 'python'}"
188
+ />
189
+ </group>
174
190
  </group>
175
191
  </field>
176
192
  </record>
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: odoo-addon-shopfloor
3
- Version: 18.0.0.5.0
3
+ Version: 18.0.0.6.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:82699fc8ed59ec349f18149761cdefd28a4d13c4b41274373aa4e1ff02cc593b
45
+ !! source digest: sha256:63709bb5049a329746f85dcd55988b47e5e77d8a3be50ced7fc3768892762c22
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=bWxl7EQ4nkZ2hXJJWTOwcvr7BSSbMzTj7VsfucYWi6I,6138
1
+ odoo/addons/shopfloor/README.rst,sha256=vpeT4OYvvgw1SyxTVqx99AdJ1QPD8587hPRlns0xyaQ,6138
2
2
  odoo/addons/shopfloor/__init__.py,sha256=ke3RmZ7XkX-lz4S8NHAxNIEJ5_Nvj5bjBAqD-W-q73c,91
3
- odoo/addons/shopfloor/__manifest__.py,sha256=ZOAsrUj9vnrx8654PRYNGoku-2pBFJ9QB__MvaAzrkA,2572
3
+ odoo/addons/shopfloor/__manifest__.py,sha256=K1AyooaB8j3Kv9MPFYj1lohw5Fln9E7Z-O_6qnoGQRY,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
@@ -46,13 +46,13 @@ odoo/addons/shopfloor/docs/zone_picking_diag_seq.png,sha256=_qGnbfsShydA3Xjefaur
46
46
  odoo/addons/shopfloor/i18n/ca.po,sha256=QLsllWvqMYtFS0y3R7Y5xHk2u-_vYMyFf-Vf7e2-uXM,61397
47
47
  odoo/addons/shopfloor/i18n/de.po,sha256=WM-9Snw36HBNemQ-IBufDQeoTpsEhszvi9xPeARjoWo,59865
48
48
  odoo/addons/shopfloor/i18n/es_AR.po,sha256=UNMrL-flfq08iZfrKhNL4LxsuZHz822Y-snRjuuPZNU,82475
49
- odoo/addons/shopfloor/i18n/it.po,sha256=WWx_JjJxYZHFmsBrDUHikN4zuqo7hYP1CPJnV69_J2A,84433
49
+ odoo/addons/shopfloor/i18n/it.po,sha256=1bok_TEH6bpcx3ykkdSTiJkra2Y5ASU1l3VrzfBVp-8,84434
50
50
  odoo/addons/shopfloor/i18n/pt_BR.po,sha256=GK4yxA42sF-RHzqmVUocNCfUPVifOpGS7BuPt6BbnTY,59867
51
- odoo/addons/shopfloor/i18n/shopfloor.pot,sha256=f1K0aqY3G5QyWqkhqjMhPGjxb4SF82PE2AwiZBwqzWk,56857
51
+ odoo/addons/shopfloor/i18n/shopfloor.pot,sha256=IRbZaf5Cz0RoY9loimK_QBT9Xw52UU6x-vFf_wTfj4w,58901
52
52
  odoo/addons/shopfloor/models/__init__.py,sha256=hQY6dfl-ATXYffWa6cRlVQbyZ2BYc3voUNiNSC32miA,368
53
53
  odoo/addons/shopfloor/models/priority_postpone_mixin.py,sha256=AEu_K9mul_SmjyLK8NLCycRn3BLzirUqNOaf0RVYEpE,1503
54
54
  odoo/addons/shopfloor/models/shopfloor_app.py,sha256=ZfVahQYm0jzyeH7EtlOOhxYUif9OwcHIsyZAbQxEeXA,292
55
- odoo/addons/shopfloor/models/shopfloor_menu.py,sha256=aiA8y9bfy0JDgaRr1wwbRXmkleTefui7wksBS2qOYUM,23207
55
+ odoo/addons/shopfloor/models/shopfloor_menu.py,sha256=SjDzL7C7RdMrIc9oWndeg7uzHsE8EQsvLyhJSuFFDH0,25669
56
56
  odoo/addons/shopfloor/models/stock_location.py,sha256=InkhTmnqYZaXCXIarku-NS1T6BO8EmLxg2zBE0CHeZ8,3092
57
57
  odoo/addons/shopfloor/models/stock_move.py,sha256=FcfRILSZygUvFgTd-AjjW_SoKgUiQtzC-4u_BzK65vw,5671
58
58
  odoo/addons/shopfloor/models/stock_move_line.py,sha256=YuYcJlTDpKsDnfs19UJynnsQI2gCvu64XlQArxFvKOM,11463
@@ -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=mHnJnqTeeJkiD7pCKOb45E2Zd4mSEAYK2KcO2qgW8WA,69142
74
+ odoo/addons/shopfloor/services/cluster_picking.py,sha256=U40bzXXmxGOnKL7yhQzpZfAVyDL2sBbNHIbIcUfdBvg,71927
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,7 +82,7 @@ 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=HoTSlz9robP64j8fSLEEAOSJ0mq8WwUwi2j7tACozmg,18540
85
+ odoo/addons/shopfloor/static/description/index.html,sha256=VcVJce6blHWG92LiUbysuNWZtN35msLaLqA_BSAetO8,18540
86
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
@@ -126,6 +126,7 @@ odoo/addons/shopfloor/tests/test_cluster_picking_scan_line_location_or_pack_firs
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_sort_order.py,sha256=akgZdMuGKJHmB8kWCNPKyQ0JbYGtHAsgFINpInTWKOU,4396
129
130
  odoo/addons/shopfloor/tests/test_cluster_picking_stock_issue.py,sha256=lcPC-w5PlkoknO7BVEl_aJitrtcn1_7YHCXIx7dnxJw,15830
130
131
  odoo/addons/shopfloor/tests/test_cluster_picking_unload.py,sha256=3GqAj4jyCLaXEscCoNgS-wTSpbgO_1OoBp5a2vNZyxw,38989
131
132
  odoo/addons/shopfloor/tests/test_delivery_base.py,sha256=XlreffzVgz4aVlG2Vo5Q02ZB5cMV9kI5F1UUMGC9xQA,5005
@@ -179,11 +180,11 @@ odoo/addons/shopfloor/tests/test_zone_picking_unload_buffer_lines.py,sha256=dVb4
179
180
  odoo/addons/shopfloor/tests/test_zone_picking_unload_set_destination.py,sha256=3TtVsNGEgAGNNn5m2kS8yN7fxw1q-nZQcRAuMYetP2U,13625
180
181
  odoo/addons/shopfloor/tests/test_zone_picking_unload_single.py,sha256=QmUbxYansd1zpHBpRePkM25DSOuWZb9qYLOLjESS3kU,4387
181
182
  odoo/addons/shopfloor/tests/test_zone_picking_zero_check.py,sha256=HB0hrvRsH7Ucv1pQm-D8dMWq6tQuTbrI8CPFqZh0Zb0,1376
182
- odoo/addons/shopfloor/views/shopfloor_menu.xml,sha256=LK_XdKawKqXPTaE1tq4r5dXR62CmDQHl8SwrZnLeyJM,9319
183
+ odoo/addons/shopfloor/views/shopfloor_menu.xml,sha256=ffKWocGBGvE-hpaLMytpAm2FiQGfh3WzctnYyt3cP3A,10066
183
184
  odoo/addons/shopfloor/views/stock_location.xml,sha256=d7iqbOQZbb5YPSdAXlQ6spcj8dUvQ37DpEGuaLX5B1M,829
184
185
  odoo/addons/shopfloor/views/stock_move_line.xml,sha256=AmIO95-G0AD5i5C3x_BQL_NARXvyCfe4mg9iM97wD1U,1996
185
186
  odoo/addons/shopfloor/views/stock_picking_type.xml,sha256=M3U8xijiL6ZJUx2IiYelIYECsCRtOCU1J6lwlWzx3Jo,778
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,,
187
+ odoo_addon_shopfloor-18.0.0.6.0.dist-info/METADATA,sha256=297jSoYH8igaw-s7plmwt_NlCrAFiKEasshXBZGB3WA,7580
188
+ odoo_addon_shopfloor-18.0.0.6.0.dist-info/WHEEL,sha256=ZhOvUsYhy81Dx67gN3TV0RchQWBIIzutDZaJODDg2Vo,81
189
+ odoo_addon_shopfloor-18.0.0.6.0.dist-info/top_level.txt,sha256=QE6RBQ0QX5f4eFuUcGgU5Kbq1A_qJcDs-e_vpr6pmfU,4
190
+ odoo_addon_shopfloor-18.0.0.6.0.dist-info/RECORD,,