diff --git a/addons/purchase_stock/models/stock_rule.py b/addons/purchase_stock/models/stock_rule.py index 8e87481fa9e..d107a4b4a0d 100644 --- a/addons/purchase_stock/models/stock_rule.py +++ b/addons/purchase_stock/models/stock_rule.py @@ -49,6 +49,7 @@ class StockRule(models.Model): schedule_date = (procurement_date_planned - relativedelta(days=procurement.company_id.po_lead)) supplier = procurement.product_id._select_seller( + partner_id=procurement.values.get("supplier_id"), quantity=procurement.product_qty, date=schedule_date.date(), uom_id=procurement.product_uom) diff --git a/addons/purchase_stock/tests/test_reordering_rule.py b/addons/purchase_stock/tests/test_reordering_rule.py index d5ceda8fe47..374c58ab8f9 100644 --- a/addons/purchase_stock/tests/test_reordering_rule.py +++ b/addons/purchase_stock/tests/test_reordering_rule.py @@ -1,11 +1,14 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. -from odoo.tests.common import SavepointCase +from datetime import datetime as dt +from datetime import timedelta as td + from odoo.tests import Form +from odoo.tests.common import SavepointCase + class TestReorderingRule(SavepointCase): - @classmethod def setUpClass(cls): super(TestReorderingRule, cls).setUpClass() @@ -153,3 +156,84 @@ class TestReorderingRule(SavepointCase): self.assertEqual(purchase_order.picking_ids.move_lines[-1].product_qty, 5) self.assertEqual(purchase_order.picking_ids.move_lines[-1].location_dest_id, warehouse_1.lot_stock_id) + + def test_procure_not_default_partner(self): + """Define a product with 2 vendors. First run a "standard" procurement, + default vendor should be used. Then, call a procurement with + `partner_id` specified in values, the specified vendor should be + used.""" + purchase_route = self.env.ref("purchase_stock.route_warehouse0_buy") + uom_unit = self.env.ref("uom.product_uom_unit") + warehouse = self.env['stock.warehouse'].search( + [('company_id', '=', self.env.company.id)], limit=1) + product = self.env["product.product"].create({ + "name": "product TEST", + "standard_price": 100.0, + "type": "product", + "uom_id": uom_unit.id, + "default_code": "A", + "route_ids": [(6, 0, purchase_route.ids)], + }) + default_vendor = self.env["res.partner"].create({ + "name": "Supplier A", + }) + secondary_vendor = self.env["res.partner"].create({ + "name": "Supplier B", + }) + self.env["product.supplierinfo"].create({ + "name": default_vendor.id, + "product_tmpl_id": product.product_tmpl_id.id, + "delay": 7, + }) + self.env["product.supplierinfo"].create({ + "name": secondary_vendor.id, + "product_tmpl_id": product.product_tmpl_id.id, + "delay": 10, + }) + + # Test standard procurement. + po_line = self.env["purchase.order.line"].search( + [("product_id", "=", product.id)]) + self.assertFalse(po_line) + self.env["procurement.group"].run( + [self.env["procurement.group"].Procurement( + product, 100, uom_unit, + warehouse.lot_stock_id, "Test default vendor", "/", + self.env.company, + { + "warehouse_id": warehouse, + "date_planned": dt.today() + td(days=15), + "rule_id": warehouse.buy_pull_id, + "group_id": False, + "route_ids": [], + } + )]) + po_line = self.env["purchase.order.line"].search( + [("product_id", "=", product.id)]) + self.assertTrue(po_line) + self.assertEqual(po_line.partner_id, default_vendor) + po_line.order_id.button_cancel() + po_line.order_id.unlink() + + # now force the vendor: + po_line = self.env["purchase.order.line"].search( + [("product_id", "=", product.id)]) + self.assertFalse(po_line) + self.env["procurement.group"].run( + [self.env["procurement.group"].Procurement( + product, 100, uom_unit, + warehouse.lot_stock_id, "Test default vendor", "/", + self.env.company, + { + "warehouse_id": warehouse, + "date_planned": dt.today() + td(days=15), + "rule_id": warehouse.buy_pull_id, + "group_id": False, + "route_ids": [], + "supplier_id": secondary_vendor, + } + )]) + po_line = self.env["purchase.order.line"].search( + [("product_id", "=", product.id)]) + self.assertTrue(po_line) + self.assertEqual(po_line.partner_id, secondary_vendor)