odoo-addon-shopfloor 18.0.0.5.0.1__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.
- odoo/addons/shopfloor/README.rst +1 -1
- odoo/addons/shopfloor/__manifest__.py +1 -1
- odoo/addons/shopfloor/i18n/shopfloor.pot +50 -6
- odoo/addons/shopfloor/models/shopfloor_menu.py +61 -1
- odoo/addons/shopfloor/services/cluster_picking.py +89 -11
- odoo/addons/shopfloor/static/description/index.html +1 -1
- odoo/addons/shopfloor/tests/test_cluster_picking_sort_order.py +104 -0
- odoo/addons/shopfloor/views/shopfloor_menu.xml +16 -0
- {odoo_addon_shopfloor-18.0.0.5.0.1.dist-info → odoo_addon_shopfloor-18.0.0.6.0.dist-info}/METADATA +2 -2
- {odoo_addon_shopfloor-18.0.0.5.0.1.dist-info → odoo_addon_shopfloor-18.0.0.6.0.dist-info}/RECORD +12 -11
- {odoo_addon_shopfloor-18.0.0.5.0.1.dist-info → odoo_addon_shopfloor-18.0.0.6.0.dist-info}/WHEEL +0 -0
- {odoo_addon_shopfloor-18.0.0.5.0.1.dist-info → odoo_addon_shopfloor-18.0.0.6.0.dist-info}/top_level.txt +0 -0
odoo/addons/shopfloor/README.rst
CHANGED
@@ -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:
|
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.
|
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",
|
@@ -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
|
-
|
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
|
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
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
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:
|
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&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>
|
{odoo_addon_shopfloor-18.0.0.5.0.1.dist-info → odoo_addon_shopfloor-18.0.0.6.0.dist-info}/METADATA
RENAMED
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: odoo-addon-shopfloor
|
3
|
-
Version: 18.0.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:
|
45
|
+
!! source digest: sha256:63709bb5049a329746f85dcd55988b47e5e77d8a3be50ced7fc3768892762c22
|
46
46
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
47
47
|
|
48
48
|
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
|
{odoo_addon_shopfloor-18.0.0.5.0.1.dist-info → odoo_addon_shopfloor-18.0.0.6.0.dist-info}/RECORD
RENAMED
@@ -1,6 +1,6 @@
|
|
1
|
-
odoo/addons/shopfloor/README.rst,sha256=
|
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=
|
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
|
@@ -48,11 +48,11 @@ odoo/addons/shopfloor/i18n/de.po,sha256=WM-9Snw36HBNemQ-IBufDQeoTpsEhszvi9xPeARj
|
|
48
48
|
odoo/addons/shopfloor/i18n/es_AR.po,sha256=UNMrL-flfq08iZfrKhNL4LxsuZHz822Y-snRjuuPZNU,82475
|
49
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=
|
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=
|
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=
|
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=
|
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=
|
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.
|
187
|
-
odoo_addon_shopfloor-18.0.0.
|
188
|
-
odoo_addon_shopfloor-18.0.0.
|
189
|
-
odoo_addon_shopfloor-18.0.0.
|
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,,
|
{odoo_addon_shopfloor-18.0.0.5.0.1.dist-info → odoo_addon_shopfloor-18.0.0.6.0.dist-info}/WHEEL
RENAMED
File without changes
|
File without changes
|