diff --git a/mrp_subcontracting_partner_management/README.rst b/mrp_subcontracting_partner_management/README.rst new file mode 100644 index 000000000..fa0923840 --- /dev/null +++ b/mrp_subcontracting_partner_management/README.rst @@ -0,0 +1,103 @@ +================================= +Subcontracting Partner Management +================================= + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |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-LGPL--3-blue.png + :target: http://www.gnu.org/licenses/lgpl-3.0-standalone.html + :alt: License: LGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fmanufacture-lightgray.png?logo=github + :target: https://github.com/OCA/manufacture/tree/14.0/mrp_subcontracting_partner_management + :alt: OCA/manufacture +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/manufacture-14-0/manufacture-14-0-mrp_subcontracting_partner_management + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/129/14.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + +The goal of this module is to simplify the management of the partner properties used in MRP Subcontracting. + +It adds a new checkbox "Subcontractor" which when enabled creates the following entities: + +* A child location in the "Subcontracting" location +* A Stock Operation Type of type 'receipt' for this location +* A new 'Buy' stock rule +* A new 'Resupply Subcontractor on Order' rule + +**Table of contents** + +.. contents:: + :local: + +Configuration +============= + +* No configuration is required + +Usage +===== + +* Select a partner of type "Company" +* Enable the "Subcontractor" checkbox +* New entities are created or existing are used if were created previously +* When disabled all associated enties will be archived + +Changelog +========= + +14.0.1.0.0 +~~~~~~~~~~ + +* Initial release + +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 smashing it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Ooops404 +* Cetmix + +Contributors +~~~~~~~~~~~~ + +* Ooops404 +* 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. + +This module is part of the `OCA/manufacture `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/mrp_subcontracting_partner_management/__init__.py b/mrp_subcontracting_partner_management/__init__.py new file mode 100644 index 000000000..0650744f6 --- /dev/null +++ b/mrp_subcontracting_partner_management/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/mrp_subcontracting_partner_management/__manifest__.py b/mrp_subcontracting_partner_management/__manifest__.py new file mode 100644 index 000000000..e6a86df1f --- /dev/null +++ b/mrp_subcontracting_partner_management/__manifest__.py @@ -0,0 +1,18 @@ +{ + "name": "Subcontracting Partner Management", + "version": "14.0.1.0.0", + "summary": "Subcontracting Partner Management", + "author": "Ooops404, Cetmix, Odoo Community Association (OCA)", + "license": "LGPL-3", + "category": "Inventory", + "website": "https://github.com/OCA/manufacture", + "depends": ["purchase_stock", "mrp_subcontracting", "sale_stock"], + "external_dependencies": {}, + "demo": [], + "data": [ + "views/res_partner.xml", + ], + "qweb": [], + "installable": True, + "application": False, +} diff --git a/mrp_subcontracting_partner_management/i18n/mrp_subcontracting_partner_management.pot b/mrp_subcontracting_partner_management/i18n/mrp_subcontracting_partner_management.pot new file mode 100644 index 000000000..77fb1b451 --- /dev/null +++ b/mrp_subcontracting_partner_management/i18n/mrp_subcontracting_partner_management.pot @@ -0,0 +1,65 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * mrp_subcontracting_partner_management +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: mrp_subcontracting_partner_management +#: model:ir.model,name:mrp_subcontracting_partner_management.model_res_partner +msgid "Contact" +msgstr "" + +#. module: mrp_subcontracting_partner_management +#: model:ir.model.fields,field_description:mrp_subcontracting_partner_management.field_res_partner__display_name +msgid "Display Name" +msgstr "" + +#. module: mrp_subcontracting_partner_management +#: model:ir.model.fields,field_description:mrp_subcontracting_partner_management.field_res_partner__id +msgid "ID" +msgstr "" + +#. module: mrp_subcontracting_partner_management +#: model:ir.model.fields,field_description:mrp_subcontracting_partner_management.field_res_partner____last_update +msgid "Last Modified on" +msgstr "" + +#. module: mrp_subcontracting_partner_management +#: model:ir.model.fields,field_description:mrp_subcontracting_partner_management.field_res_partner__partner_buy_rule_id +#: model:ir.model.fields,field_description:mrp_subcontracting_partner_management.field_res_users__partner_buy_rule_id +msgid "Partner Buy Rule" +msgstr "" + +#. module: mrp_subcontracting_partner_management +#: model:ir.model.fields,field_description:mrp_subcontracting_partner_management.field_res_partner__partner_picking_type_id +#: model:ir.model.fields,field_description:mrp_subcontracting_partner_management.field_res_users__partner_picking_type_id +msgid "Partner Picking Type" +msgstr "" + +#. module: mrp_subcontracting_partner_management +#: model:ir.model.fields,field_description:mrp_subcontracting_partner_management.field_res_partner__partner_resupply_rule_id +#: model:ir.model.fields,field_description:mrp_subcontracting_partner_management.field_res_users__partner_resupply_rule_id +msgid "Partner Resupply Rule" +msgstr "" + +#. module: mrp_subcontracting_partner_management +#: model:ir.model.fields,field_description:mrp_subcontracting_partner_management.field_res_partner__subcontracted_created_location_id +#: model:ir.model.fields,field_description:mrp_subcontracting_partner_management.field_res_users__subcontracted_created_location_id +msgid "Subcontracted Created Location" +msgstr "" + +#. module: mrp_subcontracting_partner_management +#: model:ir.model.fields,field_description:mrp_subcontracting_partner_management.field_res_partner__is_subcontractor_partner +#: model:ir.model.fields,field_description:mrp_subcontracting_partner_management.field_res_users__is_subcontractor_partner +#: model_terms:ir.ui.view,arch_db:mrp_subcontracting_partner_management.view_partner_form_inherit_subcontractor +msgid "Subcontractor" +msgstr "" diff --git a/mrp_subcontracting_partner_management/models/__init__.py b/mrp_subcontracting_partner_management/models/__init__.py new file mode 100644 index 000000000..91fed54d4 --- /dev/null +++ b/mrp_subcontracting_partner_management/models/__init__.py @@ -0,0 +1 @@ +from . import res_partner diff --git a/mrp_subcontracting_partner_management/models/res_partner.py b/mrp_subcontracting_partner_management/models/res_partner.py new file mode 100644 index 000000000..ec3393403 --- /dev/null +++ b/mrp_subcontracting_partner_management/models/res_partner.py @@ -0,0 +1,267 @@ +from odoo import api, fields, models + + +class ResPartner(models.Model): + _inherit = "res.partner" + + is_subcontractor_partner = fields.Boolean(string="Subcontractor") + subcontracted_created_location_id = fields.Many2one("stock.location") + partner_picking_type_id = fields.Many2one("stock.picking.type") + partner_buy_rule_id = fields.Many2one("stock.rule") + partner_resupply_rule_id = fields.Many2one("stock.rule") + + def _set_subcontracting_values_active(self, active): + self.ensure_one() + if self.subcontracted_created_location_id: + self.subcontracted_created_location_id.active = active + if self.partner_picking_type_id: + self.partner_picking_type_id.active = active + if self.partner_buy_rule_id: + self.partner_buy_rule_id.active = active + if self.partner_resupply_rule_id: + self.partner_resupply_rule_id.active = active + + def unlink(self): + """ + This Method is override to archive all subcotracting field + """ + for record in self: + record._set_subcontracting_values_active(False) + result = super(ResPartner, self).unlink() + return result + + def write(self, values): + for record in self: + is_subcontractor_partner = values.get("is_subcontractor_partner") + active = values.get("active") + if is_subcontractor_partner is not None: + values.update(record._update_subcontractor_entities_for_record(values)) + if active is not None: + record._set_subcontracting_values_active(active) + super(ResPartner, self).write(values) + + @api.model + def create(self, values): + partner = super(ResPartner, self).create(values) + if values.get("is_subcontractor_partner", False): + partner._create_subcontractor_entities() + return partner + + def _create_location(self, parent_location, company): + """Creating Subcontracting Location starts here""" + + name = "Subcontractor {}".format(self.name) + location_vals = { + "name": name, + "usage": "internal", + "location_id": parent_location or False, + "company_id": company.id, + "active": True, + } + location_rec = self.subcontracted_created_location_id + if not location_rec: + location_rec = self.env["stock.location"].create(location_vals) + return location_rec + + def _create_subcontracted_operation_type(self, warehouse, location): + """Creating Operation Type for Subcontracting""" + first_name = self.name.split(" ")[0] or "" + operation_type_name = "Subcontractor {} {}".format(str(first_name), " IN") + sequence_code = "" + for code in list(filter(None, operation_type_name.split(" "))): + sequence_code += code[0] + operation_type_rec = self.partner_picking_type_id + if not operation_type_rec: + operation_type_vals = { + "name": operation_type_name, + "code": "incoming", + "sequence_code": sequence_code, + } + if warehouse: + operation_type_vals.update({"warehouse_id": warehouse.id}) + if location: + operation_type_vals.update({"default_location_dest_id": location.id}) + operation_type_rec = self.env["stock.picking.type"].create( + operation_type_vals + ) + return operation_type_rec + + def _create_subcontracted_buy_rule(self, operation_type_rec, location): + """Creating Route Rule for Subcontracting starts here""" + first_name = self.name.split(" ")[0] or "" + buy_route = self.env.ref( + "purchase_stock.route_warehouse0_buy", raise_if_not_found=False + ) + rule_vals = { + "name": "Subcontractor {}".format(first_name), + "action": "buy", + } + rule = self.partner_buy_rule_id + if operation_type_rec: + rule_vals.update({"picking_type_id": operation_type_rec.id}) + if location: + rule_vals.update({"location_id": location.id}) + if buy_route: + rule_vals.update({"route_id": buy_route.id}) + if not rule and rule_vals: + rule = self.env["stock.rule"].create(rule_vals) + return rule + + def _create_subcontracted_resupply_rule(self, location): + """# Creating Route Rule for Subcontracting resupply on order starts here""" + first_name = self.name.split(" ")[0] or "" + resupply_on_order_route = self.env.ref( + "mrp_subcontracting.route_resupply_subcontractor_mto", + raise_if_not_found=False, + ) + delivery_type = self.env.ref("stock.picking_type_out", raise_if_not_found=False) + production = self.env["ir.property"]._get( + "property_stock_production", "product.template" + ) + resupply_rule_vals = { + "name": "Subcontractor {}".format(first_name), + "action": "pull", + "partner_address_id": self._origin.id, + } + pull_rule = self.partner_resupply_rule_id + if delivery_type: + resupply_rule_vals.update( + { + "picking_type_id": delivery_type.id, + } + ) + if location: + resupply_rule_vals.update( + { + "location_id": location.id, + } + ) + if production: + resupply_rule_vals.update( + { + "location_src_id": production.id, + } + ) + if resupply_on_order_route: + resupply_rule_vals.update( + { + "route_id": resupply_on_order_route.id, + } + ) + + if not pull_rule and resupply_rule_vals: + pull_rule = self.env["stock.rule"].create(resupply_rule_vals) + return pull_rule + + def _create_subcontractor_entities(self): + """ + Create entities for the subcontractor + - Stock location + - Stock operation type + - "Buy" stock rule + """ + for rec in self.filtered(lambda p: p.company_type == "company"): + partner_update_vals = rec._create_subcontractor_entities_for_record() + rec.write(partner_update_vals) + + def _update_subcontractor_entities_for_record(self, values): + self.ensure_one() + is_subcontractor_partner = values.get("is_subcontractor_partner") + + check_data = { + # Updating Subcontracting Location + "subcontracted_created_location_id": self._create_subcontracting_location_data, + # Updating Subcontracting operation type + "partner_picking_type_id": self._create_operation_type_for_subcontracting, + # Updating Route Rule for Subcontracting buy + "partner_buy_rule_id": self._create_route_rule_for_subcontracting, + # Updating Route Rule for Subcontracting resupply + "partner_resupply_rule_id": self._create_route_rule_for_subcontracting_resupply, + } + for field_name in check_data: + if is_subcontractor_partner is True and getattr(self, field_name): + getattr(self, field_name).active = True + elif is_subcontractor_partner is True and not getattr(self, field_name): + values.update(check_data[field_name]()) + elif is_subcontractor_partner is False and getattr(self, field_name): + getattr(self, field_name).active = False + + return values + + def _create_subcontractor_entities_for_record(self): + self.ensure_one() + partner_update_vals = {"is_subcontractor_partner": True} + # Creating Subcontracting Location ends here + partner_update_vals.update(self._create_subcontracting_location_data()) + partner_update_vals.update(self._create_operation_type_for_subcontracting()) + # Creating Route Rule for Subcontracting starts here + partner_update_vals.update(self._create_route_rule_for_subcontracting()) + # Creating Route Rule for Subcontracting resupply on order starts here + partner_update_vals.update( + self._create_route_rule_for_subcontracting_resupply() + ) + return partner_update_vals + + def _get_location_for_record(self): + self.ensure_one() + location = self.subcontracted_created_location_id + if not location: + default_company = self.env.company + company = self.company_id or default_company + parent_location = ( + company.subcontracting_location_id + and company.subcontracting_location_id.id + ) + location = self._create_location(parent_location, company) + self.subcontracted_created_location_id = location + return location + + def _get_warehouse_for_record(self): + self.ensure_one() + default_company = self.env.company + default_warehouse = self.env["stock.warehouse"].search( + [("company_id", "=", default_company.id)] + )[0] + company = self.company_id or default_company + warehouse = ( + self.env["stock.warehouse"].search([("company_id", "=", company.id)])[0] + if self.company_id + else default_warehouse + ) # noqa + return warehouse + + def _create_subcontracting_location_data(self): + self.ensure_one() + location = self._get_location_for_record() + return { + "property_stock_subcontractor": location.id, + "subcontracted_created_location_id": location.id, + } + + def _create_operation_type_for_subcontracting(self): + self.ensure_one() + operation_type_rec = self.partner_picking_type_id + if not operation_type_rec: + # Creating Operation Type for Subcontracting starts here + location = self._get_location_for_record() + warehouse = self._get_warehouse_for_record() + operation_type_rec = self._create_subcontracted_operation_type( + warehouse, location + ) + self.partner_picking_type_id = operation_type_rec + return {"partner_picking_type_id": operation_type_rec.id} + + def _create_route_rule_for_subcontracting(self): + location = self._get_location_for_record() + warehouse = self._get_warehouse_for_record() + operation_type_rec = self._create_subcontracted_operation_type( + warehouse, location + ) + buy_rule = self._create_subcontracted_buy_rule(operation_type_rec, location) + + return {"partner_buy_rule_id": buy_rule.id} + + def _create_route_rule_for_subcontracting_resupply(self): + location = self._get_location_for_record() + resupply_rule = self._create_subcontracted_resupply_rule(location) + return {"partner_resupply_rule_id": resupply_rule.id} diff --git a/mrp_subcontracting_partner_management/readme/CONFIGURE.rst b/mrp_subcontracting_partner_management/readme/CONFIGURE.rst new file mode 100644 index 000000000..0862077f4 --- /dev/null +++ b/mrp_subcontracting_partner_management/readme/CONFIGURE.rst @@ -0,0 +1 @@ +* No configuration is required diff --git a/mrp_subcontracting_partner_management/readme/CONTRIBUTORS.rst b/mrp_subcontracting_partner_management/readme/CONTRIBUTORS.rst new file mode 100644 index 000000000..a3385a623 --- /dev/null +++ b/mrp_subcontracting_partner_management/readme/CONTRIBUTORS.rst @@ -0,0 +1,2 @@ +* Ooops404 +* Cetmix diff --git a/mrp_subcontracting_partner_management/readme/DESCRIPTION.rst b/mrp_subcontracting_partner_management/readme/DESCRIPTION.rst new file mode 100644 index 000000000..fe086ffb2 --- /dev/null +++ b/mrp_subcontracting_partner_management/readme/DESCRIPTION.rst @@ -0,0 +1,8 @@ +The goal of this module is to simplify the management of the partner properties used in MRP Subcontracting. + +It adds a new checkbox "Subcontractor" which when enabled creates the following entities: + +* A child location in the "Subcontracting" location +* A Stock Operation Type of type 'receipt' for this location +* A new 'Buy' stock rule +* A new 'Resupply Subcontractor on Order' rule diff --git a/mrp_subcontracting_partner_management/readme/HISTORY.rst b/mrp_subcontracting_partner_management/readme/HISTORY.rst new file mode 100644 index 000000000..a7312928a --- /dev/null +++ b/mrp_subcontracting_partner_management/readme/HISTORY.rst @@ -0,0 +1,4 @@ +14.0.1.0.0 +~~~~~~~~~~ + +* Initial release diff --git a/mrp_subcontracting_partner_management/readme/USAGE.rst b/mrp_subcontracting_partner_management/readme/USAGE.rst new file mode 100644 index 000000000..b5502316a --- /dev/null +++ b/mrp_subcontracting_partner_management/readme/USAGE.rst @@ -0,0 +1,4 @@ +* Select a partner of type "Company" +* Enable the "Subcontractor" checkbox +* New entities are created or existing are used if were created previously +* When disabled all associated enties will be archived diff --git a/mrp_subcontracting_partner_management/static/description/icon.png b/mrp_subcontracting_partner_management/static/description/icon.png new file mode 100644 index 000000000..ea708b0a2 Binary files /dev/null and b/mrp_subcontracting_partner_management/static/description/icon.png differ diff --git a/mrp_subcontracting_partner_management/static/description/index.html b/mrp_subcontracting_partner_management/static/description/index.html new file mode 100644 index 000000000..5a1fa28e7 --- /dev/null +++ b/mrp_subcontracting_partner_management/static/description/index.html @@ -0,0 +1,458 @@ + + + + + + +Subcontracting Partner Management + + + +
+

Subcontracting Partner Management

+ + +

Beta License: LGPL-3 OCA/manufacture Translate me on Weblate Try me on Runbot

+

The goal of this module is to simplify the management of the partner properties used in MRP Subcontracting.

+

It adds a new checkbox “Subcontractor” which when enabled creates the following entities:

+
    +
  • A child location in the “Subcontracting” location
  • +
  • A Stock Operation Type of type ‘receipt’ for this location
  • +
  • A new ‘Buy’ stock rule
  • +
  • A new ‘Resupply Subcontractor on Order’ rule
  • +
+

Table of contents

+ +
+

Configuration

+
    +
  • No configuration is required
  • +
+
+
+

Usage

+
    +
  • Select a partner of type “Company”
  • +
  • Enable the “Subcontractor” checkbox
  • +
  • New entities are created or existing are used if were created previously
  • +
  • When disabled all associated enties will be archived
  • +
+
+
+

Changelog

+
+

14.0.1.0.0

+
    +
  • Initial release
  • +
+
+
+
+

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 smashing it by providing a detailed and welcomed +feedback.

+

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

+
+
+

Credits

+
+

Authors

+
    +
  • Ooops404
  • +
  • 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.

+

This module is part of the OCA/manufacture project on GitHub.

+

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

+
+
+
+ + diff --git a/mrp_subcontracting_partner_management/tests/__init__.py b/mrp_subcontracting_partner_management/tests/__init__.py new file mode 100644 index 000000000..c7819b815 --- /dev/null +++ b/mrp_subcontracting_partner_management/tests/__init__.py @@ -0,0 +1,3 @@ +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import test_create_sybcontractor_partner_location diff --git a/mrp_subcontracting_partner_management/tests/test_create_sybcontractor_partner_location.py b/mrp_subcontracting_partner_management/tests/test_create_sybcontractor_partner_location.py new file mode 100644 index 000000000..edf060089 --- /dev/null +++ b/mrp_subcontracting_partner_management/tests/test_create_sybcontractor_partner_location.py @@ -0,0 +1,170 @@ +from odoo.tests import common, tagged + + +@tagged("post_install", "-at_install") +class TestSubcontractedPartner(common.SavepointCase): + @classmethod + def setUpClass(cls): + """ + - Create a Partner record “Wood Corner” + - Type will be Company and new boolean is_subcontractor_partner is Set True + """ + super().setUpClass() + cls.partner_id = cls.env.ref("base.res_partner_12") + cls.partner_obj = cls.env["res.partner"] + + def _get_partner(self): + return self.partner_obj.create( + { + "name": "Test partner", + "is_company": True, + "is_subcontractor_partner": True, + } + ) + + def test_is_subcontractor_partner_first_time(self): + self.partner_id.update( + { + "is_subcontractor_partner": True, + } + ) + + location = self.partner_id.subcontracted_created_location_id + self.assertTrue(location, "Location is not created") + self.assertTrue(location.active, "Location must be active") + + partner_picking_type = self.partner_id.partner_picking_type_id + self.assertTrue(partner_picking_type, "Picking type is not created") + self.assertTrue(partner_picking_type.active, "Picking type must be active") + + partner_buy_rule = self.partner_id.partner_buy_rule_id + self.assertTrue(partner_buy_rule, "Partner Buy rule is not created") + self.assertTrue(partner_buy_rule.active, "Partner Buy rule must be active") + + partner_resupply_rule = self.partner_id.partner_resupply_rule_id + self.assertTrue(partner_resupply_rule, "Partner Resupply rule is not created") + self.assertTrue( + partner_resupply_rule.active, "Partner Resupply rule must be active" + ) + + def test_is_subcontractor_partner_switch_off(self): + self.partner_id.write( + { + "is_subcontractor_partner": True, + } + ) + self.partner_id.update( + { + "is_subcontractor_partner": False, + } + ) + + location = self.partner_id.subcontracted_created_location_id + self.assertFalse(location.active, "Location must be not active") + + partner_picking_type = self.partner_id.partner_picking_type_id + self.assertFalse(partner_picking_type.active, "Picking type must be not active") + + partner_buy_rule = self.partner_id.partner_buy_rule_id + self.assertFalse(partner_buy_rule.active, "Partner Buy rule must be not active") + + partner_resupply_rule = self.partner_id.partner_resupply_rule_id + self.assertFalse( + partner_resupply_rule.active, "Partner Resupply rule must be not active" + ) + + def test_is_subcontractor_partner_switch_on(self): + self.partner_id.update( + { + "is_subcontractor_partner": True, + } + ) + + location = self.partner_id.subcontracted_created_location_id + self.assertTrue(location.active, "Location must be active") + + partner_picking_type = self.partner_id.partner_picking_type_id + self.assertTrue(partner_picking_type.active, "Picking type must be active") + + partner_buy_rule = self.partner_id.partner_buy_rule_id + self.assertTrue(partner_buy_rule.active, "Partner Buy rule must be active") + + partner_resupply_rule = self.partner_id.partner_resupply_rule_id + self.assertTrue( + partner_resupply_rule.active, "Partner Resupply rule must be active" + ) + + def test_is_subcontractor_partner_aсtive_switch_off(self): + self.partner_id.write( + { + "is_subcontractor_partner": True, + } + ) + self.partner_id.update( + { + "active": False, + } + ) + + location = self.partner_id.subcontracted_created_location_id + self.assertFalse(location.active, "Location must be not active") + + partner_picking_type = self.partner_id.partner_picking_type_id + self.assertFalse(partner_picking_type.active, "Picking type must be not active") + + partner_buy_rule = self.partner_id.partner_buy_rule_id + self.assertFalse(partner_buy_rule.active, "Partner Buy rule must be not active") + + partner_resupply_rule = self.partner_id.partner_resupply_rule_id + self.assertFalse( + partner_resupply_rule.active, "Partner Resupply rule must be not active" + ) + + def test_is_subcontractor_partner_aсtive_switch_on(self): + self.partner_id.write( + { + "is_subcontractor_partner": True, + } + ) + self.partner_id.write( + { + "active": True, + } + ) + + location = self.partner_id.subcontracted_created_location_id + self.assertTrue(location.active, "Location must be active") + + partner_picking_type = self.partner_id.partner_picking_type_id + self.assertTrue(partner_picking_type.active, "Picking type must be active") + + partner_buy_rule = self.partner_id.partner_buy_rule_id + self.assertTrue(partner_buy_rule.active, "Partner Buy rule must be active") + + partner_resupply_rule = self.partner_id.partner_resupply_rule_id + self.assertTrue( + partner_resupply_rule.active, "Partner Resupply rule must be active" + ) + + def test_is_subcontractor_partner_delete(self): + partner_id = self.partner_obj.create( + { + "name": "Test partner", + "is_company": True, + "is_subcontractor_partner": True, + } + ) + + location = partner_id.subcontracted_created_location_id + partner_picking_type = partner_id.partner_picking_type_id + partner_buy_rule = partner_id.partner_buy_rule_id + partner_resupply_rule = partner_id.partner_resupply_rule_id + + partner_id.unlink() + + self.assertFalse(location.active, "Location must be not active") + self.assertFalse(partner_picking_type.active, "Picking type must be not active") + self.assertFalse(partner_buy_rule.active, "Partner Buy rule must be not active") + self.assertFalse( + partner_resupply_rule.active, "Partner Resupply rule must be not active" + ) diff --git a/mrp_subcontracting_partner_management/views/res_partner.xml b/mrp_subcontracting_partner_management/views/res_partner.xml new file mode 100644 index 000000000..77f89331e --- /dev/null +++ b/mrp_subcontracting_partner_management/views/res_partner.xml @@ -0,0 +1,20 @@ + + + + + res.partner.form.inherit.subcontractor + res.partner + + + + + + + + + +