summaryrefslogtreecommitdiff
path: root/addons/mrp_account
diff options
context:
space:
mode:
authorWilliam Henrotin <whe@odoo.com>2019-12-10 12:41:06 +0000
committerWilliam Henrotin <whe@odoo.com>2019-12-10 12:41:06 +0000
commit9503f463e38c51b516d6e339b08b934c4e5cf36a (patch)
tree9188ced07d39f6b1877100071194df24ef0aced2 /addons/mrp_account
parent9debcaf377f4ce371150950dd4e501dde1d40551 (diff)
[FIX] mrp: always show post inventory button
The inventory button was shown or hide depending of the product valuation. As the valuation was previously stored on the stock moves and posting split the stock moves. Fifo and Avco valuation was not well computed. The migration to stock valuation layer fixed this behavior. This commit shows the post inventory button as soon as there are some finished move to be posted. task : 54665 closes odoo/odoo#41781 X-original-commit: 5dfa3f817d3a9f47a863a587569a862a40c7d159 Signed-off-by: William Henrotin <Whenrow@users.noreply.github.com>
Diffstat (limited to 'addons/mrp_account')
-rw-r--r--addons/mrp_account/tests/__init__.py1
-rw-r--r--addons/mrp_account/tests/test_valuation_layers.py275
2 files changed, 276 insertions, 0 deletions
diff --git a/addons/mrp_account/tests/__init__.py b/addons/mrp_account/tests/__init__.py
index 349bd9d4fed..832146f1555 100644
--- a/addons/mrp_account/tests/__init__.py
+++ b/addons/mrp_account/tests/__init__.py
@@ -2,3 +2,4 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from . import test_mrp_account
from . import test_bom_price
+from . import test_valuation_layers
diff --git a/addons/mrp_account/tests/test_valuation_layers.py b/addons/mrp_account/tests/test_valuation_layers.py
new file mode 100644
index 00000000000..bf50edf042b
--- /dev/null
+++ b/addons/mrp_account/tests/test_valuation_layers.py
@@ -0,0 +1,275 @@
+# -*- 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):
+ produce_form = Form(self.env['mrp.product.produce'].with_context({
+ 'active_id': mo.id,
+ 'active_ids': [mo.id],
+ }))
+ if quantity:
+ produce_form.qty_producing = quantity
+ product_produce = produce_form.save()
+ product_produce.do_produce()
+
+
+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)
+ mo.post_inventory()
+ 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_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)
+ mo.post_inventory()
+ 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._make_out_move(self.product1, 1)
+ self.assertEqual(self.product1.value_svl, 8.8)
+
+ 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)