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 Oct 2, 2023
1 parent edf1b66 commit e9e69d5
Show file tree
Hide file tree
Showing 17 changed files with 117 additions and 82 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:b9eb8fb3c29f6d3f6fb4accd3164f71ebc141b09a9159f61b81b865a5452d199
!! source digest: sha256:162480d4e4510d692ce68870a0944e6a17dafbeb6945d3122a0d7aacf871ef9b
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |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 @@ -692,14 +695,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 @@ -718,7 +733,7 @@ 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, confirmation=confirmation
)
if response:
return response
Expand Down Expand Up @@ -882,10 +897,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)
message = self.msg_store.barcode_not_found()
return self._response_for_set_location(move_line, package, message=message)

Expand Down
39 changes: 20 additions & 19 deletions shopfloor_single_product_transfer/static/description/index.html
Original file line number Diff line number Diff line change
@@ -1,20 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="Docutils: https://docutils.sourceforge.io/" />
<meta name="generator" content="Docutils: http://docutils.sourceforge.net/" />
<title>Shopfloor Single Product Transfer</title>
<style type="text/css">

/*
:Author: David Goodger ([email protected])
:Id: $Id: html4css1.css 8954 2022-01-20 10:10:25Z milde $
:Id: $Id: html4css1.css 7952 2016-07-26 18:15:59Z milde $
:Copyright: This stylesheet has been placed in the public domain.
Default cascading style sheet for the HTML output of Docutils.
See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to
See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
customize this style sheet.
*/

Expand Down Expand Up @@ -367,25 +367,25 @@ <h1 class="title">Shopfloor Single Product Transfer</h1>
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:b9eb8fb3c29f6d3f6fb4accd3164f71ebc141b09a9159f61b81b865a5452d199
!! source digest: sha256:162480d4e4510d692ce68870a0944e6a17dafbeb6945d3122a0d7aacf871ef9b
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<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><a class="reference external" 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" 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" 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" 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" 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>
<p><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><a class="reference internal" href="#usage" id="toc-entry-1">Usage</a></li>
<li><a class="reference internal" href="#bug-tracker" id="toc-entry-2">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="toc-entry-3">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="toc-entry-4">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="toc-entry-5">Contributors</a></li>
<li><a class="reference internal" href="#maintainers" id="toc-entry-6">Maintainers</a></li>
<li><a class="reference internal" href="#usage" id="id1">Usage</a></li>
<li><a class="reference internal" href="#bug-tracker" id="id2">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="id3">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="id4">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="id5">Contributors</a></li>
<li><a class="reference internal" href="#maintainers" id="id6">Maintainers</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="usage">
<h1><a class="toc-backref" href="#toc-entry-1">Usage</a></h1>
<h1><a class="toc-backref" href="#id1">Usage</a></h1>
<dl class="docutils">
<dt><strong>Source location selection</strong></dt>
<dd>Select a source location.
Expand Down Expand Up @@ -416,36 +416,37 @@ <h1><a class="toc-backref" href="#toc-entry-1">Usage</a></h1>
</dl>
</div>
<div class="section" id="bug-tracker">
<h1><a class="toc-backref" href="#toc-entry-2">Bug Tracker</a></h1>
<h1><a class="toc-backref" href="#id2">Bug Tracker</a></h1>
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/wms/issues">GitHub Issues</a>.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
<a class="reference external" href="https://github.com/OCA/wms/issues/new?body=module:%20shopfloor_single_product_transfer%0Aversion:%2014.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
<p>Do not contact contributors directly about support or help with technical issues.</p>
</div>
<div class="section" id="credits">
<h1><a class="toc-backref" href="#toc-entry-3">Credits</a></h1>
<h1><a class="toc-backref" href="#id3">Credits</a></h1>
<div class="section" id="authors">
<h2><a class="toc-backref" href="#toc-entry-4">Authors</a></h2>
<h2><a class="toc-backref" href="#id4">Authors</a></h2>
<ul class="simple">
<li>Camptocamp</li>
</ul>
</div>
<div class="section" id="contributors">
<h2><a class="toc-backref" href="#toc-entry-5">Contributors</a></h2>
<h2><a class="toc-backref" href="#id5">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">
<h2><a class="toc-backref" href="#toc-entry-6">Maintainers</a></h2>
<h2><a class="toc-backref" href="#id6">Maintainers</a></h2>
<p>This module is maintained by the OCA.</p>
<a class="reference external image-reference" href="https://odoo-community.org"><img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" /></a>
<p>OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.</p>
<p>Current <a class="reference external" href="https://odoo-community.org/page/maintainer-role">maintainer</a>:</p>
<p><a class="reference external image-reference" href="https://github.com/mmequignon"><img alt="mmequignon" src="https://github.com/mmequignon.png?size=40px" /></a></p>
<p><a class="reference external" href="https://github.com/mmequignon"><img alt="mmequignon" src="https://github.com/mmequignon.png?size=40px" /></a></p>
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/wms/tree/14.0/shopfloor_single_product_transfer">OCA/wms</a> project on GitHub.</p>
<p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
</div>
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 @@ -684,6 +684,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 @@ -696,6 +697,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 @@ -716,9 +718,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 @@ -757,9 +757,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:499e9d933ac60f9b5496e3fc079e496798bed934e5ac6a143a54a2a23d739bf1
!! source digest: sha256:f50a24bcfd53a8047195b91283b4ac8cd14e3ca458fb85ed40da3ebb869aae91
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |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,15 +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 != "norestriction"
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=False
)
return super()._set_quantity__check_location(move_line, location, confirmation)
return super()._set_quantity__check_location(
move_line, location, package, confirmation
)
Loading

0 comments on commit e9e69d5

Please sign in to comment.