From a510b428e7d4f636a9af80375e81bb4242691fa8 Mon Sep 17 00:00:00 2001 From: Ivan Sokolov Date: Sun, 12 Nov 2023 17:03:01 +0100 Subject: [PATCH] [ADD] stock_picking_limit_return_qty Limit quantity of items that can be returned in the same picking --- .../addons/stock_picking_limit_return_qty | 1 + setup/stock_picking_limit_return_qty/setup.py | 6 + stock_picking_limit_return_qty/README.rst | 103 ++++ stock_picking_limit_return_qty/__init__.py | 1 + .../__manifest__.py | 18 + .../readme/CONTEXT.md | 4 + .../readme/CONTRIBUTORS.md | 1 + .../readme/DESCRIPTION.md | 4 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 441 ++++++++++++++++++ .../tests/__init__.py | 1 + .../tests/test_stock_picking_return.py | 74 +++ .../wizard/__init__.py | 1 + .../wizard/stock_picking_return.py | 46 ++ .../wizard/stock_picking_return.xml | 16 + 15 files changed, 717 insertions(+) create mode 120000 setup/stock_picking_limit_return_qty/odoo/addons/stock_picking_limit_return_qty create mode 100644 setup/stock_picking_limit_return_qty/setup.py create mode 100644 stock_picking_limit_return_qty/README.rst create mode 100644 stock_picking_limit_return_qty/__init__.py create mode 100644 stock_picking_limit_return_qty/__manifest__.py create mode 100644 stock_picking_limit_return_qty/readme/CONTEXT.md create mode 100644 stock_picking_limit_return_qty/readme/CONTRIBUTORS.md create mode 100644 stock_picking_limit_return_qty/readme/DESCRIPTION.md create mode 100644 stock_picking_limit_return_qty/static/description/icon.png create mode 100644 stock_picking_limit_return_qty/static/description/index.html create mode 100644 stock_picking_limit_return_qty/tests/__init__.py create mode 100644 stock_picking_limit_return_qty/tests/test_stock_picking_return.py create mode 100644 stock_picking_limit_return_qty/wizard/__init__.py create mode 100644 stock_picking_limit_return_qty/wizard/stock_picking_return.py create mode 100644 stock_picking_limit_return_qty/wizard/stock_picking_return.xml diff --git a/setup/stock_picking_limit_return_qty/odoo/addons/stock_picking_limit_return_qty b/setup/stock_picking_limit_return_qty/odoo/addons/stock_picking_limit_return_qty new file mode 120000 index 000000000000..082e77405e78 --- /dev/null +++ b/setup/stock_picking_limit_return_qty/odoo/addons/stock_picking_limit_return_qty @@ -0,0 +1 @@ +../../../../stock_picking_limit_return_qty \ No newline at end of file diff --git a/setup/stock_picking_limit_return_qty/setup.py b/setup/stock_picking_limit_return_qty/setup.py new file mode 100644 index 000000000000..28c57bb64031 --- /dev/null +++ b/setup/stock_picking_limit_return_qty/setup.py @@ -0,0 +1,6 @@ +import setuptools + +setuptools.setup( + setup_requires=['setuptools-odoo'], + odoo_addon=True, +) diff --git a/stock_picking_limit_return_qty/README.rst b/stock_picking_limit_return_qty/README.rst new file mode 100644 index 000000000000..55fe5b209cb0 --- /dev/null +++ b/stock_picking_limit_return_qty/README.rst @@ -0,0 +1,103 @@ +============================== +Stock Picking Return Qty Limit +============================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:24694f02b89b92d57ec7abed32c042f2b655f5d95cac430fa40ef24abc80086c + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fstock--logistics--workflow-lightgray.png?logo=github + :target: https://github.com/OCA/stock-logistics-workflow/tree/16.0/stock_picking_limit_return_qty + :alt: OCA/stock-logistics-workflow +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/stock-logistics-workflow-16-0/stock-logistics-workflow-16-0-stock_picking_limit_return_qty + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/stock-logistics-workflow&target_branch=16.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +Limit the item quantity that can be returned. It makes impossible to +return more items than it was in the original picking. + +If user tries to return more items than it is possible to return +following blocking messages is shown: "You can return only of +" + +**Table of contents** + +.. contents:: + :local: + +Use Cases / Context +=================== + +By default Odoo doesn't enforce any limit on item quantity that can be +returned in picking. It means that it is possible to return more items +that there were in the original picking. Eg if you delivered 5 pcs of +"Acoustic Block Screens" in picking you can return 8 pcs of it. This +module implements constraint with allows to return not more than the +original amount of item in the picking. It also takes into account +existing returns for the same picking. Eg if you delivered 5 pcs of +"Acoustic Block Screens" in picking then you can return no more than 5 +pcs of it. If you have already returned 2 pcs in the same picking then +you can return no more than 3 pcs. + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +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 +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +------- + +* Cetmix + +Contributors +------------ + +- `Cetmix `__ + +Maintainers +----------- + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +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. + +.. |maintainer-CetmixGitDrone| image:: https://github.com/CetmixGitDrone.png?size=40px + :target: https://github.com/CetmixGitDrone + :alt: CetmixGitDrone + +Current `maintainer `__: + +|maintainer-CetmixGitDrone| + +This module is part of the `OCA/stock-logistics-workflow `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/stock_picking_limit_return_qty/__init__.py b/stock_picking_limit_return_qty/__init__.py new file mode 100644 index 000000000000..40272379f721 --- /dev/null +++ b/stock_picking_limit_return_qty/__init__.py @@ -0,0 +1 @@ +from . import wizard diff --git a/stock_picking_limit_return_qty/__manifest__.py b/stock_picking_limit_return_qty/__manifest__.py new file mode 100644 index 000000000000..c012aa050b0b --- /dev/null +++ b/stock_picking_limit_return_qty/__manifest__.py @@ -0,0 +1,18 @@ +# Copyright 2023 Cetmix OU +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + "name": "Stock Picking Return Qty Limit", + "summary": """ + Don't allow to return more items as there were in the original picking""", + "version": "16.0.1.0.0", + "license": "AGPL-3", + "author": "Cetmix,Odoo Community Association (OCA)", + "website": "https://github.com/OCA/stock-logistics-workflow", + "depends": ["stock"], + "maintainers": ["CetmixGitDrone"], + "data": [ + "wizard/stock_picking_return.xml", + ], + "demo": [], +} diff --git a/stock_picking_limit_return_qty/readme/CONTEXT.md b/stock_picking_limit_return_qty/readme/CONTEXT.md new file mode 100644 index 000000000000..4c1b5756c2bf --- /dev/null +++ b/stock_picking_limit_return_qty/readme/CONTEXT.md @@ -0,0 +1,4 @@ +By default Odoo doesn't enforce any limit on item quantity that can be returned in picking. It means that it is possible to return more items that there were in the original picking. +Eg if you delivered 5 pcs of "Acoustic Block Screens" in picking you can return 8 pcs of it. +This module implements constraint with allows to return not more than the original amount of item in the picking. It also takes into account existing returns for the same picking. +Eg if you delivered 5 pcs of "Acoustic Block Screens" in picking then you can return no more than 5 pcs of it. If you have already returned 2 pcs in the same picking then you can return no more than 3 pcs. diff --git a/stock_picking_limit_return_qty/readme/CONTRIBUTORS.md b/stock_picking_limit_return_qty/readme/CONTRIBUTORS.md new file mode 100644 index 000000000000..95293dd6761d --- /dev/null +++ b/stock_picking_limit_return_qty/readme/CONTRIBUTORS.md @@ -0,0 +1 @@ +* [Cetmix](https://cetmix.com) diff --git a/stock_picking_limit_return_qty/readme/DESCRIPTION.md b/stock_picking_limit_return_qty/readme/DESCRIPTION.md new file mode 100644 index 000000000000..ea75035cee96 --- /dev/null +++ b/stock_picking_limit_return_qty/readme/DESCRIPTION.md @@ -0,0 +1,4 @@ +Limit the item quantity that can be returned. It makes impossible to return more items than it was in the original picking. + +If user tries to return more items than it is possible to return following blocking messages is shown: "You can return only of " + diff --git a/stock_picking_limit_return_qty/static/description/icon.png b/stock_picking_limit_return_qty/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 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 z 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 Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 diff --git a/stock_picking_limit_return_qty/static/description/index.html b/stock_picking_limit_return_qty/static/description/index.html new file mode 100644 index 000000000000..c8d861867408 --- /dev/null +++ b/stock_picking_limit_return_qty/static/description/index.html @@ -0,0 +1,441 @@ + + + + + + +Stock Picking Return Qty Limit + + + +
+

Stock Picking Return Qty Limit

+ + +

Beta License: AGPL-3 OCA/stock-logistics-workflow Translate me on Weblate Try me on Runboat

+

Limit the item quantity that can be returned. It makes impossible to +return more items than it was in the original picking.

+

If user tries to return more items than it is possible to return +following blocking messages is shown: “You can return only of +<product_name>”

+

Table of contents

+ +
+

Use Cases / Context

+

By default Odoo doesn’t enforce any limit on item quantity that can be +returned in picking. It means that it is possible to return more items +that there were in the original picking. Eg if you delivered 5 pcs of +“Acoustic Block Screens” in picking you can return 8 pcs of it. This +module implements constraint with allows to return not more than the +original amount of item in the picking. It also takes into account +existing returns for the same picking. Eg if you delivered 5 pcs of +“Acoustic Block Screens” in picking then you can return no more than 5 +pcs of it. If you have already returned 2 pcs in the same picking then +you can return no more than 3 pcs.

+
+
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +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 +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • Cetmix
  • +
+
+ +
+

Maintainers

+

This module is maintained by the OCA.

+Odoo Community Association +

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.

+

Current maintainer:

+

CetmixGitDrone

+

This module is part of the OCA/stock-logistics-workflow project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+ + diff --git a/stock_picking_limit_return_qty/tests/__init__.py b/stock_picking_limit_return_qty/tests/__init__.py new file mode 100644 index 000000000000..50972625c5ea --- /dev/null +++ b/stock_picking_limit_return_qty/tests/__init__.py @@ -0,0 +1 @@ +from . import test_stock_picking_return diff --git a/stock_picking_limit_return_qty/tests/test_stock_picking_return.py b/stock_picking_limit_return_qty/tests/test_stock_picking_return.py new file mode 100644 index 000000000000..eda2020c6820 --- /dev/null +++ b/stock_picking_limit_return_qty/tests/test_stock_picking_return.py @@ -0,0 +1,74 @@ +# Copyright 2023 Cetmix OU +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo.exceptions import ValidationError +from odoo.tests.common import TransactionCase + + +class TestStockReturnPicking(TransactionCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.env = cls.env(context=dict(cls.env.context, tracking_disable=True)) + + cls.supplier_location = cls.env.ref("stock.stock_location_suppliers") + cls.stock_location = cls.env.ref("stock.stock_location_stock") + cls.picking_type_in = cls.env.ref("stock.picking_type_in") + cls.picking_return = cls.env["stock.return.picking"] + cls.picking_return_line = cls.env["stock.return.picking.line"] + cls.stock_move = cls.env["stock.move"] + cls.product_product = cls.env["product.product"] + + @classmethod + def _create_picking(cls, location, destination_location, picking_type): + return cls.env["stock.picking"].create( + { + "picking_type_id": picking_type.id, + "location_id": location.id, + "location_dest_id": destination_location.id, + } + ) + + def test_00(self): + picking = self._create_picking( + self.supplier_location, self.stock_location, self.picking_type_in + ) + product_a = self.product_product.create( + {"name": "Product A", "type": "product"} + ) + product_b = self.product_product.create( + {"name": "Product B", "type": "product"} + ) + move_1 = self.stock_move.create( + { + "name": product_a.name, + "product_id": product_a.id, + "product_uom_qty": 2, + "picking_id": picking.id, + "location_id": picking.location_id.id, + "location_dest_id": picking.location_dest_id.id, + } + ) + move_2 = self.stock_move.create( + { + "name": product_b.name, + "product_id": product_b.id, + "product_uom_qty": 1, + "picking_id": picking.id, + "location_id": picking.location_id.id, + "location_dest_id": picking.location_dest_id.id, + } + ) + picking.action_confirm() + picking.action_assign() + move_1.quantity_done = 2 + move_2.quantity_done = 1 + picking.button_validate() + return_wizard = self.picking_return.with_context( + active_id=picking.id, active_model="stock.picking" + ).create({}) + return_wizard._onchange_picking_id() + for line in return_wizard.product_return_moves: + self.assertEqual(line.quantity, line.quantity_max) + with self.assertRaises(ValidationError): + line.quantity = line.quantity + 1 diff --git a/stock_picking_limit_return_qty/wizard/__init__.py b/stock_picking_limit_return_qty/wizard/__init__.py new file mode 100644 index 000000000000..ad0b47c23ff7 --- /dev/null +++ b/stock_picking_limit_return_qty/wizard/__init__.py @@ -0,0 +1 @@ +from . import stock_picking_return diff --git a/stock_picking_limit_return_qty/wizard/stock_picking_return.py b/stock_picking_limit_return_qty/wizard/stock_picking_return.py new file mode 100644 index 000000000000..011b15d035a2 --- /dev/null +++ b/stock_picking_limit_return_qty/wizard/stock_picking_return.py @@ -0,0 +1,46 @@ +# Copyright 2023 Cetmix OU +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import _, api, fields, models +from odoo.exceptions import ValidationError + + +class ReturnPickingLine(models.TransientModel): + _inherit = "stock.return.picking.line" + + quantity_max = fields.Float( + "Maximum Quantity", + digits="Product Unit of Measure", + help="Maximum quantity that can be returned", + ) + + @api.constrains("quantity") + def _constraints_quantity(self): + for rec in self: + if rec.quantity and rec.quantity_max and rec.quantity > rec.quantity_max: + raise ValidationError( + _( + "You can return only %(max_qty)s of %(product)s", + max_qty=rec.quantity_max, + product=rec.product_id.name, + ) + ) + + +class ReturnPicking(models.TransientModel): + _inherit = "stock.return.picking" + + @api.model + def _prepare_stock_return_picking_line_vals_from_move(self, stock_move): + + res = super( + ReturnPicking, self + )._prepare_stock_return_picking_line_vals_from_move(stock_move) + + # Store maximum quantity that is possible to return + res.update( + { + "quantity_max": res["quantity"], + } + ) + return res diff --git a/stock_picking_limit_return_qty/wizard/stock_picking_return.xml b/stock_picking_limit_return_qty/wizard/stock_picking_return.xml new file mode 100644 index 000000000000..1c5925a5a765 --- /dev/null +++ b/stock_picking_limit_return_qty/wizard/stock_picking_return.xml @@ -0,0 +1,16 @@ + + + + Return lines + stock.return.picking + + + + + + + +