From f2cbbf489253630b575803cc4829e762ae48e279 Mon Sep 17 00:00:00 2001 From: i1 Date: Fri, 1 Jul 2022 12:40:24 +0200 Subject: [PATCH] [FIX] set correct values when duplicating partner [IMP] res.partner: Use function to compose entiry name stock.picking.type: Boolean field "is_subcontractor" for UI filters --- .../__manifest__.py | 1 + .../models/__init__.py | 1 + .../models/res_partner.py | 106 +++++++++--------- .../models/stock_picking_type.py | 7 ++ .../readme/HISTORY.rst | 6 + ...t_create_sybcontractor_partner_location.py | 13 +++ .../views/stock_picking_type.xml | 19 ++++ 7 files changed, 98 insertions(+), 55 deletions(-) create mode 100644 mrp_subcontracting_partner_management/models/stock_picking_type.py create mode 100644 mrp_subcontracting_partner_management/views/stock_picking_type.xml diff --git a/mrp_subcontracting_partner_management/__manifest__.py b/mrp_subcontracting_partner_management/__manifest__.py index e6a86df1f..a7dcd34bd 100644 --- a/mrp_subcontracting_partner_management/__manifest__.py +++ b/mrp_subcontracting_partner_management/__manifest__.py @@ -11,6 +11,7 @@ "demo": [], "data": [ "views/res_partner.xml", + "views/stock_picking_type.xml", ], "qweb": [], "installable": True, diff --git a/mrp_subcontracting_partner_management/models/__init__.py b/mrp_subcontracting_partner_management/models/__init__.py index 91fed54d4..2bfe5d3f3 100644 --- a/mrp_subcontracting_partner_management/models/__init__.py +++ b/mrp_subcontracting_partner_management/models/__init__.py @@ -1 +1,2 @@ from . import res_partner +from . import stock_picking_type diff --git a/mrp_subcontracting_partner_management/models/res_partner.py b/mrp_subcontracting_partner_management/models/res_partner.py index ec3393403..585ba2aa5 100644 --- a/mrp_subcontracting_partner_management/models/res_partner.py +++ b/mrp_subcontracting_partner_management/models/res_partner.py @@ -5,10 +5,20 @@ 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") + subcontracted_created_location_id = fields.Many2one( + copy=False, comodel_name="stock.location" + ) + partner_picking_type_id = fields.Many2one( + copy=False, comodel_name="stock.picking.type" + ) + partner_buy_rule_id = fields.Many2one( + copy=False, + comodel_name="stock.rule", + ) + partner_resupply_rule_id = fields.Many2one( + copy=False, + comodel_name="stock.rule", + ) def _set_subcontracting_values_active(self, active): self.ensure_one() @@ -23,7 +33,7 @@ class ResPartner(models.Model): def unlink(self): """ - This Method is override to archive all subcotracting field + This Method is override to archive all subcontracting field """ for record in self: record._set_subcontracting_values_active(False) @@ -47,12 +57,19 @@ class ResPartner(models.Model): partner._create_subcontractor_entities() return partner + def _compose_entity_name(self): + """Compose entity name. + Override this function to implement onw logic + Returns: + name (char) composed name + """ + return self.display_name + def _create_location(self, parent_location, company): """Creating Subcontracting Location starts here""" - name = "Subcontractor {}".format(self.name) location_vals = { - "name": name, + "name": self._compose_entity_name(), "usage": "internal", "location_id": parent_location or False, "company_id": company.id, @@ -65,8 +82,8 @@ class ResPartner(models.Model): 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") + name = self._compose_entity_name() + operation_type_name = "{}: {}".format(name, " IN") sequence_code = "" for code in list(filter(None, operation_type_name.split(" "))): sequence_code += code[0] @@ -76,6 +93,7 @@ class ResPartner(models.Model): "name": operation_type_name, "code": "incoming", "sequence_code": sequence_code, + "is_subcontractor": True, } if warehouse: operation_type_vals.update({"warehouse_id": warehouse.id}) @@ -88,28 +106,25 @@ class ResPartner(models.Model): 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) + if not rule: + buy_route = self.env.ref( + "purchase_stock.route_warehouse0_buy", raise_if_not_found=False + ) + rule = self.env["stock.rule"].create( + { + "name": self._compose_entity_name(), + "action": "buy", + "picking_type_id": operation_type_rec.id, + "location_id": location.id, + "route_id": buy_route.id, + } + ) + self.partner_buy_rule_id = rule 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, @@ -118,44 +133,25 @@ class ResPartner(models.Model): 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( + if not pull_rule: + pull_rule = self.env["stock.rule"].create( { + "name": self._compose_entity_name(), + "action": "pull", + "partner_address_id": self._origin.id, "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( - { + "location_id": production.id, + "location_src_id": location.id, "route_id": resupply_on_order_route.id, + "procure_method": "mts_else_mto", } ) - - if not pull_rule and resupply_rule_vals: - pull_rule = self.env["stock.rule"].create(resupply_rule_vals) + self.partner_resupply_rule_id = pull_rule return pull_rule def _create_subcontractor_entities(self): - """ - Create entities for the subcontractor + """Create entities for the subcontractor - Stock location - Stock operation type - "Buy" stock rule diff --git a/mrp_subcontracting_partner_management/models/stock_picking_type.py b/mrp_subcontracting_partner_management/models/stock_picking_type.py new file mode 100644 index 000000000..a63d15df4 --- /dev/null +++ b/mrp_subcontracting_partner_management/models/stock_picking_type.py @@ -0,0 +1,7 @@ +from odoo import fields, models + + +class StockPickingType(models.Model): + _inherit = "stock.picking.type" + + is_subcontractor = fields.Boolean() diff --git a/mrp_subcontracting_partner_management/readme/HISTORY.rst b/mrp_subcontracting_partner_management/readme/HISTORY.rst index a7312928a..8e3a62052 100644 --- a/mrp_subcontracting_partner_management/readme/HISTORY.rst +++ b/mrp_subcontracting_partner_management/readme/HISTORY.rst @@ -1,3 +1,9 @@ +14.0.1.0.1 +~~~~~~~~~~ + +**Bugfixes** +- Fixed duplicate rules when creating a subcontractor partner + 14.0.1.0.0 ~~~~~~~~~~ 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 index edf060089..2624fb4dd 100644 --- a/mrp_subcontracting_partner_management/tests/test_create_sybcontractor_partner_location.py +++ b/mrp_subcontracting_partner_management/tests/test_create_sybcontractor_partner_location.py @@ -168,3 +168,16 @@ class TestSubcontractedPartner(common.SavepointCase): self.assertFalse( partner_resupply_rule.active, "Partner Resupply rule must be not active" ) + + def test_check_countof_rules(self): + partner_id = self.partner_obj.create( + { + "name": "Test partner", + "is_company": True, + "is_subcontractor_partner": True, + } + ) + rules = self.env["stock.rule"].search( + [("name", "=", partner_id.partner_buy_rule_id.name)] + ) + self.assertTrue(len(rules) == 2, "There are must be 2 subcontractor rules") diff --git a/mrp_subcontracting_partner_management/views/stock_picking_type.xml b/mrp_subcontracting_partner_management/views/stock_picking_type.xml new file mode 100644 index 000000000..25b6d9a92 --- /dev/null +++ b/mrp_subcontracting_partner_management/views/stock_picking_type.xml @@ -0,0 +1,19 @@ + + + + + stock.picking.type.filter.subcontractor + stock.picking.type + + + + + + + + +