Skip to content

Commit

Permalink
[IMP] sale_purchase_force_vendor: Child vendor compatibility
Browse files Browse the repository at this point in the history
TT46573
  • Loading branch information
victoralmau committed Aug 22, 2024
1 parent ef9a32b commit 0c10e08
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 20 deletions.
24 changes: 14 additions & 10 deletions sale_purchase_force_vendor/models/sale_order_line.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Copyright 2022 Tecnativa - Víctor Martínez
# Copyright 2022-2024 Tecnativa - Víctor Martínez
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).

from odoo import api, fields, models
Expand Down Expand Up @@ -35,6 +35,17 @@ def _compute_vendor_id_domain(self):
)
item.vendor_id_domain = domain

def _prepare_force_vendor_product_supplierinfo_vals(self):
"""We use this method so that we can overwrite it if we need to modify or
add a value.
"""
return {
"product_tmpl_id": self.product_id.product_tmpl_id.id,
"partner_id": self.vendor_id.commercial_partner_id.id,
"min_qty": 0,
"company_id": self.company_id.id,
}

def _prepare_procurement_values(self, group_id=False):
"""Inject in the procurement values the preferred vendor if any, and create
supplierinfo record for it if it doesn't exist.
Expand All @@ -43,7 +54,7 @@ def _prepare_procurement_values(self, group_id=False):
if self.vendor_id:
product = self.product_id
suppinfo = product.with_company(self.company_id.id)._select_seller(
partner_id=self.vendor_id,
partner_id=self.vendor_id.commercial_partner_id,
quantity=self.product_uom_qty,
uom_id=self.product_uom,
)
Expand All @@ -53,14 +64,7 @@ def _prepare_procurement_values(self, group_id=False):
suppinfo = (
self.env["product.supplierinfo"]
.sudo()
.create(
{
"product_tmpl_id": product.product_tmpl_id.id,
"partner_id": self.vendor_id.id,
"min_qty": 0,
"company_id": self.company_id.id,
}
)
.create(self._prepare_force_vendor_product_supplierinfo_vals())
)
res["supplierinfo_id"] = suppinfo
return res
18 changes: 15 additions & 3 deletions sale_purchase_force_vendor/tests/common.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,24 @@
# Copyright 2022 Tecnativa - Víctor Martínez
# Copyright 2022-2024 Tecnativa - Víctor Martínez
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).

from odoo.tests import Form, common
from odoo.tests import Form

from odoo.addons.base.tests.common import BaseCommon

class TestSalePurchaseForceVendorBase(common.TransactionCase):

class TestSalePurchaseForceVendorBase(BaseCommon):
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.partner = cls.env["res.partner"].create({"name": "Test partner"})
cls.vendor_a = cls.env["res.partner"].create({"name": "Test vendor A"})
cls.vendor_child_a = cls.env["res.partner"].create(
{
"name": "Test vendor child A",
"type": "contact",
"parent_id": cls.vendor_a.id,
}
)
cls.vendor_b = cls.env["res.partner"].create({"name": "Test vendor B"})
cls.mto = cls.env.ref("stock.route_warehouse0_mto")
cls.mto.active = True
Expand All @@ -32,6 +41,9 @@ def setUpClass(cls):
}
)
cls.sale_order = cls._create_sale_order(cls)
order_lines = cls.sale_order.order_line
cls.sol_a = order_lines.filtered(lambda x: x.product_id == cls.product_a)
cls.sol_b = order_lines.filtered(lambda x: x.product_id == cls.product_b)

def _create_sale_order(self):
order_form = Form(self.env["sale.order"])
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,17 +14,28 @@ def test_misc(self):
self.assertNotIn(self.vendor_a, self.product_b.seller_ids.mapped("partner_id"))
self.assertIn(self.vendor_b, self.product_b.seller_ids.mapped("partner_id"))

def test_misc_child_vendor(self):
self.sale_order.order_line.vendor_id = self.vendor_child_a
self.sale_order.action_confirm()
self.assertNotIn(
self.vendor_child_a, self.product_a.seller_ids.mapped("partner_id")
)
self.assertEqual(self.product_b.seller_ids.partner_id, self.vendor_a)

def test_misc_force_vendor_restrict(self):
self.env.company.sale_purchase_force_vendor_restrict = True
self.sale_order.action_confirm()
line_0 = self.sale_order.order_line[0]
partners = self.env["res.partner"].search(line_0.vendor_id_domain)
self.assertNotIn(self.partner, partners)
self.assertIn(self.vendor_a, partners)
self.assertIn(self.vendor_b, partners)
partners_sol_a = self.env["res.partner"].search(self.sol_a.vendor_id_domain)
self.assertNotIn(self.partner, partners_sol_a)
self.assertIn(self.vendor_a, partners_sol_a)
self.assertIn(self.vendor_b, partners_sol_a)
partners_sol_b = self.env["res.partner"].search(self.sol_b.vendor_id_domain)
self.assertNotIn(self.partner, partners_sol_b)
self.assertNotIn(self.vendor_a, partners_sol_b)
self.assertIn(self.vendor_b, partners_sol_b)

def test_misc_not_force_vendor_restrict(self):
self.env.company.sale_purchase_force_vendor_restrict = False
self.sale_order.action_confirm()
line_0 = self.sale_order.order_line[0]
self.assertEqual(line_0.vendor_id_domain, [])
self.assertEqual(self.sol_a.vendor_id_domain, [])
self.assertEqual(self.sol_b.vendor_id_domain, [])

0 comments on commit 0c10e08

Please sign in to comment.