123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386 |
- # -*- 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.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()
- class TestMrpValuationStandard(TestMrpValuationCommon):
- 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._make_in_move(self.component, 1, 10)
- self._make_in_move(self.component, 1, 20)
- 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)
- self.assertEqual(self.component.quantity_svl, 1)
- self.assertEqual(self.product1.quantity_svl, 1)
- 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)
- 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._make_in_move(self.component, 1, 10)
- self._make_in_move(self.component, 1, 20)
- mo = self._make_mo(self.bom, 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)
- 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'
- # ---------------------------------------------------
- # 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._produce(mo)
- mo.button_mark_done()
- self.assertEqual(self.component.value_svl, 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)
- 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._make_in_move(self.component, 1, 10)
- self._make_in_move(self.component, 1, 20)
- 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)
- self.assertEqual(self.component.quantity_svl, 1)
- self.assertEqual(self.product1.quantity_svl, 1)
- 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)
- 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._make_in_move(self.component, 1, 10)
- self._make_in_move(self.component, 1, 20)
- mo = self._make_mo(self.bom, 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_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._make_in_move(self.component, 1, 10)
- self._make_in_move(self.component, 1, 20)
- mo = self._make_mo(self.bom, 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._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)
- 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._make_in_move(self.component, 1, 10)
- self._make_in_move(self.component, 1, 20)
- mo = self._make_mo(self.bom, 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)
- 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._make_in_move(self.component, 1)
- self._make_in_move(self.component, 1)
- mo = self._make_mo(self.bom, 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._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)
- 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._make_in_move(self.component, 1)
- self._make_in_move(self.component, 1)
- mo = self._make_mo(self.bom, 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._make_out_move(self.product1, 1)
- self.assertEqual(self.product1.value_svl, 8.8)
- # Update component price
- self.component.standard_price = 0
- self._make_in_move(self.component, 3)
- mo = self._make_mo(self.bom, 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)
- 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._make_in_move(self.component, 1)
- self._make_in_move(self.component, 1)
- mo = self._make_mo(self.bom, 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._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)
- 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._make_in_move(self.component, 1)
- self._make_in_move(self.component, 1)
- mo = self._make_mo(self.bom, 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)
- 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._make_in_move(self.component, 1, 10)
- self._make_in_move(self.component, 1, 20)
- mo = self._make_mo(self.bom, 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._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)
- 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._make_in_move(self.component, 1, 10)
- self._make_in_move(self.component, 1, 20)
- mo = self._make_mo(self.bom, 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_validate_draft_kit(self):
- """
- Create a draft receipt, add a kit to its move lines and directly
- 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
- 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,
- 'move_line_ids': [(0, 0, {
- 'product_id': self.product1.id,
- 'qty_done': 1,
- 'product_uom_id': self.product1.uom_id.id,
- 'location_id': self.customer_location.id,
- 'location_dest_id': self.stock_location.id,
- })]
- })
- 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)
|