mirror of
https://github.com/OCA/manufacture.git
synced 2025-01-28 16:37:15 +02:00
[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:
@@ -1,2 +1,3 @@
|
||||
from . import mrp_bom_line
|
||||
from . import mrp_production
|
||||
from . import stock_move
|
||||
|
||||
27
mrp_packaging_default/models/mrp_production.py
Normal file
27
mrp_packaging_default/models/mrp_production.py
Normal 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
|
||||
@@ -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,
|
||||
}
|
||||
)
|
||||
|
||||
|
||||
@@ -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,
|
||||
},
|
||||
],
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user