From a6e8dfef6ee6ca782397994f0f28b8558c30e333 Mon Sep 17 00:00:00 2001 From: Michael Tietz Date: Mon, 6 Nov 2023 14:54:14 +0100 Subject: [PATCH] [FIX] shopfloor_single_product_transfer: Package scan Do not remove result_package_id in call of _set_quantity__by_location when it was previously set by scanning a package --- shopfloor_single_product_transfer/README.rst | 3 +- .../readme/CONTRIBUTORS.rst | 1 + .../services/single_product_transfer.py | 31 +++++++++++++++---- .../static/description/index.html | 3 +- .../tests/common.py | 5 +++ .../tests/test_scan_location_or_package.py | 4 +-- .../tests/test_set_location.py | 12 +++---- .../tests/test_set_quantity.py | 10 +++--- .../README.rst | 3 +- .../readme/CONTRIBUTORS.rst | 1 + .../services/single_product_transfer.py | 15 +++++++-- .../static/description/index.html | 3 +- .../tests/test_force_package.py | 3 +- .../README.rst | 3 +- .../readme/CONTRIBUTORS.rst | 1 + .../services/single_product_transfer.py | 7 +++-- .../static/description/index.html | 3 +- 17 files changed, 75 insertions(+), 33 deletions(-) diff --git a/shopfloor_single_product_transfer/README.rst b/shopfloor_single_product_transfer/README.rst index d6b101a3599..569c9a9d72d 100644 --- a/shopfloor_single_product_transfer/README.rst +++ b/shopfloor_single_product_transfer/README.rst @@ -7,7 +7,7 @@ Shopfloor Single Product Transfer !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:0c02f49273316c190e1d17d298f97dbb41f4bf80e1c5341091bb90fff4c0404f + !! source digest: sha256:6c68d48d21b7dec7174f3018b1d89dac0781c150792d1c3f70adfc7d39052b3a !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png @@ -86,6 +86,7 @@ Contributors ~~~~~~~~~~~~ * Matthieu Méquignon +* Michael Tietz (MT Software) Maintainers ~~~~~~~~~~~ diff --git a/shopfloor_single_product_transfer/readme/CONTRIBUTORS.rst b/shopfloor_single_product_transfer/readme/CONTRIBUTORS.rst index bca4ee0cadb..246993b54e3 100644 --- a/shopfloor_single_product_transfer/readme/CONTRIBUTORS.rst +++ b/shopfloor_single_product_transfer/readme/CONTRIBUTORS.rst @@ -1 +1,2 @@ * Matthieu Méquignon +* Michael Tietz (MT Software) diff --git a/shopfloor_single_product_transfer/services/single_product_transfer.py b/shopfloor_single_product_transfer/services/single_product_transfer.py index 2a17323937f..f6786dc88eb 100644 --- a/shopfloor_single_product_transfer/services/single_product_transfer.py +++ b/shopfloor_single_product_transfer/services/single_product_transfer.py @@ -1,4 +1,5 @@ # Copyright 2022 Camptocamp SA +# Copyright 2023 Michael Tietz (MT Software) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) import logging @@ -578,7 +579,9 @@ def _valid_dest_location_for_menu(self): domain = self._valid_dest_location_for_menu_domain() return self.env["stock.location"].search(domain) - def _set_quantity__check_location(self, move_line, location, confirmation=False): + def _set_quantity__check_location( + self, move_line, location, package=None, confirmation=False + ): valid_locations_for_move_line = ( self._set_quantity__valid_dest_location_for_move_line(move_line) ) @@ -693,14 +696,26 @@ def _set_quantity__by_location_handlers(self): self._set_quantity__check_location, ] - def _set_quantity__by_location(self, move_line, location, confirmation=False): + def _set_quantity__by_location( + self, move_line, location, package=None, confirmation=False + ): # We're about to leave the `set_quantity` screen. # First ensure that quantity is valid. invalid_qty_response = self._set_quantity__check_quantity_done(move_line) if invalid_qty_response: return invalid_qty_response - move_line.result_package_id = False + # Do not remove the result_package_id + # when it was previously set by _set_quantity__by_package + # because _set_quantity__by_location will be then called + # with the scanned empty package + if not package: + move_line.result_package_id = False handlers = self._set_quantity__by_location_handlers() + # At this point the result_package_id is already + # set by _set_quantity__by_package to scanned package + # or set to False by this method + # Because of this call the handlers without the package + # to ensure the move_line's result_package_id gets checked response = self._use_handlers( handlers, move_line, location, confirmation=confirmation ) @@ -721,7 +736,11 @@ def _set_quantity__by_package(self, move_line, package, confirmation=False): location = package.location_id handlers = self._set_quantity__by_location_handlers() response = self._use_handlers( - handlers, move_line, location, confirmation=confirmation + handlers, + move_line, + location, + package=package, + confirmation=confirmation, ) if response: return response @@ -889,10 +908,10 @@ def set_location(self, selected_line_id, package_id, barcode): } search = self._actions_for("search") search_result = search.find(barcode, types=handlers_by_type.keys()) + package = self.env["stock.quant.package"].browse(package_id) handler = handlers_by_type.get(search_result.type) if handler: - return handler(move_line, search_result.record) - package = self.env["stock.quant.package"].browse(package_id) + return handler(move_line, search_result.record, package=package) message = self.msg_store.barcode_not_found() return self._response_for_set_location(move_line, package, message=message) diff --git a/shopfloor_single_product_transfer/static/description/index.html b/shopfloor_single_product_transfer/static/description/index.html index 391e1232ba3..c32e7697808 100644 --- a/shopfloor_single_product_transfer/static/description/index.html +++ b/shopfloor_single_product_transfer/static/description/index.html @@ -367,7 +367,7 @@

Shopfloor Single Product Transfer

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:0c02f49273316c190e1d17d298f97dbb41f4bf80e1c5341091bb90fff4c0404f +!! source digest: sha256:6c68d48d21b7dec7174f3018b1d89dac0781c150792d1c3f70adfc7d39052b3a !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

Beta License: AGPL-3 OCA/wms Translate me on Weblate Try me on Runboat

Allow to move a single product from a location to another one.

@@ -435,6 +435,7 @@

Authors

Contributors

diff --git a/shopfloor_single_product_transfer/tests/common.py b/shopfloor_single_product_transfer/tests/common.py index 66010584f93..543e3b94b50 100644 --- a/shopfloor_single_product_transfer/tests/common.py +++ b/shopfloor_single_product_transfer/tests/common.py @@ -140,3 +140,8 @@ def get_new_picking(cls): @classmethod def get_new_move(cls): return cls.env["stock.move"].search([("id", "not in", cls.existing_move_ids)]) + + @classmethod + def _create_empty_package(cls, name=None): + name = name or "test-package" + return cls.env["stock.quant.package"].sudo().create({"name": name}) diff --git a/shopfloor_single_product_transfer/tests/test_scan_location_or_package.py b/shopfloor_single_product_transfer/tests/test_scan_location_or_package.py index 1163ca837bb..28a8fc9dcc3 100644 --- a/shopfloor_single_product_transfer/tests/test_scan_location_or_package.py +++ b/shopfloor_single_product_transfer/tests/test_scan_location_or_package.py @@ -67,7 +67,7 @@ def test_scan_location_ok(self): def test_scan_location_stock_packages(self): location = self.location_src - package = self.env["stock.quant.package"].sudo().create({}) + package = self._create_empty_package() for quant in location.quant_ids: quant.sudo().package_id = package @@ -87,7 +87,7 @@ def test_scan_location_stock_packages(self): def test_scan_location_only_lines_with_package(self): location = self.location_src - package = self.env["stock.quant.package"].sudo().create({}) + package = self._create_empty_package() for line in location.source_move_line_ids: # There are no lines without a package in this location. line.package_id = package diff --git a/shopfloor_single_product_transfer/tests/test_set_location.py b/shopfloor_single_product_transfer/tests/test_set_location.py index ba09a5d1a0c..7b35bc46af7 100644 --- a/shopfloor_single_product_transfer/tests/test_set_location.py +++ b/shopfloor_single_product_transfer/tests/test_set_location.py @@ -21,11 +21,12 @@ def _setup_picking(cls): return cls._create_picking(lines=[(cls.product, 10)]) def test_set_location_ok(self): - package = ( - self.env["stock.quant.package"].sudo().create({"name": "test-package"}) - ) + package = self._create_empty_package() picking = self._setup_picking() move_line = picking.move_line_ids + # _set_quantity__by_package sets the result_package_id + # ensure that the package is still set after set_location + move_line.result_package_id = package location = self.dispatch_location response = self.service.dispatch( "set_location", @@ -35,6 +36,7 @@ def test_set_location_ok(self): "barcode": location.name, }, ) + self.assertEqual(move_line.result_package_id, package) expected_message = self.msg_store.transfer_done_success(move_line.picking_id) completion_info = self.service._actions_for("completion.info") expected_popup = completion_info.popup(move_line) @@ -48,9 +50,7 @@ def test_set_location_ok(self): ) def test_set_location_barcode_not_found(self): - package = ( - self.env["stock.quant.package"].sudo().create({"name": "test-package"}) - ) + package = self._create_empty_package() picking = self._setup_picking() move_line = picking.move_line_ids response = self.service.dispatch( diff --git a/shopfloor_single_product_transfer/tests/test_set_quantity.py b/shopfloor_single_product_transfer/tests/test_set_quantity.py index 88680ea6388..8c2a0fe28ac 100644 --- a/shopfloor_single_product_transfer/tests/test_set_quantity.py +++ b/shopfloor_single_product_transfer/tests/test_set_quantity.py @@ -720,6 +720,7 @@ def test_set_quantity_scan_location(self): self.assertEqual(picking.move_line_ids.product_uom_qty, 4.0) self.assertEqual(picking.move_line_ids.qty_done, 0.0) self.assertEqual(picking.move_line_ids.state, "assigned") + self.assertFalse(picking.move_line_ids.result_package_id) def test_set_quantity_scan_location_allow_move_create(self): self.menu.sudo().allow_move_create = True @@ -732,6 +733,7 @@ def test_set_quantity_scan_location_allow_move_create(self): ) # Change the destination on the move_line and take less than the total amount required. move_line = picking.move_line_ids + self.service.dispatch( "set_quantity", params={ @@ -752,9 +754,7 @@ def test_set_quantity_scan_location_allow_move_create(self): def test_set_quantity_scan_package_not_empty(self): # We scan a package that's not empty # and its location is selected. - package = ( - self.env["stock.quant.package"].sudo().create({"name": "test-package"}) - ) + package = self._create_empty_package() self.env["stock.quant"].sudo().create( { "package_id": package.id, @@ -793,9 +793,7 @@ def test_set_quantity_scan_package_not_empty(self): def test_set_quantity_scan_package_empty(self): # We scan an empty package # and are redirected to set_location. - package = ( - self.env["stock.quant.package"].sudo().create({"name": "test-package"}) - ) + package = self._create_empty_package() picking = self._setup_picking() move_line = picking.move_line_ids response = self.service.dispatch( diff --git a/shopfloor_single_product_transfer_force_package/README.rst b/shopfloor_single_product_transfer_force_package/README.rst index 54b21b4c40f..181c2ac9e94 100644 --- a/shopfloor_single_product_transfer_force_package/README.rst +++ b/shopfloor_single_product_transfer_force_package/README.rst @@ -7,7 +7,7 @@ Shopfloor Single Product Transfer Force Select Package !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:5c5fcdf15f9d541770a2f5b6662b44e8d9b213a07ddf924f8030465ffb46aa8f + !! source digest: sha256:e82edcbccff746daa3c4eb6aa9014931e7b70cc699598b4ab2752ee137708ec8 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png @@ -57,6 +57,7 @@ Contributors ~~~~~~~~~~~~ * Juan Miguel Sánchez Arce +* Michael Tietz (MT Software) Maintainers ~~~~~~~~~~~ diff --git a/shopfloor_single_product_transfer_force_package/readme/CONTRIBUTORS.rst b/shopfloor_single_product_transfer_force_package/readme/CONTRIBUTORS.rst index a307f9f7c37..c376f0f1624 100644 --- a/shopfloor_single_product_transfer_force_package/readme/CONTRIBUTORS.rst +++ b/shopfloor_single_product_transfer_force_package/readme/CONTRIBUTORS.rst @@ -1 +1,2 @@ * Juan Miguel Sánchez Arce +* Michael Tietz (MT Software) diff --git a/shopfloor_single_product_transfer_force_package/services/single_product_transfer.py b/shopfloor_single_product_transfer_force_package/services/single_product_transfer.py index 6606b612c36..fb8721a2a21 100644 --- a/shopfloor_single_product_transfer_force_package/services/single_product_transfer.py +++ b/shopfloor_single_product_transfer_force_package/services/single_product_transfer.py @@ -1,4 +1,5 @@ # Copyright 2023 Camptocamp SA +# Copyright 2023 Michael Tietz (MT Software) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) @@ -8,12 +9,20 @@ class ShopfloorSingleProductTransfer(Component): _inherit = "shopfloor.single.product.transfer" - def _set_quantity__check_location(self, move_line, location, confirmation=False): + def _set_quantity__check_location( + self, move_line, location, package=None, confirmation=False + ): # We add an additional check to verify if the location requires packages # and return a message to the user accordingly. - if location.package_restriction and not move_line.result_package_id: + if ( + location.package_restriction + and not package + and not move_line.result_package_id + ): message = self.msg_store.location_requires_package() return self._response_for_set_quantity( move_line, message=message, asking_confirmation=None ) - return super()._set_quantity__check_location(move_line, location, confirmation) + return super()._set_quantity__check_location( + move_line, location, package=package, confirmation=confirmation + ) diff --git a/shopfloor_single_product_transfer_force_package/static/description/index.html b/shopfloor_single_product_transfer_force_package/static/description/index.html index 1d323df540b..6f5bb2073c6 100644 --- a/shopfloor_single_product_transfer_force_package/static/description/index.html +++ b/shopfloor_single_product_transfer_force_package/static/description/index.html @@ -367,7 +367,7 @@

Shopfloor Single Product Transfer Force Select Package

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:5c5fcdf15f9d541770a2f5b6662b44e8d9b213a07ddf924f8030465ffb46aa8f +!! source digest: sha256:e82edcbccff746daa3c4eb6aa9014931e7b70cc699598b4ab2752ee137708ec8 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

Beta License: AGPL-3 OCA/wms Translate me on Weblate Try me on Runboat

Force the user to select a package if they scan a location which already contains packages.

@@ -403,6 +403,7 @@

Authors

Contributors

diff --git a/shopfloor_single_product_transfer_force_package/tests/test_force_package.py b/shopfloor_single_product_transfer_force_package/tests/test_force_package.py index 8b0c816daf5..99644ea00ef 100644 --- a/shopfloor_single_product_transfer_force_package/tests/test_force_package.py +++ b/shopfloor_single_product_transfer_force_package/tests/test_force_package.py @@ -40,8 +40,7 @@ def test_force_package_mandatory_no_package(self): def test_force_package_mandatory_with_package(self): picking = self._setup_picking() move_line = picking.move_line_ids - package = self.env["stock.quant.package"].sudo().create({}) - move_line.result_package_id = package + package = self._create_empty_package() self.dispatch_location.sudo().package_restriction = "singlepackage" response = self.service.dispatch( "set_quantity", diff --git a/shopfloor_single_product_transfer_unique_order_at_location/README.rst b/shopfloor_single_product_transfer_unique_order_at_location/README.rst index 4be59bd5b24..57ee2ecc849 100644 --- a/shopfloor_single_product_transfer_unique_order_at_location/README.rst +++ b/shopfloor_single_product_transfer_unique_order_at_location/README.rst @@ -7,7 +7,7 @@ Shopfloor Single Product Transfer Unique Order Per Location !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:293d3465d5bee7cc00f12378573974df153d01784247d13d8f80373cdcb7121d + !! source digest: sha256:6009aa6960e9ba8bda6b2942b50f38fb7dd25cf7c0e1c9820f643c838e0ec0e9 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png @@ -60,6 +60,7 @@ Contributors ~~~~~~~~~~~~ * Thierry Ducrest +* Michael Tietz (MT Software) Maintainers ~~~~~~~~~~~ diff --git a/shopfloor_single_product_transfer_unique_order_at_location/readme/CONTRIBUTORS.rst b/shopfloor_single_product_transfer_unique_order_at_location/readme/CONTRIBUTORS.rst index 0dd376faecb..69c1ef02a8a 100644 --- a/shopfloor_single_product_transfer_unique_order_at_location/readme/CONTRIBUTORS.rst +++ b/shopfloor_single_product_transfer_unique_order_at_location/readme/CONTRIBUTORS.rst @@ -1 +1,2 @@ * Thierry Ducrest +* Michael Tietz (MT Software) diff --git a/shopfloor_single_product_transfer_unique_order_at_location/services/single_product_transfer.py b/shopfloor_single_product_transfer_unique_order_at_location/services/single_product_transfer.py index 832ae381bd5..3fb7605a409 100644 --- a/shopfloor_single_product_transfer_unique_order_at_location/services/single_product_transfer.py +++ b/shopfloor_single_product_transfer_unique_order_at_location/services/single_product_transfer.py @@ -1,4 +1,5 @@ # Copyright 2023 Camptocamp SA +# Copyright 2023 Michael Tietz (MT Software) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html) from odoo.exceptions import UserError @@ -10,9 +11,11 @@ class ShopfloorSingleProductTransfer(Component): _inherit = "shopfloor.single.product.transfer" def _set_quantity__check_location( - self, move_line, location=False, confirmation=False + self, move_line, location=False, package=False, confirmation=False ): - res = super()._set_quantity__check_location(move_line, location, confirmation) + res = super()._set_quantity__check_location( + move_line, location, package=package, confirmation=confirmation + ) # Could also be asking for confirmation with a warning if res and res.get("message", {}).get("message_type", "") == "error": return res diff --git a/shopfloor_single_product_transfer_unique_order_at_location/static/description/index.html b/shopfloor_single_product_transfer_unique_order_at_location/static/description/index.html index 0bfeba3ff55..510e3bd1d3b 100644 --- a/shopfloor_single_product_transfer_unique_order_at_location/static/description/index.html +++ b/shopfloor_single_product_transfer_unique_order_at_location/static/description/index.html @@ -367,7 +367,7 @@

Shopfloor Single Product Transfer Unique Order Per Location

Beta License: AGPL-3 OCA/wms Translate me on Weblate Try me on Runboat

When installed, this module restricts transfer to some non empty location @@ -406,6 +406,7 @@

Authors

Contributors