Skip to content

Commit

Permalink
[FIX] shopfloor_single_product_transfer: Package scan
Browse files Browse the repository at this point in the history
    Do not remove result_package_id in call of _set_quantity__by_location
    when it was previously set by scanning a package
  • Loading branch information
mt-software-de committed Nov 6, 2023
1 parent d775ba2 commit a6e8dfe
Show file tree
Hide file tree
Showing 17 changed files with 75 additions and 33 deletions.
3 changes: 2 additions & 1 deletion shopfloor_single_product_transfer/README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -86,6 +86,7 @@ Contributors
~~~~~~~~~~~~

* Matthieu Méquignon <[email protected]>
* Michael Tietz (MT Software) <[email protected]>

Maintainers
~~~~~~~~~~~
Expand Down
1 change: 1 addition & 0 deletions shopfloor_single_product_transfer/readme/CONTRIBUTORS.rst
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
* Matthieu Méquignon <[email protected]>
* Michael Tietz (MT Software) <[email protected]>
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
# Copyright 2022 Camptocamp SA
# Copyright 2023 Michael Tietz (MT Software) <[email protected]>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl)

import logging
Expand Down Expand Up @@ -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)
)
Expand Down Expand Up @@ -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
)
Expand All @@ -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
Expand Down Expand Up @@ -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)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -367,7 +367,7 @@ <h1 class="title">Shopfloor Single Product Transfer</h1>
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:0c02f49273316c190e1d17d298f97dbb41f4bf80e1c5341091bb90fff4c0404f
!! source digest: sha256:6c68d48d21b7dec7174f3018b1d89dac0781c150792d1c3f70adfc7d39052b3a
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<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/14.0/shopfloor_single_product_transfer"><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-14-0/wms-14-0-shopfloor_single_product_transfer"><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=14.0"><img alt="Try me on Runboat" src="https://img.shields.io/badge/runboat-Try%20me-875A7B.png" /></a></p>
<p>Allow to move a single product from a location to another one.</p>
Expand Down Expand Up @@ -435,6 +435,7 @@ <h2><a class="toc-backref" href="#toc-entry-4">Authors</a></h2>
<h2><a class="toc-backref" href="#toc-entry-5">Contributors</a></h2>
<ul class="simple">
<li>Matthieu Méquignon &lt;<a class="reference external" href="mailto:matthieu.mequignon&#64;camptocamp.com">matthieu.mequignon&#64;camptocamp.com</a>&gt;</li>
<li>Michael Tietz (MT Software) &lt;<a class="reference external" href="mailto:mtietz&#64;mt-software.de">mtietz&#64;mt-software.de</a>&gt;</li>
</ul>
</div>
<div class="section" id="maintainers">
Expand Down
5 changes: 5 additions & 0 deletions shopfloor_single_product_transfer/tests/common.py
Original file line number Diff line number Diff line change
Expand Up @@ -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})
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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
Expand Down
12 changes: 6 additions & 6 deletions shopfloor_single_product_transfer/tests/test_set_location.py
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand All @@ -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)
Expand All @@ -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(
Expand Down
10 changes: 4 additions & 6 deletions shopfloor_single_product_transfer/tests/test_set_quantity.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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={
Expand All @@ -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,
Expand Down Expand Up @@ -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(
Expand Down
3 changes: 2 additions & 1 deletion shopfloor_single_product_transfer_force_package/README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -57,6 +57,7 @@ Contributors
~~~~~~~~~~~~

* Juan Miguel Sánchez Arce <[email protected]>
* Michael Tietz (MT Software) <[email protected]>

Maintainers
~~~~~~~~~~~
Expand Down
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
* Juan Miguel Sánchez Arce <[email protected]>
* Michael Tietz (MT Software) <[email protected]>
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
# Copyright 2023 Camptocamp SA
# Copyright 2023 Michael Tietz (MT Software) <[email protected]>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl)


Expand All @@ -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
)
Original file line number Diff line number Diff line change
Expand Up @@ -367,7 +367,7 @@ <h1 class="title">Shopfloor Single Product Transfer Force Select Package</h1>
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:5c5fcdf15f9d541770a2f5b6662b44e8d9b213a07ddf924f8030465ffb46aa8f
!! source digest: sha256:e82edcbccff746daa3c4eb6aa9014931e7b70cc699598b4ab2752ee137708ec8
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<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/14.0/shopfloor_single_product_transfer_force_package"><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-14-0/wms-14-0-shopfloor_single_product_transfer_force_package"><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=14.0"><img alt="Try me on Runboat" src="https://img.shields.io/badge/runboat-Try%20me-875A7B.png" /></a></p>
<p>Force the user to select a package if they scan a location which already contains packages.</p>
Expand Down Expand Up @@ -403,6 +403,7 @@ <h2><a class="toc-backref" href="#toc-entry-3">Authors</a></h2>
<h2><a class="toc-backref" href="#toc-entry-4">Contributors</a></h2>
<ul class="simple">
<li>Juan Miguel Sánchez Arce &lt;<a class="reference external" href="mailto:juan.sanchez&#64;camptocamp.com">juan.sanchez&#64;camptocamp.com</a>&gt;</li>
<li>Michael Tietz (MT Software) &lt;<a class="reference external" href="mailto:mtietz&#64;mt-software.de">mtietz&#64;mt-software.de</a>&gt;</li>
</ul>
</div>
<div class="section" id="maintainers">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -60,6 +60,7 @@ Contributors
~~~~~~~~~~~~

* Thierry Ducrest <[email protected]>
* Michael Tietz (MT Software) <[email protected]>

Maintainers
~~~~~~~~~~~
Expand Down
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
* Thierry Ducrest <[email protected]>
* Michael Tietz (MT Software) <[email protected]>
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
# Copyright 2023 Camptocamp SA
# Copyright 2023 Michael Tietz (MT Software) <[email protected]>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)

from odoo.exceptions import UserError
Expand All @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -367,7 +367,7 @@ <h1 class="title">Shopfloor Single Product Transfer Unique Order Per Location</h
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:293d3465d5bee7cc00f12378573974df153d01784247d13d8f80373cdcb7121d
!! source digest: sha256:6009aa6960e9ba8bda6b2942b50f38fb7dd25cf7c0e1c9820f643c838e0ec0e9
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<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/14.0/shopfloor_single_product_transfer_unique_order_at_location"><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-14-0/wms-14-0-shopfloor_single_product_transfer_unique_order_at_location"><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=14.0"><img alt="Try me on Runboat" src="https://img.shields.io/badge/runboat-Try%20me-875A7B.png" /></a></p>
<p>When installed, this module restricts transfer to some non empty location
Expand Down Expand Up @@ -406,6 +406,7 @@ <h2><a class="toc-backref" href="#toc-entry-3">Authors</a></h2>
<h2><a class="toc-backref" href="#toc-entry-4">Contributors</a></h2>
<ul class="simple">
<li>Thierry Ducrest &lt;<a class="reference external" href="mailto:thierry.ducrest&#64;camptocamp.com">thierry.ducrest&#64;camptocamp.com</a>&gt;</li>
<li>Michael Tietz (MT Software) &lt;<a class="reference external" href="mailto:mtietz&#64;mt-software.de">mtietz&#64;mt-software.de</a>&gt;</li>
</ul>
</div>
<div class="section" id="maintainers">
Expand Down

0 comments on commit a6e8dfe

Please sign in to comment.