mirror of
https://github.com/OCA/manufacture.git
synced 2025-01-28 16:37:15 +02:00
[FIX] mrp_multi_level_estimate: do not overstate estimates
when group days of estimates is greater than the lengh of the date range in the estimate, the estimate is overstated and can generate unexpected result. Enhance help message to highligh this and prevent it from happening.
This commit is contained in:
@@ -12,8 +12,9 @@ class ProductMRPArea(models.Model):
|
||||
string="Group Days of Estimates",
|
||||
default=1,
|
||||
help="The days to group your estimates as demand for the MRP."
|
||||
"It can be different from the lenght of the date ranges you "
|
||||
"use in the estimates.",
|
||||
"It can be different from the length of the date ranges you "
|
||||
"use in the estimates but it should not be greater, in that case"
|
||||
"only grouping until the total lenght of the date range will be done.",
|
||||
)
|
||||
|
||||
_sql_constraints = [
|
||||
|
||||
@@ -29,7 +29,7 @@ class TestMrpMultiLevelEstimate(TestMrpMultiLevelCommon):
|
||||
"location_id": cls.estimate_loc.id,
|
||||
}
|
||||
)
|
||||
cls.product_mrp_area_obj.create(
|
||||
cls.test_mrp_parameter = cls.product_mrp_area_obj.create(
|
||||
{
|
||||
"product_id": cls.prod_test.id,
|
||||
"mrp_area_id": cls.estimate_area.id,
|
||||
@@ -113,8 +113,8 @@ class TestMrpMultiLevelEstimate(TestMrpMultiLevelCommon):
|
||||
)
|
||||
self.assertEqual(len(inventories), 18)
|
||||
|
||||
def test_02_group_demand_estimates(self):
|
||||
"""Test demand grouping functionality, `nbr_days`."""
|
||||
def test_02_demand_estimates_group_plans(self):
|
||||
"""Test requirement grouping functionality, `nbr_days`."""
|
||||
estimates = self.estimate_obj.search(
|
||||
[
|
||||
("product_id", "=", self.prod_test.id),
|
||||
@@ -146,3 +146,44 @@ class TestMrpMultiLevelEstimate(TestMrpMultiLevelCommon):
|
||||
self.assertIn(abs(week_2_expected), quantities)
|
||||
week_3_expected = sum(moves_from_estimates[14:].mapped("mrp_qty"))
|
||||
self.assertIn(abs(week_3_expected), quantities)
|
||||
|
||||
def test_03_group_demand_estimates(self):
|
||||
"""Test demand grouping functionality, `group_estimate_days`."""
|
||||
self.test_mrp_parameter.group_estimate_days = 7
|
||||
self.mrp_multi_level_wiz.create({}).run_mrp_multi_level()
|
||||
estimates = self.estimate_obj.search(
|
||||
[
|
||||
("product_id", "=", self.prod_test.id),
|
||||
("location_id", "=", self.estimate_loc.id),
|
||||
]
|
||||
)
|
||||
self.assertEqual(len(estimates), 3)
|
||||
moves = self.mrp_move_obj.search(
|
||||
[
|
||||
("product_id", "=", self.prod_test.id),
|
||||
("mrp_area_id", "=", self.estimate_area.id),
|
||||
]
|
||||
)
|
||||
# 3 weekly estimates, demand from estimates grouped in batches of 7
|
||||
# days = 3 days of estimates mrp moves:
|
||||
moves_from_estimates = moves.filtered(lambda m: m.mrp_type == "d")
|
||||
self.assertEqual(len(moves_from_estimates), 3)
|
||||
# 210 weekly -> 30 daily -> 30 * 4 days not consumed = 120
|
||||
self.assertEqual(moves_from_estimates[0].mrp_qty, -120)
|
||||
self.assertEqual(moves_from_estimates[1].mrp_qty, -280)
|
||||
self.assertEqual(moves_from_estimates[2].mrp_qty, -350)
|
||||
# Test group_estimate_days greater than date range, it should not
|
||||
# generate greater demand.
|
||||
self.test_mrp_parameter.group_estimate_days = 10
|
||||
self.mrp_multi_level_wiz.create({}).run_mrp_multi_level()
|
||||
moves = self.mrp_move_obj.search(
|
||||
[
|
||||
("product_id", "=", self.prod_test.id),
|
||||
("mrp_area_id", "=", self.estimate_area.id),
|
||||
]
|
||||
)
|
||||
moves_from_estimates = moves.filtered(lambda m: m.mrp_type == "d")
|
||||
self.assertEqual(len(moves_from_estimates), 3)
|
||||
self.assertEqual(moves_from_estimates[0].mrp_qty, -120)
|
||||
self.assertEqual(moves_from_estimates[1].mrp_qty, -280)
|
||||
self.assertEqual(moves_from_estimates[2].mrp_qty, -350)
|
||||
|
||||
@@ -23,6 +23,15 @@ class MultiLevelMrp(models.TransientModel):
|
||||
precision_rounding=product_mrp_area.product_id.uom_id.rounding,
|
||||
rounding_method="HALF-UP",
|
||||
)
|
||||
today = fields.Date.today()
|
||||
days_consumed = 0
|
||||
if product_mrp_area.group_estimate_days > 1:
|
||||
start = estimate.date_from
|
||||
if start < today:
|
||||
days_consumed = (today - start).days
|
||||
group_estimate_days = min(
|
||||
product_mrp_area.group_estimate_days, estimate.duration - days_consumed
|
||||
)
|
||||
return {
|
||||
"mrp_area_id": product_mrp_area.mrp_area_id.id,
|
||||
"product_id": product_mrp_area.product_id.id,
|
||||
@@ -31,7 +40,7 @@ class MultiLevelMrp(models.TransientModel):
|
||||
"purchase_order_id": None,
|
||||
"purchase_line_id": None,
|
||||
"stock_move_id": None,
|
||||
"mrp_qty": -daily_qty * product_mrp_area.group_estimate_days,
|
||||
"mrp_qty": -daily_qty * group_estimate_days,
|
||||
"current_qty": -daily_qty,
|
||||
"mrp_date": date,
|
||||
"current_date": date,
|
||||
@@ -61,11 +70,11 @@ class MultiLevelMrp(models.TransientModel):
|
||||
domain = self._estimates_domain(product_mrp_area)
|
||||
estimates = self.env["stock.demand.estimate"].search(domain)
|
||||
for rec in estimates:
|
||||
start = rec.date_range_id.date_start
|
||||
start = rec.date_from
|
||||
if start < today:
|
||||
start = today
|
||||
mrp_date = fields.Date.from_string(start)
|
||||
date_end = fields.Date.from_string(rec.date_range_id.date_end)
|
||||
date_end = fields.Date.from_string(rec.date_to)
|
||||
delta = timedelta(days=product_mrp_area.group_estimate_days)
|
||||
while mrp_date <= date_end:
|
||||
mrp_move_data = self._prepare_mrp_move_data_from_estimate(
|
||||
|
||||
Reference in New Issue
Block a user