[FIX] mrp_packaging_default: multiply packagings per products manufactured

Before this patch, the amount of packagings was the same in an `mrp.production`, no matter the ordered quantity.

This was a conceptual mistake. Packaging qtys had to be multiplied, just like it happens with UoM qtys.

@moduon MT-8145
This commit is contained in:
Jairo Llopis
2024-11-22 13:35:48 +00:00
parent 08fccec922
commit 970a80b56f
4 changed files with 130 additions and 19 deletions

View File

@@ -1,2 +1,3 @@
from . import mrp_bom_line
from . import mrp_production
from . import stock_move

View File

@@ -0,0 +1,27 @@
# Copyright 2024 Moduon Team S.L.
# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl-3.0)
from odoo import models
class MrpProduction(models.Model):
_inherit = "mrp.production"
def _get_move_raw_values(
self,
product_id,
product_uom_qty,
product_uom,
operation_id=False,
bom_line=False,
):
"""Include packaging in new move values."""
result = super()._get_move_raw_values(
product_id,
product_uom_qty,
product_uom,
operation_id=operation_id,
bom_line=bom_line,
)
if bom_line and bom_line.product_packaging_id:
result["product_packaging_id"] = bom_line.product_packaging_id.id
return result

View File

@@ -22,7 +22,6 @@ class StockMove(models.Model):
vals.update(
{
"product_packaging_id": bom_line.product_packaging_id.id,
"product_packaging_qty": bom_line.product_packaging_qty,
}
)

View File

@@ -138,27 +138,27 @@ class MrpPackagingDefaultCase(TestMrpCommon):
"description_bom_line": "Sandwich - 1/3",
"product_id": self.tomato_product.id,
"product_packaging_id": self.tomato_product.packaging_ids[2].id,
"product_packaging_qty": 2.0,
"product_packaging_qty": 4.0,
"product_uom": self.env.ref("uom.product_uom_kgm").id,
"product_uom_qty": 0.1,
"product_uom_qty": 0.2,
},
{
"bom_line_id": sandwich.bom_ids[0].bom_line_ids[1].id,
"description_bom_line": "Sandwich - 2/3",
"product_id": self.lettuce_product.id,
"product_packaging_id": self.lettuce_product.packaging_ids[0].id,
"product_packaging_qty": 4.0,
"product_packaging_qty": 8.0,
"product_uom": self.env.ref("uom.product_uom_kgm").id,
"product_uom_qty": 0.2,
"product_uom_qty": 0.4,
},
{
"bom_line_id": sandwich.bom_ids[0].bom_line_ids[2].id,
"description_bom_line": "Sandwich - 3/3",
"product_id": self.bread_product.id,
"product_packaging_id": self.bread_product.packaging_ids[0].id,
"product_packaging_qty": 2,
"product_packaging_qty": 4.0,
"product_uom": self.env.ref("uom.product_uom_kgm").id,
"product_uom_qty": 0.2,
"product_uom_qty": 0.4,
},
],
)
@@ -194,25 +194,109 @@ class MrpPackagingDefaultCase(TestMrpCommon):
"bom_line_id": sandwich.bom_ids[0].bom_line_ids[0].id,
"product_id": self.tomato_product.id,
"product_packaging_id": self.tomato_product.packaging_ids[2].id,
"product_packaging_qty": 2.0,
"product_packaging_qty": 20,
"product_uom": self.env.ref("uom.product_uom_kgm").id,
"product_uom_qty": 0.1,
"product_uom_qty": 1.0,
},
{
"bom_line_id": sandwich.bom_ids[0].bom_line_ids[1].id,
"product_id": self.lettuce_product.id,
"product_packaging_id": self.lettuce_product.packaging_ids[0].id,
"product_packaging_qty": 4.0,
"product_packaging_qty": 40,
"product_uom": self.env.ref("uom.product_uom_kgm").id,
"product_uom_qty": 0.2,
"product_uom_qty": 2.0,
},
{
"bom_line_id": sandwich.bom_ids[0].bom_line_ids[2].id,
"product_id": self.bread_product.id,
"product_packaging_id": self.bread_product.packaging_ids[0].id,
"product_packaging_qty": 2,
"product_packaging_qty": 20,
"product_uom": self.env.ref("uom.product_uom_kgm").id,
"product_uom_qty": 0.2,
"product_uom_qty": 2.0,
},
],
)
def test_manual_replenish_cooked_sandwitch(self):
"""Manually order one cooked sandwitch."""
sandwich = self.create_sandwich(cooked=True)
# Define a reordering rule for the cooked sandwich
rule_f = Form(self.env["stock.warehouse.orderpoint"])
rule_f.product_id = sandwich
rule_f.product_min_qty = 4
rule_f.product_max_qty = 10
rule = rule_f.save()
# Ask for a one-time replenishment
rule.action_replenish()
# Check the created manufacturing order
mo = self.env["mrp.production"].search([("product_id", "=", sandwich.id)])
self.assertEqual(mo.state, "confirmed")
self.assertEqual(mo.qty_producing, 0)
self.assertEqual(mo.product_qty, 10)
self.assertEqual(mo.bom_id, sandwich.bom_ids)
self.assertRecordValues(
mo.move_raw_ids,
[
{
"bom_line_id": sandwich.bom_ids[0].bom_line_ids[0].id,
"product_id": self.tomato_product.id,
"product_packaging_id": self.tomato_product.packaging_ids[2].id,
"product_packaging_qty": 20,
"product_uom": self.env.ref("uom.product_uom_kgm").id,
"product_uom_qty": 1.0,
},
{
"bom_line_id": sandwich.bom_ids[0].bom_line_ids[1].id,
"product_id": self.lettuce_product.id,
"product_packaging_id": self.lettuce_product.packaging_ids[0].id,
"product_packaging_qty": 40,
"product_uom": self.env.ref("uom.product_uom_kgm").id,
"product_uom_qty": 2.0,
},
{
"bom_line_id": sandwich.bom_ids[0].bom_line_ids[2].id,
"product_id": self.bread_product.id,
"product_packaging_id": self.bread_product.packaging_ids[0].id,
"product_packaging_qty": 20,
"product_uom": self.env.ref("uom.product_uom_kgm").id,
"product_uom_qty": 2.0,
},
],
)
# Change quantity to produce
change_qty_f = Form(
self.env["change.production.qty"].with_context(default_mo_id=mo.id)
)
change_qty_f.product_qty = 7
change_qty_f.save().change_prod_qty()
# Check the updated manufacturing order
self.assertEqual(mo.product_qty, 7)
self.assertRecordValues(
mo.move_raw_ids,
[
{
"bom_line_id": sandwich.bom_ids[0].bom_line_ids[0].id,
"product_id": self.tomato_product.id,
"product_packaging_id": self.tomato_product.packaging_ids[2].id,
"product_packaging_qty": 14,
"product_uom": self.env.ref("uom.product_uom_kgm").id,
"product_uom_qty": 0.7,
},
{
"bom_line_id": sandwich.bom_ids[0].bom_line_ids[1].id,
"product_id": self.lettuce_product.id,
"product_packaging_id": self.lettuce_product.packaging_ids[0].id,
"product_packaging_qty": 28,
"product_uom": self.env.ref("uom.product_uom_kgm").id,
"product_uom_qty": 1.4,
},
{
"bom_line_id": sandwich.bom_ids[0].bom_line_ids[2].id,
"product_id": self.bread_product.id,
"product_packaging_id": self.bread_product.packaging_ids[0].id,
"product_packaging_qty": 14,
"product_uom": self.env.ref("uom.product_uom_kgm").id,
"product_uom_qty": 1.4,
},
],
)
@@ -238,25 +322,25 @@ class MrpPackagingDefaultCase(TestMrpCommon):
"bom_line_id": sandwich.bom_ids[0].bom_line_ids[0].id,
"product_id": self.tomato_product.id,
"product_packaging_id": self.tomato_product.packaging_ids[2].id,
"product_packaging_qty": 2.0,
"product_packaging_qty": 20,
"product_uom": self.env.ref("uom.product_uom_kgm").id,
"product_uom_qty": 0.1,
"product_uom_qty": 1.0,
},
{
"bom_line_id": sandwich.bom_ids[0].bom_line_ids[1].id,
"product_id": self.lettuce_product.id,
"product_packaging_id": self.lettuce_product.packaging_ids[0].id,
"product_packaging_qty": 4.0,
"product_packaging_qty": 40,
"product_uom": self.env.ref("uom.product_uom_kgm").id,
"product_uom_qty": 0.2,
"product_uom_qty": 2.0,
},
{
"bom_line_id": sandwich.bom_ids[0].bom_line_ids[2].id,
"product_id": self.bread_product.id,
"product_packaging_id": self.bread_product.packaging_ids[0].id,
"product_packaging_qty": 2,
"product_packaging_qty": 20,
"product_uom": self.env.ref("uom.product_uom_kgm").id,
"product_uom_qty": 0.2,
"product_uom_qty": 2.0,
},
],
)