19.0 vanilla

This commit is contained in:
Ernad Husremovic 2026-03-09 09:30:07 +01:00
parent ba20ce7443
commit 768b70e05e
2357 changed files with 1057103 additions and 712486 deletions

View file

@ -1,356 +1,263 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
""" Implementation of "INVENTORY VALUATION TESTS (With valuation layers)" spreadsheet. """
from odoo.addons.stock_account.tests.test_stockvaluationlayer import TestStockValuationCommon
from odoo.addons.mrp_account.tests.common import TestBomPriceCommon
from odoo.tests import Form
class TestMrpValuationCommon(TestStockValuationCommon):
@classmethod
def setUpClass(cls):
super(TestMrpValuationCommon, cls).setUpClass()
cls.component_category = cls.env['product.category'].create(
{'name': 'category2'}
)
cls.component = cls.env['product.product'].create({
'name': 'component1',
'type': 'product',
'categ_id': cls.component_category.id,
})
cls.bom = cls.env['mrp.bom'].create({
'product_id': cls.product1.id,
'product_tmpl_id': cls.product1.product_tmpl_id.id,
'product_uom_id': cls.uom_unit.id,
'product_qty': 1.0,
'type': 'normal',
'bom_line_ids': [
(0, 0, {'product_id': cls.component.id, 'product_qty': 1})
]})
def _make_mo(self, bom, quantity=1):
mo_form = Form(self.env['mrp.production'])
mo_form.product_id = bom.product_id
mo_form.bom_id = bom
mo_form.product_qty = quantity
mo = mo_form.save()
mo.action_confirm()
return mo
def _produce(self, mo, quantity=0):
mo_form = Form(mo)
if not quantity:
quantity = mo.product_qty - mo.qty_produced
mo_form.qty_producing += quantity
mo = mo_form.save()
PRICE = 718.75 - 100 # total price minus glass
class TestMrpValuationStandard(TestMrpValuationCommon):
class TestMrpValuationStandard(TestBomPriceCommon):
def _get_production_cost_move_lines(self):
return self.env['account.move.line'].search([
('account_id', '=', self.account_production.id),
], order='date, id')
def test_fifo_fifo_1(self):
self.component.product_tmpl_id.categ_id.property_cost_method = 'fifo'
self.product1.product_tmpl_id.categ_id.property_cost_method = 'fifo'
self.glass.categ_id = self.category_fifo
self.dining_table.categ_id = self.category_fifo
self._make_in_move(self.component, 1, 10)
self._make_in_move(self.component, 1, 20)
mo = self._make_mo(self.bom, 2)
self._make_in_move(self.glass, 1, 10)
self._make_in_move(self.glass, 1, 20)
mo = self._create_mo(self.bom_1, 2)
self._produce(mo, 1)
action = mo.button_mark_done()
backorder = Form(self.env['mrp.production.backorder'].with_context(**action['context']))
backorder.save().action_backorder()
mo = mo.procurement_group_id.mrp_production_ids[-1]
self.assertEqual(self.component.value_svl, 20)
self.assertEqual(self.product1.value_svl, 10)
self.assertEqual(self.component.quantity_svl, 1)
self.assertEqual(self.product1.quantity_svl, 1)
mo = mo.production_group_id.production_ids[-1]
self.assertEqual(self.glass.total_value, 20)
self.assertEqual(self.dining_table.total_value, PRICE + 10)
self._produce(mo)
mo.button_mark_done()
self.assertEqual(self.component.value_svl, 0)
self.assertEqual(self.product1.value_svl, 30)
self.assertEqual(self.component.quantity_svl, 0)
self.assertEqual(self.product1.quantity_svl, 2)
self.assertEqual(self.glass.total_value, 0)
self.assertEqual(self.dining_table.total_value, 2 * PRICE + 10 + 20)
def test_fifo_fifo_2(self):
self.component.product_tmpl_id.categ_id.property_cost_method = 'fifo'
self.product1.product_tmpl_id.categ_id.property_cost_method = 'fifo'
self.glass.categ_id = self.category_fifo
self._make_in_move(self.component, 1, 10)
self._make_in_move(self.component, 1, 20)
mo = self._make_mo(self.bom, 2)
self._make_in_move(self.glass, 1, 10)
self._make_in_move(self.glass, 1, 20)
mo = self._create_mo(self.bom_1, 2)
self._produce(mo)
mo.button_mark_done()
self.assertEqual(self.component.value_svl, 0)
self.assertEqual(self.product1.value_svl, 30)
self.assertEqual(self.component.quantity_svl, 0)
self.assertEqual(self.product1.quantity_svl, 2)
self._make_out_move(self.product1, 1)
self.assertEqual(self.product1.value_svl, 15)
def test_fifo_byproduct(self):
""" Check that a MO byproduct with a cost share calculates correct svl """
self.component.product_tmpl_id.categ_id.property_cost_method = 'fifo'
self.product1.product_tmpl_id.categ_id.property_cost_method = 'fifo'
self._make_in_move(self.component, 1, 10)
self._make_in_move(self.component, 1, 20)
# add byproduct
byproduct_cost_share = 10
byproduct = self.env['product.product'].create({
'name': 'byproduct',
'type': 'product',
'categ_id': self.product1.product_tmpl_id.categ_id.id,
})
self.bom.write({
'byproduct_ids': [(0, 0, {'product_id': byproduct.id, 'product_uom_id': self.uom_unit.id, 'product_qty': 1, 'cost_share': byproduct_cost_share})]
})
mo = self._make_mo(self.bom, 2)
self._produce(mo, 1)
action = mo.button_mark_done()
backorder = Form(self.env['mrp.production.backorder'].with_context(**action['context']))
backorder.save().action_backorder()
mo = mo.procurement_group_id.mrp_production_ids[-1]
self.assertEqual(self.component.value_svl, 20)
self.assertEqual(self.product1.value_svl, 10 * (100 - byproduct_cost_share) / 100)
self.assertEqual(byproduct.value_svl, 10 * byproduct_cost_share / 100)
self.assertEqual(self.component.quantity_svl, 1)
self.assertEqual(self.product1.quantity_svl, 1)
self.assertEqual(byproduct.quantity_svl, 1)
self._produce(mo)
mo.button_mark_done()
self.assertEqual(self.component.value_svl, 0)
self.assertEqual(self.product1.value_svl, 30 * (100 - byproduct_cost_share) / 100)
self.assertEqual(byproduct.value_svl, 30 * byproduct_cost_share / 100)
self.assertEqual(self.component.quantity_svl, 0)
self.assertEqual(self.product1.quantity_svl, 2)
self.assertEqual(byproduct.quantity_svl, 2)
self.assertEqual(self.glass.total_value, 0)
self.assertEqual(self.dining_table.total_value, 2 * PRICE + 10 + 20)
self._make_out_move(self.dining_table, 1)
self.assertEqual(self.dining_table.total_value, (2 * PRICE + 10 + 20) / 2)
def test_fifo_unbuild(self):
""" This test creates an MO and then creates an unbuild
orders and checks the stock valuation.
"""
self.component.product_tmpl_id.categ_id.property_cost_method = 'fifo'
self.glass.categ_id = self.category_fifo
# ---------------------------------------------------
# MO
# ---------------------------------------------------
self._make_in_move(self.component, 1, 10)
self._make_in_move(self.component, 1, 20)
mo = self._make_mo(self.bom, 1)
self._make_in_move(self.glass, 1, 10)
self._make_in_move(self.glass, 1, 20)
mo = self._create_mo(self.bom_1, 1)
self._produce(mo)
mo.button_mark_done()
self.assertEqual(self.component.value_svl, 20)
self.assertEqual(self.glass.total_value, 20)
# ---------------------------------------------------
# Unbuild
# ---------------------------------------------------
unbuild_form = Form(self.env['mrp.unbuild'])
unbuild_form.mo_id = mo
unbuild_form.save().action_unbuild()
self.assertEqual(self.component.value_svl, 30)
self.assertEqual(self.glass.total_value, 30)
def test_fifo_produce_deliver_return_unbuild(self):
self.glass.categ_id = self.category_fifo
self._make_in_move(self.glass, 1, 10)
mo = self._create_mo(self.bom_1, 1)
self._produce(mo)
mo.button_mark_done()
out_move = self._make_out_move(self.dining_table, 1.0, create_picking=True)
self._make_return(out_move, 1.0)
unbuild_form = Form(self.env['mrp.unbuild'])
unbuild_form.mo_id = mo
unbuild_form.save().action_unbuild()
moves = self.env['stock.move'].search([('product_id', '=', self.dining_table.id)])
self.assertRecordValues(moves, [
{'value': PRICE + 10, 'quantity': 1.0, 'is_in': True, 'remaining_value': 0.0, 'remaining_qty': 0.0},
{'value': PRICE + 10, 'quantity': 1.0, 'is_in': False, 'remaining_value': 0.0, 'remaining_qty': 0.0},
{'value': PRICE + 10, 'quantity': 1.0, 'is_in': True, 'remaining_value': 0.0, 'remaining_qty': 0.0},
{'value': PRICE + 10, 'quantity': 1.0, 'is_in': False, 'remaining_value': 0.0, 'remaining_qty': 0.0},
])
def test_fifo_avco_1(self):
self.component.product_tmpl_id.categ_id.property_cost_method = 'fifo'
self.product1.product_tmpl_id.categ_id.property_cost_method = 'average'
self.glass.categ_id = self.category_fifo
self.dining_table.categ_id = self.category_avco
self._make_in_move(self.component, 1, 10)
self._make_in_move(self.component, 1, 20)
mo = self._make_mo(self.bom, 2)
self._make_in_move(self.glass, 1, 10)
self._make_in_move(self.glass, 1, 20)
mo = self._create_mo(self.bom_1, 2)
self._produce(mo, 1)
action = mo.button_mark_done()
backorder = Form(self.env['mrp.production.backorder'].with_context(**action['context']))
backorder.save().action_backorder()
mo = mo.procurement_group_id.mrp_production_ids[-1]
self.assertEqual(self.component.value_svl, 20)
self.assertEqual(self.product1.value_svl, 10)
self.assertEqual(self.component.quantity_svl, 1)
self.assertEqual(self.product1.quantity_svl, 1)
mo = mo.production_group_id.production_ids[-1]
self.assertEqual(self.glass.total_value, 20)
self.assertEqual(self.dining_table.total_value, PRICE + 10)
self._produce(mo)
mo.button_mark_done()
self.assertEqual(self.component.value_svl, 0)
self.assertEqual(self.product1.value_svl, 30)
self.assertEqual(self.component.quantity_svl, 0)
self.assertEqual(self.product1.quantity_svl, 2)
self.assertEqual(self.glass.total_value, 0)
self.assertEqual(self.dining_table.total_value, 2 * PRICE + 10 + 20)
def test_fifo_avco_2(self):
self.component.product_tmpl_id.categ_id.property_cost_method = 'fifo'
self.product1.product_tmpl_id.categ_id.property_cost_method = 'average'
self.glass.categ_id = self.category_fifo
self.dining_table.categ_id = self.category_avco
self.dining_table.categ_id = self.category_fifo
self._make_in_move(self.component, 1, 10)
self._make_in_move(self.component, 1, 20)
mo = self._make_mo(self.bom, 2)
self._make_in_move(self.glass, 1, 10)
self._make_in_move(self.glass, 1, 20)
mo = self._create_mo(self.bom_1, 2)
self._produce(mo)
mo.button_mark_done()
self.assertEqual(self.component.value_svl, 0)
self.assertEqual(self.product1.value_svl, 30)
self.assertEqual(self.component.quantity_svl, 0)
self.assertEqual(self.product1.quantity_svl, 2)
self._make_out_move(self.product1, 1)
self.assertEqual(self.product1.value_svl, 15)
self.assertEqual(self.glass.total_value, 0)
self.assertEqual(self.dining_table.total_value, PRICE * 2 + 10 + 20)
self._make_out_move(self.dining_table, 1)
self.assertEqual(self.dining_table.total_value, (PRICE * 2 + 10 + 20) / 2)
def test_fifo_std_1(self):
self.component.product_tmpl_id.categ_id.property_cost_method = 'fifo'
self.product1.product_tmpl_id.categ_id.property_cost_method = 'standard'
self.product1.standard_price = 8.8
self.glass.categ_id = self.category_fifo
self.dining_table.categ_id = self.category_standard
self.dining_table.standard_price = 8.8
self._make_in_move(self.component, 1, 10)
self._make_in_move(self.component, 1, 20)
mo = self._make_mo(self.bom, 2)
self._make_in_move(self.glass, 1, 10)
self._make_in_move(self.glass, 1, 20)
mo = self._create_mo(self.bom_1, 2)
self._produce(mo, 1)
mo._post_inventory()
self.assertEqual(self.component.value_svl, 20)
self.assertEqual(self.product1.value_svl, 8.8)
self.assertEqual(self.component.quantity_svl, 1)
self.assertEqual(self.product1.quantity_svl, 1)
self.assertEqual(self.glass.total_value, 20)
self.assertEqual(self.dining_table.total_value, 8.8)
self._produce(mo)
mo.button_mark_done()
self.assertEqual(self.component.value_svl, 0)
self.assertEqual(self.product1.value_svl, 8.8 * 2)
self.assertEqual(self.component.quantity_svl, 0)
self.assertEqual(self.product1.quantity_svl, 2)
self.assertEqual(self.glass.total_value, 0)
self.assertEqual(self.dining_table.total_value, 8.8 * 2)
def test_fifo_std_2(self):
self.component.product_tmpl_id.categ_id.property_cost_method = 'fifo'
self.product1.product_tmpl_id.categ_id.property_cost_method = 'standard'
self.product1.standard_price = 8.8
self.glass.categ_id = self.category_fifo
self.dining_table.categ_id = self.category_standard
self.dining_table.standard_price = 8.8
self._make_in_move(self.component, 1, 10)
self._make_in_move(self.component, 1, 20)
mo = self._make_mo(self.bom, 2)
self._make_in_move(self.glass, 1, 10)
self._make_in_move(self.glass, 1, 20)
mo = self._create_mo(self.bom_1, 2)
self._produce(mo)
mo.button_mark_done()
self.assertEqual(self.component.value_svl, 0)
self.assertEqual(self.product1.value_svl, 8.8 * 2)
self.assertEqual(self.component.quantity_svl, 0)
self.assertEqual(self.product1.quantity_svl, 2)
self._make_out_move(self.product1, 1)
self.assertEqual(self.product1.value_svl, 8.8)
self.assertEqual(self.glass.total_value, 0)
self.assertEqual(self.dining_table.total_value, 8.8 * 2)
self._make_out_move(self.dining_table, 1)
self.assertEqual(self.dining_table.total_value, 8.8)
def test_std_avco_1(self):
self.component.product_tmpl_id.categ_id.property_cost_method = 'standard'
self.product1.product_tmpl_id.categ_id.property_cost_method = 'average'
self.component.standard_price = 8.8
self.glass.categ_id = self.category_standard
self.dining_table.categ_id = self.category_avco
self._make_in_move(self.component, 1)
self._make_in_move(self.component, 1)
mo = self._make_mo(self.bom, 2)
self._make_in_move(self.glass, 1)
self._make_in_move(self.glass, 1)
mo = self._create_mo(self.bom_1, 2)
self._produce(mo, 1)
mo._post_inventory()
self.assertEqual(self.component.value_svl, 8.8)
self.assertEqual(self.product1.value_svl, 8.8)
self.assertEqual(self.component.quantity_svl, 1)
self.assertEqual(self.product1.quantity_svl, 1)
self.assertEqual(self.glass.total_value, 100)
self.assertEqual(self.dining_table.total_value, PRICE + 100)
self._produce(mo)
mo.button_mark_done()
self.assertEqual(self.component.value_svl, 0)
self.assertEqual(self.product1.value_svl, 8.8 * 2)
self.assertEqual(self.component.quantity_svl, 0)
self.assertEqual(self.product1.quantity_svl, 2)
self.assertEqual(self.glass.total_value, 0)
self.assertEqual(self.dining_table.total_value, 2 * (PRICE + 100))
def test_std_avco_2(self):
self.component.product_tmpl_id.categ_id.property_cost_method = 'standard'
self.product1.product_tmpl_id.categ_id.property_cost_method = 'average'
self.component.standard_price = 8.8
self.glass.categ_id = self.category_standard
self.dining_table.categ_id = self.category_avco
self._make_in_move(self.component, 1)
self._make_in_move(self.component, 1)
mo = self._make_mo(self.bom, 2)
self._make_in_move(self.glass, 1)
self._make_in_move(self.glass, 1)
mo = self._create_mo(self.bom_1, 2)
self._produce(mo)
mo.button_mark_done()
self.assertEqual(self.component.value_svl, 0)
self.assertEqual(self.product1.value_svl, 8.8 * 2)
self.assertEqual(self.component.quantity_svl, 0)
self.assertEqual(self.product1.quantity_svl, 2)
self.assertEqual(self.product1.standard_price, 8.8)
self.assertEqual(self.glass.total_value, 0)
self.assertEqual(self.dining_table.total_value, 2 * (PRICE + 100))
self.assertEqual(self.dining_table.standard_price, PRICE + 100)
self._make_out_move(self.product1, 1)
self.assertEqual(self.product1.value_svl, 8.8)
self._make_out_move(self.dining_table, 1)
self.assertEqual(self.dining_table.total_value, PRICE + 100)
# Update component price
self.component.standard_price = 0
self.glass.standard_price = 0
self._make_in_move(self.component, 3)
mo = self._make_mo(self.bom, 3)
self._make_in_move(self.glass, 3)
mo = self._create_mo(self.bom_1, 3)
self._produce(mo)
mo.button_mark_done()
self.assertEqual(self.product1.value_svl, 8.8)
self.assertEqual(self.product1.quantity_svl, 4)
self.assertEqual(self.product1.standard_price, 2.2)
self.assertEqual(self.dining_table.total_value, 4 * PRICE + 100)
self.assertEqual(self.dining_table.standard_price, (4 * PRICE + 100) / 4)
def test_std_std_1(self):
self.component.product_tmpl_id.categ_id.property_cost_method = 'standard'
self.product1.product_tmpl_id.categ_id.property_cost_method = 'standard'
self.component.standard_price = 8.8
self.product1.standard_price = 7.2
self.glass.categ_id = self.category_standard
self.dining_table.categ_id = self.category_standard
self._make_in_move(self.component, 1)
self._make_in_move(self.component, 1)
mo = self._make_mo(self.bom, 2)
self._make_in_move(self.glass, 1)
self._make_in_move(self.glass, 1)
mo = self._create_mo(self.bom_1, 2)
self._produce(mo, 1)
mo._post_inventory()
self.assertEqual(self.component.value_svl, 8.8)
self.assertEqual(self.product1.value_svl, 7.2)
self.assertEqual(self.component.quantity_svl, 1)
self.assertEqual(self.product1.quantity_svl, 1)
self.assertEqual(self.glass.total_value, 100)
self.assertEqual(self.dining_table.total_value, 1000)
self._produce(mo)
mo.button_mark_done()
self.assertEqual(self.component.value_svl, 0)
self.assertEqual(self.product1.value_svl, 7.2 * 2)
self.assertEqual(self.component.quantity_svl, 0)
self.assertEqual(self.product1.quantity_svl, 2)
self.assertEqual(self.glass.total_value, 0)
self.assertEqual(self.dining_table.total_value, 2000)
def test_std_std_2(self):
self.component.product_tmpl_id.categ_id.property_cost_method = 'standard'
self.product1.product_tmpl_id.categ_id.property_cost_method = 'standard'
self.component.standard_price = 8.8
self.product1.standard_price = 7.2
self.glass.categ_id = self.category_standard
self.dining_table.categ_id = self.category_standard
self._make_in_move(self.component, 1)
self._make_in_move(self.component, 1)
mo = self._make_mo(self.bom, 2)
self._make_in_move(self.glass, 1)
self._make_in_move(self.glass, 1)
mo = self._create_mo(self.bom_1, 2)
self._produce(mo)
mo.button_mark_done()
self.assertEqual(self.component.value_svl, 0)
self.assertEqual(self.product1.value_svl, 7.2 * 2)
self.assertEqual(self.component.quantity_svl, 0)
self.assertEqual(self.product1.quantity_svl, 2)
self._make_out_move(self.product1, 1)
self.assertEqual(self.product1.value_svl, 7.2)
self.assertEqual(self.glass.total_value, 0)
self.assertEqual(self.dining_table.total_value, 2000)
self._make_out_move(self.dining_table, 1)
self.assertEqual(self.dining_table.total_value, 1000)
def test_avco_avco_1(self):
self.component.product_tmpl_id.categ_id.property_cost_method = 'average'
self.product1.product_tmpl_id.categ_id.property_cost_method = 'average'
self.glass.categ_id = self.category_avco
self.dining_table.categ_id = self.category_avco
self._make_in_move(self.component, 1, 10)
self._make_in_move(self.component, 1, 20)
mo = self._make_mo(self.bom, 2)
self._make_in_move(self.glass, 1, 10)
self._make_in_move(self.glass, 1, 20)
mo = self._create_mo(self.bom_1, 2)
self._produce(mo, 1)
mo._post_inventory()
self.assertEqual(self.component.value_svl, 15)
self.assertEqual(self.product1.value_svl, 15)
self.assertEqual(self.component.quantity_svl, 1)
self.assertEqual(self.product1.quantity_svl, 1)
self.assertEqual(self.glass.total_value, 15)
self.assertEqual(self.dining_table.total_value, PRICE + 15)
self._produce(mo)
mo.button_mark_done()
self.assertEqual(self.component.value_svl, 0)
self.assertEqual(self.product1.value_svl, 30)
self.assertEqual(self.component.quantity_svl, 0)
self.assertEqual(self.product1.quantity_svl, 2)
self.assertEqual(self.glass.total_value, 0)
self.assertEqual(self.dining_table.total_value, 2 * PRICE + 30)
def test_avco_avco_2(self):
self.component.product_tmpl_id.categ_id.property_cost_method = 'average'
self.product1.product_tmpl_id.categ_id.property_cost_method = 'average'
self.glass.categ_id = self.category_avco
self.dining_table.categ_id = self.category_avco
self._make_in_move(self.component, 1, 10)
self._make_in_move(self.component, 1, 20)
mo = self._make_mo(self.bom, 2)
self._make_in_move(self.glass, 1, 10)
self._make_in_move(self.glass, 1, 20)
mo = self._create_mo(self.bom_1, 2)
self._produce(mo)
mo.button_mark_done()
self.assertEqual(self.component.value_svl, 0)
self.assertEqual(self.product1.value_svl, 30)
self.assertEqual(self.component.quantity_svl, 0)
self.assertEqual(self.product1.quantity_svl, 2)
self._make_out_move(self.product1, 1)
self.assertEqual(self.product1.value_svl, 15)
self.assertEqual(self.glass.total_value, 0)
self.assertEqual(self.dining_table.total_value, 2 * PRICE + 30)
self._make_out_move(self.dining_table, 1)
self.assertEqual(self.dining_table.total_value, (2 * PRICE + 30) / 2)
def test_validate_draft_kit(self):
"""
@ -358,28 +265,61 @@ class TestMrpValuationStandard(TestMrpValuationCommon):
validate it. From client side, such a behaviour is possible with
the Barcode app.
"""
self.component.product_tmpl_id.categ_id.property_cost_method = 'average'
self.product1.type = 'consu'
self.bom.type = 'phantom'
self.component.standard_price = 1424
self.plywood_sheet.qty_available = 0
self.plywood_sheet.categ_id = self.category_avco
receipt = self.env['stock.picking'].create({
'location_id': self.customer_location.id,
'location_dest_id': self.stock_location.id,
'picking_type_id': self.picking_type_in.id,
'state': 'draft',
'move_line_ids': [(0, 0, {
'product_id': self.product1.id,
'qty_done': 1,
'product_uom_id': self.product1.uom_id.id,
'product_id': self.table_head.id,
'quantity': 12,
'product_uom_id': self.table_head.uom_id.id,
'location_id': self.customer_location.id,
'location_dest_id': self.stock_location.id,
})]
})],
})
receipt.move_ids.picked = True
receipt.button_validate()
self.assertEqual(receipt.state, 'done')
self.assertRecordValues(receipt.move_ids, [
{'product_id': self.component.id, 'quantity_done': 1, 'state': 'done'},
])
self.assertEqual(self.component.qty_available, 1)
self.assertEqual(self.component.value_svl, 1424)
self.assertEqual(self.plywood_sheet.qty_available, 12)
self.assertEqual(self.plywood_sheet.total_value, 2400)
def test_production_account_00(self):
"""Create move into/out of a production location, test we create account
entries with the Production Cost account.
"""
self.dining_table.categ_id.property_cost_method = 'standard'
# move into production location
self._make_out_move(self.dining_table, 1, location_dest_id=self.prod_location.id)
in_aml = self._get_production_cost_move_lines()
self.assertEqual(in_aml.debit, 1000)
self.assertEqual(in_aml.product_id, self.dining_table)
# move out of production location
self._make_in_move(self.dining_table, 1, location_id=self.prod_location.id)
out_aml = self._get_production_cost_move_lines() - in_aml
self.assertEqual(out_aml.credit, 1000)
self.assertEqual(in_aml.product_id, self.dining_table)
def test_average_cost_unbuild_component_change_move_qty(self):
"""
Ensures that we can modify the quantity on the stock move of the components after an unbuild
"""
mo = self._create_mo(self.bom_1, 1)
self._produce(mo)
mo.button_mark_done()
action = mo.button_unbuild()
wizard = Form(self.env[action['res_model']].with_context(action['context']))
wizard.product_qty = 1
unbuild = wizard.save()
unbuild.action_validate()
# check that changing the quantity on the move form does not create an error
comp_move = mo.unbuild_ids.produce_line_ids.filtered(lambda move: move.product_id.id == self.glass.id)
with Form(comp_move.move_line_ids[0]) as form:
form.quantity = 0