From 4903a4b7af0c93c21c03dd44460a1cb4a2f83f6a Mon Sep 17 00:00:00 2001 From: Nikul-OSI Date: Tue, 20 Aug 2024 11:39:20 +0530 Subject: [PATCH] [ADD]sale_blanket_order_tier_validation: Added in v17 --- sale_blanket_order_tier_validation/README.rst | 112 +++++ .../__init__.py | 3 + .../__manifest__.py | 23 + .../models/__init__.py | 4 + .../models/sale_blanket_order.py | 56 +++ .../models/tier_definition.py | 18 + .../pyproject.toml | 3 + .../readme/CONFIGURE.md | 5 + .../readme/CONTRIBUTORS.md | 2 + .../readme/DESCRIPTION.md | 2 + .../readme/INSTALL.md | 2 + .../readme/USAGE.md | 15 + .../static/description/icon.png | Bin 0 -> 78752 bytes .../static/description/index.html | 458 ++++++++++++++++++ .../tests/__init__.py | 1 + ...test_sale_blanket_order_tier_validation.py | 124 +++++ .../views/sale_blanket_order_views.xml | 50 ++ 17 files changed, 878 insertions(+) create mode 100644 sale_blanket_order_tier_validation/README.rst create mode 100644 sale_blanket_order_tier_validation/__init__.py create mode 100644 sale_blanket_order_tier_validation/__manifest__.py create mode 100644 sale_blanket_order_tier_validation/models/__init__.py create mode 100644 sale_blanket_order_tier_validation/models/sale_blanket_order.py create mode 100644 sale_blanket_order_tier_validation/models/tier_definition.py create mode 100644 sale_blanket_order_tier_validation/pyproject.toml create mode 100644 sale_blanket_order_tier_validation/readme/CONFIGURE.md create mode 100644 sale_blanket_order_tier_validation/readme/CONTRIBUTORS.md create mode 100644 sale_blanket_order_tier_validation/readme/DESCRIPTION.md create mode 100644 sale_blanket_order_tier_validation/readme/INSTALL.md create mode 100644 sale_blanket_order_tier_validation/readme/USAGE.md create mode 100644 sale_blanket_order_tier_validation/static/description/icon.png create mode 100644 sale_blanket_order_tier_validation/static/description/index.html create mode 100644 sale_blanket_order_tier_validation/tests/__init__.py create mode 100644 sale_blanket_order_tier_validation/tests/test_sale_blanket_order_tier_validation.py create mode 100644 sale_blanket_order_tier_validation/views/sale_blanket_order_views.xml diff --git a/sale_blanket_order_tier_validation/README.rst b/sale_blanket_order_tier_validation/README.rst new file mode 100644 index 000000000000..4fdf7141bd3f --- /dev/null +++ b/sale_blanket_order_tier_validation/README.rst @@ -0,0 +1,112 @@ +=================================== +Sale Blanket Orders Tier Validation +=================================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:adb4549c4d5a6fc42fc865560f51f2d2ab705b8ac7a18c08cced1309637bf945 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |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%2Fsale--workflow-lightgray.png?logo=github + :target: https://github.com/OCA/sale-workflow/tree/17.0/sale_blanket_order_tier_validation + :alt: OCA/sale-workflow +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/sale-workflow-17-0/sale-workflow-17-0-sale_blanket_order_tier_validation + :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/sale-workflow&target_branch=17.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +Extends the functionality of your Sale Blanket Orders to support a tier +validation process + +**Table of contents** + +.. contents:: + :local: + +Installation +============ + +This module depends on ``base_tier_validation``. You can find it at +`OCA/server-ux `__ + +Configuration +============= + +To configure this module, you need to: + +1. Go to *Settings > Technical > Tier Validations > Tier Definition*. +2. Create as many tiers as you want for Purchase Order model. + +Usage +===== + +To use this module, you need to: + +1. Create a Sale Blanket Orders triggering at least one "Tier + Definition". +2. Click on *Request Validation* button. +3. Under the tab *Reviews* have a look to pending reviews and their + statuses. +4. Once all reviews are validated click on *Confirm Order*. + +Additional features: + +- You can filter the Blanket Orders requesting your review through the + filter *Needs my Review*. +- User with rights to confirm the Blanket Orders (validate all tiers + that would be generated) can directly do the operation, this is, + there is no need for her/him to request a validation. + +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 +------- + +* Open Source Integrators + +Contributors +------------ + +- Patrick Wilson +- Nikul Chaudhary + +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. + +This module is part of the `OCA/sale-workflow `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/sale_blanket_order_tier_validation/__init__.py b/sale_blanket_order_tier_validation/__init__.py new file mode 100644 index 000000000000..cac14e6e3c8c --- /dev/null +++ b/sale_blanket_order_tier_validation/__init__.py @@ -0,0 +1,3 @@ +# Copyright 2024 Open Source Integrators +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from . import models diff --git a/sale_blanket_order_tier_validation/__manifest__.py b/sale_blanket_order_tier_validation/__manifest__.py new file mode 100644 index 000000000000..32a5203c35dc --- /dev/null +++ b/sale_blanket_order_tier_validation/__manifest__.py @@ -0,0 +1,23 @@ +# Copyright 2024 Open Source Integrators +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +{ + "name": "Sale Blanket Orders Tier Validation", + "summary": """ + Extends the functionality of your Sale Blanket Orders + to support a tier validation process. + """, + "author": "Open Source Integrators, Odoo Community Association (OCA)", + "website": "https://github.com/OCA/sale-workflow", + "license": "AGPL-3", + "category": "Sales", + "version": "17.0.1.0.0", + "depends": [ + "sale_blanket_order", + "base_tier_validation", + ], + "data": [ + "views/sale_blanket_order_views.xml", + ], + "application": False, + "installable": True, +} diff --git a/sale_blanket_order_tier_validation/models/__init__.py b/sale_blanket_order_tier_validation/models/__init__.py new file mode 100644 index 000000000000..45abc12b1b59 --- /dev/null +++ b/sale_blanket_order_tier_validation/models/__init__.py @@ -0,0 +1,4 @@ +# Copyright 2024 Open Source Integrators +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from . import sale_blanket_order +from . import tier_definition diff --git a/sale_blanket_order_tier_validation/models/sale_blanket_order.py b/sale_blanket_order_tier_validation/models/sale_blanket_order.py new file mode 100644 index 000000000000..4ad6dd061b2f --- /dev/null +++ b/sale_blanket_order_tier_validation/models/sale_blanket_order.py @@ -0,0 +1,56 @@ +# Copyright 2024 Open Source Integrators +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from odoo import api, fields, models +from odoo.tools import float_is_zero + + +class SaleBlanketOrder(models.Model): + """ + Adding tier validation functionality to Blanket Orders. + """ + + _name = "sale.blanket.order" + _inherit = ["sale.blanket.order", "tier.validation"] + _state_from = ["draft"] + _state_to = ["open", "done", "expired"] + + _tier_validation_manual_config = False + + @api.depends( + "line_ids.remaining_uom_qty", + "validity_date", + "confirmed", + ) + def _compute_state(self): + """Complete override of Blanket Order Compute State Method: + The OCA Blanket Order module sets state via compute method which messes + with tier validation checks so we are going to instead set the state + to 'Open' only when clicking confirmed. This also forces process as before + just changing data would reset BO back to Open if expired.""" + today = fields.Date.today() + precision = self.env["decimal.precision"].precision_get( + "Product Unit of Measure" + ) + for order in self: + if not order.confirmed: + order.state = "draft" + elif order.validity_date <= today: + order.state = "expired" + elif float_is_zero( + sum( + order.line_ids.filtered(lambda line: not line.display_type).mapped( + "remaining_uom_qty" + ) + ), + precision_digits=precision, + ): + order.state = "done" + # Removing else statement from original method + # else: + # order.state = "open" + + def action_confirm(self): + """Set the state to 'Open' when clicking confirmed instead of during compute.""" + for rec in self: + rec.write({"state": "open"}) + return super().action_confirm() diff --git a/sale_blanket_order_tier_validation/models/tier_definition.py b/sale_blanket_order_tier_validation/models/tier_definition.py new file mode 100644 index 000000000000..aea661fd7935 --- /dev/null +++ b/sale_blanket_order_tier_validation/models/tier_definition.py @@ -0,0 +1,18 @@ +# Copyright 2024 Open Source Integrators +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from odoo import api, models + + +class TierDefinition(models.Model): + """ + Add Sale Blanket Order model to tier definitions. + """ + + _inherit = "tier.definition" + + @api.model + def _get_tier_validation_model_names(self): + """This method adds the Sale Blanket Order model to tier definitions.""" + res = super()._get_tier_validation_model_names() + res.append("sale.blanket.order") + return res diff --git a/sale_blanket_order_tier_validation/pyproject.toml b/sale_blanket_order_tier_validation/pyproject.toml new file mode 100644 index 000000000000..4231d0cccb3d --- /dev/null +++ b/sale_blanket_order_tier_validation/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/sale_blanket_order_tier_validation/readme/CONFIGURE.md b/sale_blanket_order_tier_validation/readme/CONFIGURE.md new file mode 100644 index 000000000000..3fe3359d4649 --- /dev/null +++ b/sale_blanket_order_tier_validation/readme/CONFIGURE.md @@ -0,0 +1,5 @@ +To configure this module, you need to: + +1. Go to *Settings \> Technical \> Tier Validations \> Tier + Definition*. +2. Create as many tiers as you want for Purchase Order model. diff --git a/sale_blanket_order_tier_validation/readme/CONTRIBUTORS.md b/sale_blanket_order_tier_validation/readme/CONTRIBUTORS.md new file mode 100644 index 000000000000..8aa59a82c74a --- /dev/null +++ b/sale_blanket_order_tier_validation/readme/CONTRIBUTORS.md @@ -0,0 +1,2 @@ +- Patrick Wilson \<\> +- Nikul Chaudhary \<\> diff --git a/sale_blanket_order_tier_validation/readme/DESCRIPTION.md b/sale_blanket_order_tier_validation/readme/DESCRIPTION.md new file mode 100644 index 000000000000..5088577267e2 --- /dev/null +++ b/sale_blanket_order_tier_validation/readme/DESCRIPTION.md @@ -0,0 +1,2 @@ +Extends the functionality of your Sale Blanket Orders +to support a tier validation process diff --git a/sale_blanket_order_tier_validation/readme/INSTALL.md b/sale_blanket_order_tier_validation/readme/INSTALL.md new file mode 100644 index 000000000000..c45725c465bb --- /dev/null +++ b/sale_blanket_order_tier_validation/readme/INSTALL.md @@ -0,0 +1,2 @@ +This module depends on `base_tier_validation`. You can find it at +[OCA/server-ux](https://github.com/OCA/server-ux) diff --git a/sale_blanket_order_tier_validation/readme/USAGE.md b/sale_blanket_order_tier_validation/readme/USAGE.md new file mode 100644 index 000000000000..a591c60d5515 --- /dev/null +++ b/sale_blanket_order_tier_validation/readme/USAGE.md @@ -0,0 +1,15 @@ +To use this module, you need to: + +1. Create a Sale Blanket Orders triggering at least one "Tier Definition". +2. Click on *Request Validation* button. +3. Under the tab *Reviews* have a look to pending reviews and their + statuses. +4. Once all reviews are validated click on *Confirm Order*. + +Additional features: + +- You can filter the Blanket Orders requesting your review through the filter + *Needs my Review*. +- User with rights to confirm the Blanket Orders (validate all tiers that would be + generated) can directly do the operation, this is, there is no need + for her/him to request a validation. diff --git a/sale_blanket_order_tier_validation/static/description/icon.png b/sale_blanket_order_tier_validation/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3780a3a971b72d9a13e57a060b17abea674a6eda GIT binary patch literal 78752 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%0A9&8-yaJ9HF^Q?OKlF87R6)V}`Je4m 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%0D&czPGlReTft5Swa4hAZe)4 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 + + + + +Sale Blanket Orders Tier Validation + + + +
+

Sale Blanket Orders Tier Validation

+ + +

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

+

Extends the functionality of your Sale Blanket Orders to support a tier +validation process

+

Table of contents

+ +
+

Installation

+

This module depends on base_tier_validation. You can find it at +OCA/server-ux

+
+
+

Configuration

+

To configure this module, you need to:

+
    +
  1. Go to Settings > Technical > Tier Validations > Tier Definition.
  2. +
  3. Create as many tiers as you want for Purchase Order model.
  4. +
+
+
+

Usage

+

To use this module, you need to:

+
    +
  1. Create a Sale Blanket Orders triggering at least one “Tier +Definition”.
  2. +
  3. Click on Request Validation button.
  4. +
  5. Under the tab Reviews have a look to pending reviews and their +statuses.
  6. +
  7. Once all reviews are validated click on Confirm Order.
  8. +
+

Additional features:

+
    +
  • You can filter the Blanket Orders requesting your review through the +filter Needs my Review.
  • +
  • User with rights to confirm the Blanket Orders (validate all tiers +that would be generated) can directly do the operation, this is, +there is no need for her/him to request a validation.
  • +
+
+
+

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

+
    +
  • Open Source Integrators
  • +
+
+ +
+

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.

+

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

+

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

+
+
+
+ + diff --git a/sale_blanket_order_tier_validation/tests/__init__.py b/sale_blanket_order_tier_validation/tests/__init__.py new file mode 100644 index 000000000000..4173fd713ba0 --- /dev/null +++ b/sale_blanket_order_tier_validation/tests/__init__.py @@ -0,0 +1 @@ +from . import test_sale_blanket_order_tier_validation diff --git a/sale_blanket_order_tier_validation/tests/test_sale_blanket_order_tier_validation.py b/sale_blanket_order_tier_validation/tests/test_sale_blanket_order_tier_validation.py new file mode 100644 index 000000000000..041448aa552a --- /dev/null +++ b/sale_blanket_order_tier_validation/tests/test_sale_blanket_order_tier_validation.py @@ -0,0 +1,124 @@ +# Import Odoo libs +from datetime import date, timedelta + +from odoo import fields +from odoo.exceptions import ValidationError +from odoo.tests import common + + +class TestSaleBlanketOrdersTierValidation(common.TransactionCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.blanket_order_obj = cls.env["sale.blanket.order"] + cls.tier_def_obj = cls.env["tier.definition"] + cls.payment_term = cls.env.ref("account.account_payment_term_immediate") + cls.sale_pricelist = cls.env["product.pricelist"].create( + {"name": "Test Pricelist", "currency_id": cls.env.ref("base.USD").id} + ) + + # UoM + cls.categ_unit = cls.env.ref("uom.product_uom_categ_unit") + cls.uom_dozen = cls.env["uom.uom"].create( + { + "name": "Test-DozenA", + "category_id": cls.categ_unit.id, + "factor_inv": 12, + "uom_type": "bigger", + "rounding": 0.001, + } + ) + + cls.partner = cls.env["res.partner"].create( + { + "name": "TEST CUSTOMER", + "property_product_pricelist": cls.sale_pricelist.id, + } + ) + + cls.product = cls.env["product.product"].create( + { + "name": "Demo", + "categ_id": cls.env.ref("product.product_category_1").id, + "standard_price": 35.0, + "type": "consu", + "uom_id": cls.env.ref("uom.product_uom_unit").id, + "default_code": "PROD_DEL01", + } + ) + + cls.yesterday = date.today() - timedelta(days=1) + cls.tomorrow = date.today() + timedelta(days=1) + + cls.test_user_1 = cls.env["res.users"].create( + { + "name": "user_sale_manager", + "login": "user_sale_manager", + "groups_id": [ + (6, 0, [cls.env.ref("sales_team.group_sale_manager").id]) + ], + } + ) + + cls.eco_model = cls.env.ref( + "sale_blanket_order_tier_validation.model_sale_blanket_order" + ) + # Create tier definition for this test + cls.tier_def_obj.create( + { + "model_id": cls.eco_model.id, + "review_type": "individual", + "reviewer_id": cls.test_user_1.id, + "definition_domain": "[('state', '=', 'draft')]", + } + ) + + def test01_tier_validation_model_name(self): + """ + Tests to ensure that the sale.blanket.order model is now part of the options + on a tier definition. + """ + self.assertIn( + "sale.blanket.order", self.tier_def_obj._get_tier_validation_model_names() + ) + + def test02_validation_blanket_order(self): + # Create an Sale blanket order in the 'draft' stage + blanket_order = self.blanket_order_obj.create( + { + "partner_id": self.partner.id, + "validity_date": fields.Date.to_string(self.tomorrow), + "payment_term_id": self.payment_term.id, + "pricelist_id": self.sale_pricelist.id, + "line_ids": [ + ( + 0, + 0, + { + "product_id": self.product.id, + "product_uom": self.product.uom_id.id, + "original_uom_qty": 20.0, + "price_unit": 10.0, + }, + ), + ], + } + ) + self.assertEqual(blanket_order.state, "draft") + + # Request tier validation + blanket_order.request_validation() + + # Changing to new stage would cause a validation error + with self.assertRaises(ValidationError): + blanket_order.action_confirm() + + # Validate the tier validation request + blanket_order.with_user(self.test_user_1).validate_tier() + self.assertTrue(blanket_order.validated) + + # Change the sale blanket stage to normal + blanket_order.action_confirm() + + # Confirm the stage changed + self.assertEqual(blanket_order.state, "open") diff --git a/sale_blanket_order_tier_validation/views/sale_blanket_order_views.xml b/sale_blanket_order_tier_validation/views/sale_blanket_order_views.xml new file mode 100644 index 000000000000..16e6ef9c1761 --- /dev/null +++ b/sale_blanket_order_tier_validation/views/sale_blanket_order_views.xml @@ -0,0 +1,50 @@ + + + + sale.blanket.order.job.tier.validation.inherit.search + sale.blanket.order + + + + + + + + + + + + sale.blanket.order.tier.validation.inherit.tree + sale.blanket.order + + + + + + + + +