[IMP] purchase_stock: enhance extensibility of _run_buy method by

allowing to force the vendor to be used in the procurement batch.

This does not change any default behavior.

closes odoo/odoo#46678

X-original-commit: 8bff35182c38522bbd6fc218956fe0f8fe99eca4
Signed-off-by: Simon Lejeune (sle) <sle@openerp.com>
This commit is contained in:
Lois Rilo
2020-03-02 19:34:15 +00:00
committed by Simon Lejeune
parent 32c81cc195
commit 0e11d7383c
2 changed files with 87 additions and 2 deletions
@@ -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)
@@ -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)