From c0b26dce578fa9aff4ca00f716b8483331812d75 Mon Sep 17 00:00:00 2001 From: Thierry Ducrest Date: Tue, 17 Oct 2023 12:07:25 +0200 Subject: [PATCH] Add shopfloor_location_package_restriction Finally it only contains tests so could be rename or better removed. --- .../shopfloor_location_package_restriction | 1 + .../setup.py | 6 ++ .../__init__.py | 0 .../__manifest__.py | 18 +++++ .../readme/CONTRIBUTORS.rst | 1 + .../readme/DESCRIPTION.rst | 7 ++ .../tests/__init__.py | 2 + ...test_single_pack_transfer_force_package.py | 69 +++++++++++++++++++ .../tests/test_zone_picking_force_package.py | 50 ++++++++++++++ 9 files changed, 154 insertions(+) create mode 120000 setup/shopfloor_location_package_restriction/odoo/addons/shopfloor_location_package_restriction create mode 100644 setup/shopfloor_location_package_restriction/setup.py create mode 100644 shopfloor_location_package_restriction/__init__.py create mode 100644 shopfloor_location_package_restriction/__manifest__.py create mode 100644 shopfloor_location_package_restriction/readme/CONTRIBUTORS.rst create mode 100644 shopfloor_location_package_restriction/readme/DESCRIPTION.rst create mode 100644 shopfloor_location_package_restriction/tests/__init__.py create mode 100644 shopfloor_location_package_restriction/tests/test_single_pack_transfer_force_package.py create mode 100644 shopfloor_location_package_restriction/tests/test_zone_picking_force_package.py diff --git a/setup/shopfloor_location_package_restriction/odoo/addons/shopfloor_location_package_restriction b/setup/shopfloor_location_package_restriction/odoo/addons/shopfloor_location_package_restriction new file mode 120000 index 0000000000..2104d7dd9b --- /dev/null +++ b/setup/shopfloor_location_package_restriction/odoo/addons/shopfloor_location_package_restriction @@ -0,0 +1 @@ +../../../../shopfloor_location_package_restriction \ No newline at end of file diff --git a/setup/shopfloor_location_package_restriction/setup.py b/setup/shopfloor_location_package_restriction/setup.py new file mode 100644 index 0000000000..28c57bb640 --- /dev/null +++ b/setup/shopfloor_location_package_restriction/setup.py @@ -0,0 +1,6 @@ +import setuptools + +setuptools.setup( + setup_requires=['setuptools-odoo'], + odoo_addon=True, +) diff --git a/shopfloor_location_package_restriction/__init__.py b/shopfloor_location_package_restriction/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/shopfloor_location_package_restriction/__manifest__.py b/shopfloor_location_package_restriction/__manifest__.py new file mode 100644 index 0000000000..53b8f6adf7 --- /dev/null +++ b/shopfloor_location_package_restriction/__manifest__.py @@ -0,0 +1,18 @@ +# Copyright 2023 Camptocamp SA +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html) + +{ + "name": "Shopfloor Location Package Restriction", + "summary": "Glue module between shopfloor and location package restriction", + "version": "14.0.1.0.0", + "category": "Inventory", + "website": "https://github.com/OCA/wms", + "author": "Camptocamp, Odoo Community Association (OCA)", + "license": "AGPL-3", + "depends": [ + "shopfloor", + # OCA/stock-logistics-warehouse + "stock_location_package_restriction", + ], + "auto_install": True, +} diff --git a/shopfloor_location_package_restriction/readme/CONTRIBUTORS.rst b/shopfloor_location_package_restriction/readme/CONTRIBUTORS.rst new file mode 100644 index 0000000000..0dd376faec --- /dev/null +++ b/shopfloor_location_package_restriction/readme/CONTRIBUTORS.rst @@ -0,0 +1 @@ +* Thierry Ducrest diff --git a/shopfloor_location_package_restriction/readme/DESCRIPTION.rst b/shopfloor_location_package_restriction/readme/DESCRIPTION.rst new file mode 100644 index 0000000000..6410f8969b --- /dev/null +++ b/shopfloor_location_package_restriction/readme/DESCRIPTION.rst @@ -0,0 +1,7 @@ +Glue module between `shopfloor` and `stock_location_package_restriction`. +It allows to send proper error message to the frontend instead of a stack +trace error being displayed. + +Finally his only use is to test. + +Should be removed. diff --git a/shopfloor_location_package_restriction/tests/__init__.py b/shopfloor_location_package_restriction/tests/__init__.py new file mode 100644 index 0000000000..a4486cba47 --- /dev/null +++ b/shopfloor_location_package_restriction/tests/__init__.py @@ -0,0 +1,2 @@ +from . import test_single_pack_transfer_force_package +from . import test_zone_picking_force_package diff --git a/shopfloor_location_package_restriction/tests/test_single_pack_transfer_force_package.py b/shopfloor_location_package_restriction/tests/test_single_pack_transfer_force_package.py new file mode 100644 index 0000000000..dcc64eede5 --- /dev/null +++ b/shopfloor_location_package_restriction/tests/test_single_pack_transfer_force_package.py @@ -0,0 +1,69 @@ +# Copyright 2023 Camptocamp SA +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) + +from odoo.addons.shopfloor.tests.test_single_pack_transfer_base import ( + SinglePackTransferCommonBase, +) + + +class TestSinglePackTransferForcePackage(SinglePackTransferCommonBase): + @classmethod + def setUpClass(cls): + super().setUpClass() + # Prepare the pack and related picking has started + cls.pack_a = cls.env["stock.quant.package"].create( + {"location_id": cls.stock_location.id} + ) + cls.quant_a = ( + cls.env["stock.quant"] + .sudo() + .create( + { + "product_id": cls.product_a.id, + "location_id": cls.shelf1.id, + "quantity": 1, + "package_id": cls.pack_a.id, + } + ) + ) + cls.picking = cls._create_initial_move(lines=[(cls.product_a, 1)]) + cls.move_line = cls.picking.move_line_ids + cls.package_level = cls.move_line.package_level_id + cls.package_level.is_done = True + cls.picking.move_line_ids.qty_done = 1 + # Add restriction on destination location + cls.shelf2.sudo().package_restriction = "singlepackage" + # Add a package on the destination location + cls.pack_1 = cls.env["stock.quant.package"].create( + {"location_id": cls.shelf2.id} + ) + cls._update_qty_in_location( + cls.shelf2, + cls.product_a, + 1, + package=cls.pack_1, + ) + + def test_scan_location_has_restrictions(self): + """ """ + response = self.service.dispatch( + "validate", + params={ + "package_level_id": self.package_level.id, + "location_barcode": self.shelf2.barcode, + }, + ) + message = { + "message_type": "error", + "body": ( + f"Only one package is allowed on the location " + f"{self.shelf2.display_name}.You cannot add " + f"the {self.move_line.package_id.name}, there is already {self.pack_1.name}." + ), + } + self.assert_response( + response, + next_state="scan_location", + data=self.ANY, + message=message, + ) diff --git a/shopfloor_location_package_restriction/tests/test_zone_picking_force_package.py b/shopfloor_location_package_restriction/tests/test_zone_picking_force_package.py new file mode 100644 index 0000000000..567d989a0b --- /dev/null +++ b/shopfloor_location_package_restriction/tests/test_zone_picking_force_package.py @@ -0,0 +1,50 @@ +# Copyright 2023 Camptocamp SA +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) + +from odoo.addons.shopfloor.tests.test_zone_picking_base import ZonePickingCommonCase + + +class TestZonePickingForcePackage(ZonePickingCommonCase): + def setUp(self): + super().setUp() + self.service.work.current_picking_type = self.picking1.picking_type_id + + def test_set_destination_location_package_restriction(self): + """Check error restriction on location is properly forwarded to frontend.""" + # Add a restriction on the location + self.packing_location.sudo().package_restriction = "singlepackage" + # Add a first package on the location + self.pack_1 = self.env["stock.quant.package"].create( + {"location_id": self.packing_location.id} + ) + self._update_qty_in_location( + self.packing_location, self.product_a, 1, package=self.pack_1 + ) + picking_type = self.picking1.picking_type_id + move_line = self.picking1.move_lines.move_line_ids + move_line.qty_done = move_line.product_uom_qty + response = self.service.dispatch( + "set_destination", + params={ + "move_line_id": move_line.id, + "barcode": self.packing_location.barcode, + "quantity": move_line.product_uom_qty, + "confirmation": False, + }, + ) + message = { + "message_type": "error", + "body": ( + f"Only one package is allowed on the location " + f"{self.packing_location.display_name}.You cannot add " + f"the {move_line.package_id.name}, there is already {self.pack_1.name}." + ), + } + self.assert_response_set_line_destination( + response, + self.zone_location, + picking_type, + move_line, + message=message, + qty_done=10.0, + )