diff --git a/addons/stock_landed_costs/__manifest__.py b/addons/stock_landed_costs/__manifest__.py index 436a601b9bc247ebf9fc075c9e96bbcfbe912480..e181f6d9bb4dfd094ef55c7019a336750ac92181 100644 --- a/addons/stock_landed_costs/__manifest__.py +++ b/addons/stock_landed_costs/__manifest__.py @@ -23,12 +23,6 @@ This module allows you to easily add extra costs on pickings and decide the spli 'views/stock_landed_cost_views.xml', 'views/res_config_settings_views.xml', ], - 'test': [ - '../account/test/account_minimal_test.xml', - '../stock_account/test/stock_valuation_account.xml', - 'test/stock_landed_costs.yml', - 'test/stock_landed_costs_rounding.yml', - ], 'installable': True, 'auto_install': False, } diff --git a/addons/stock_landed_costs/test/stock_landed_costs.yml b/addons/stock_landed_costs/test/stock_landed_costs.yml deleted file mode 100644 index f98ca67a3128131f64ccb5424a0f0f27c4228175..0000000000000000000000000000000000000000 --- a/addons/stock_landed_costs/test/stock_landed_costs.yml +++ /dev/null @@ -1,125 +0,0 @@ -- - In order to test the landed costs feature of stock, I create a landed cost, confirm it and check its account move created -- - I create 2 products with different volume and gross weight and configure them for real_time valuation and fifo costing method -- - !record {model: product.product, id: product_landed_cost_1}: - name: "LC product 1" - cost_method: fifo - valuation: real_time - weight: 10 - volume: 1 - property_stock_account_input: o_expense - property_stock_account_output: o_income -- - !record {model: product.product, id: product_landed_cost_2}: - name: "LC product 2" - cost_method: fifo - valuation: real_time - weight: 20 - volume: 1.5 - property_stock_account_input: o_expense - property_stock_account_output: o_income -- - I create 2 picking moving those products -- - !record {model: stock.picking, id: picking_landed_cost_1}: - name: 'LC_pick_1' - picking_type_id: stock.picking_type_out - move_lines: - - name: move 1 - product_id: product_landed_cost_1 - product_uom_qty: 5 - product_uom: product.product_uom_unit - location_id: stock.stock_location_stock - location_dest_id: stock.stock_location_customers -- - Confirm and assign picking -- - !python {model: stock.picking, id: picking_landed_cost_1}: | - self.env.user.company_id.anglo_saxon_accounting = True - self.action_confirm() - self.action_assign() - self.move_lines.quantity_done = 5 - self.button_validate() -- - !record {model: stock.picking, id: picking_landed_cost_2}: - name: 'LC_pick_2' - picking_type_id: stock.picking_type_out - move_lines: - - name: move 2 - product_id: product_landed_cost_2 - product_uom_qty: 10 - product_uom: product.product_uom_unit - location_id: stock.stock_location_stock - location_dest_id: stock.stock_location_customers -- - Confirm and assign picking -- - !python {model: stock.picking, id: picking_landed_cost_2}: | - self.action_confirm() - self.action_assign() - self.move_lines.quantity_done = 10 - self.button_validate() -- - I create a landed cost for those 2 pickings -- - !record {model: stock.landed.cost, id: stock_landed_cost_1}: - picking_ids: [picking_landed_cost_1, picking_landed_cost_2] - account_journal_id: expenses_journal - cost_lines: - - name: 'equal split' - split_method: 'equal' - price_unit: 10 - product_id: product.product_product_2 - - name: 'split by quantity' - split_method: 'by_quantity' - price_unit: 150 - product_id: product.product_product_2 - - name: 'split by weight' - split_method: 'by_weight' - price_unit: 250 - product_id: product.product_product_2 - - name: 'split by volume' - split_method: 'by_volume' - price_unit: 20 - product_id: product.product_product_2 - valuation_adjustment_lines: [] -- - I compute the landed cost using Compute button -- - !python {model: stock.landed.cost, id: stock_landed_cost_1}: | - self.compute_landed_cost() -- - I check the valuation adjustment lines -- - !python {model: stock.landed.cost, id: stock_landed_cost_1}: | - for valuation in self.valuation_adjustment_lines: - if valuation.cost_line_id.name == 'equal split': - assert valuation.additional_landed_cost == 5 - elif valuation.cost_line_id.name == 'split by quantity' and valuation.move_id.name == "move 1": - assert valuation.additional_landed_cost == 50 - elif valuation.cost_line_id.name == 'split by quantity' and valuation.move_id.name == "move 2": - assert valuation.additional_landed_cost == 100 - elif valuation.cost_line_id.name == 'split by weight' and valuation.move_id.name == "move 1": - assert valuation.additional_landed_cost == 50 - elif valuation.cost_line_id.name == 'split by weight' and valuation.move_id.name == "move 2": - assert valuation.additional_landed_cost == 200 - elif valuation.cost_line_id.name == 'split by volume' and valuation.move_id.name == "move 1": - assert valuation.additional_landed_cost == 5 - elif valuation.cost_line_id.name == 'split by volume' and valuation.move_id.name == "move 2": - assert valuation.additional_landed_cost == 15 - else: - raise 'unrecognized valuation adjustment line' -- - I confirm the landed cost -- - !python {model: stock.landed.cost, id: stock_landed_cost_1}: | - self.button_validate() -- - I check that the landed cost is now "Closed" and that it has an accounting entry -- - !assert {model: stock.landed.cost, id: stock_landed_cost_1}: - - state == 'done' - - account_move_id - - len(account_move_id.line_ids) == 48 diff --git a/addons/stock_landed_costs/test/stock_landed_costs_rounding.yml b/addons/stock_landed_costs/test/stock_landed_costs_rounding.yml deleted file mode 100644 index 225ab5a74c48bfa6604cfc228ac984e7fdc30c93..0000000000000000000000000000000000000000 --- a/addons/stock_landed_costs/test/stock_landed_costs_rounding.yml +++ /dev/null @@ -1,143 +0,0 @@ -- - In order to test the rounding in landed costs feature of stock, I create 2 landed cost -- - Define undivisible units -- - !record {model: product.uom, id: product_uom_unit_round_1}: - category_id: product.product_uom_categ_unit - name: Undivisible Unit(s) - factor: 1.0 - rounding: 1.0 -- - I create 2 products with different cost prices and configure them for real_time valuation and real price costing method -- - !record {model: product.product, id: product_landed_cost_3}: - name: "LC product 3" - cost_method: fifo - uom_id: product_uom_unit_round_1 - valuation: real_time - property_stock_account_input: o_expense - property_stock_account_output: o_income -- - !record {model: product.product, id: product_landed_cost_4}: - name: "LC product 4" - cost_method: fifo - uom_id: product_uom_unit_round_1 - valuation: real_time - property_stock_account_input: o_expense - property_stock_account_output: o_income -- - I create 2 pickings moving those products -- - !record {model: stock.picking, id: picking_landed_cost_3}: - name: 'LC_pick_3' - picking_type_id: stock.picking_type_in - move_lines: - - name: move 3 - product_id: product_landed_cost_3 - product_uom_qty: 13 - product_uom: product_uom_unit_round_1 - location_id: stock.stock_location_customers - location_dest_id: stock.stock_location_stock -- - !record {model: stock.picking, id: picking_landed_cost_4}: - name: 'LC_pick_4' - picking_type_id: stock.picking_type_in - move_lines: - - name: move 4 - product_id: product_landed_cost_4 - product_uom_qty: 1 - product_uom: product.product_uom_dozen - location_id: stock.stock_location_customers - location_dest_id: stock.stock_location_stock - price_unit: !eval 17.00/12.00 -- - We perform all the tests for LC_pick_3 -- - I receive picking LC_pick_3, and check how many quants are created -- - !python {model: stock.picking, id: picking_landed_cost_3}: | - self.move_lines.price_unit = 1.0 - - self.action_confirm() - self.action_assign() - self.action_done() -- - I create a landed cost for picking 3 -- - !record {model: stock.landed.cost, id: stock_landed_cost_2}: - picking_ids: [picking_landed_cost_3] - account_journal_id: expenses_journal - cost_lines: - - name: 'equal split' - split_method: 'equal' - price_unit: 15 - product_id: product.product_product_1 - valuation_adjustment_lines: [] -- - I compute the landed cost using Compute button -- - !python {model: stock.landed.cost, id: stock_landed_cost_2}: | - self.compute_landed_cost() -- - I check the valuation adjustment lines -- - !python {model: stock.landed.cost, id: stock_landed_cost_2}: | - for valuation in self.valuation_adjustment_lines: - assert valuation.additional_landed_cost == 15 -- - I confirm the landed cost -- - !python {model: stock.landed.cost, id: stock_landed_cost_2}: | - self.button_validate() -- - I check that the landed cost is now "Closed" and that it has an accounting entry -- - !assert {model: stock.landed.cost, id: stock_landed_cost_2}: - - state == 'done' - - account_move_id -- - We perform all the tests for LC_pick_4 -- - I receive picking LC_pick_4, and check how many quants are created -- - !python {model: stock.picking, id: picking_landed_cost_4}: | - self.move_lines.price_unit = 17.0/12.0 - - self.action_confirm() - self.action_assign() - self.action_done() -- - I create a landed cost for picking 4 -- - !record {model: stock.landed.cost, id: stock_landed_cost_3}: - picking_ids: [picking_landed_cost_4] - account_journal_id: expenses_journal - cost_lines: - - name: 'equal split' - split_method: 'equal' - price_unit: 11 - product_id: product.product_product_1 - valuation_adjustment_lines: [] -- - I compute the landed cost using Compute button -- - !python {model: stock.landed.cost, id: stock_landed_cost_3}: | - self.compute_landed_cost() -- - I check the valuation adjustment lines -- - !python {model: stock.landed.cost, id: stock_landed_cost_3}: | - for valuation in self.valuation_adjustment_lines: - assert valuation.additional_landed_cost == 11 -- - I confirm the landed cost -- - !python {model: stock.landed.cost, id: stock_landed_cost_3}: | - self.button_validate() -- - I check that the landed cost is now "Closed" and that it has an accounting entry -- - !assert {model: stock.landed.cost, id: stock_landed_cost_3}: - - state == 'done' - - account_move_id diff --git a/addons/stock_landed_costs/tests/__init__.py b/addons/stock_landed_costs/tests/__init__.py index 6fba363c3bf511eb8726655eadb54e4013ec29bb..750868a9cbb1aaf8e5454a6838385755dcbda98f 100644 --- a/addons/stock_landed_costs/tests/__init__.py +++ b/addons/stock_landed_costs/tests/__init__.py @@ -1,3 +1,5 @@ # -*- coding: utf-8 -*- +from . import test_stock_landed_costs from . import test_stock_landed_costs_purchase +from . import test_stock_landed_costs_rounding diff --git a/addons/stock_landed_costs/tests/common.py b/addons/stock_landed_costs/tests/common.py index 34158874a0710093490121e9ba6f32f1c060b106..56087a3726c5ead6a0ef254d1ac9246bdcf0b067 100644 --- a/addons/stock_landed_costs/tests/common.py +++ b/addons/stock_landed_costs/tests/common.py @@ -1,9 +1,17 @@ # -*- coding: utf-8 -*- +from odoo import tools from odoo.addons.account.tests.account_test_classes import AccountingTestCase +from odoo.modules.module import get_module_resource + class TestStockLandedCostsCommon(AccountingTestCase): + def _load(self, module, *args): + tools.convert_file(self.cr, 'stock_landed_costs', + get_module_resource(module, *args), + {}, 'init', False, 'test', self.registry._assertion_report) + def setUp(self): super(TestStockLandedCostsCommon, self).setUp() # Objects diff --git a/addons/stock_landed_costs/tests/test_stock_landed_costs.py b/addons/stock_landed_costs/tests/test_stock_landed_costs.py new file mode 100644 index 0000000000000000000000000000000000000000..1d709b17f16fd29a6d313e13cfa607ce34b02a8a --- /dev/null +++ b/addons/stock_landed_costs/tests/test_stock_landed_costs.py @@ -0,0 +1,145 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo.addons.stock_landed_costs.tests.common import TestStockLandedCostsCommon +from odoo.exceptions import ValidationError + + +class TestStockLandedCosts(TestStockLandedCostsCommon): + + def test_stock_landed_costs(self): + # In order to test the landed costs feature of stock, + # I create a landed cost, confirm it and check its account move created + + self._load('account', 'test', 'account_minimal_test.xml') + self._load('stock_account', 'test', 'stock_valuation_account.xml') + + # I create 2 products with different volume and gross weight and configure + # them for real_time valuation and fifo costing method + product_landed_cost_1 = self.env['product.product'].create({ + 'name': "LC product 1", + 'cost_method': 'fifo', + 'valuation': 'real_time', + 'weight': 10, + 'volume': 1, + 'property_stock_account_input': self.ref('stock_landed_costs.o_expense'), + 'property_stock_account_output': self.ref('stock_landed_costs.o_income'), + }) + + product_landed_cost_2 = self.env['product.product'].create({ + 'name': "LC product 2", + 'cost_method': 'fifo', + 'valuation': 'real_time', + 'weight': 20, + 'volume': 1.5, + 'property_stock_account_input': self.ref('stock_landed_costs.o_expense'), + 'property_stock_account_output': self.ref('stock_landed_costs.o_income'), + }) + + picking_default_vals = self.env['stock.picking'].default_get(list(self.env['stock.picking'].fields_get())) + + # I create 2 picking moving those products + vals = dict(picking_default_vals, **{ + 'name': 'LC_pick_1', + 'picking_type_id': self.ref('stock.picking_type_out'), + 'move_lines': [(0, 0, { + 'product_id': product_landed_cost_1.id, + 'product_uom_qty': 5, + 'product_uom': self.ref('product.product_uom_unit'), + 'location_id': self.ref('stock.stock_location_stock'), + 'location_dest_id': self.ref('stock.stock_location_customers'), + })], + }) + picking_landed_cost_1 = self.env['stock.picking'].new(vals) + picking_landed_cost_1.onchange_picking_type() + picking_landed_cost_1.move_lines.onchange_product_id() + picking_landed_cost_1.move_lines.name = 'move 1' + vals = picking_landed_cost_1._convert_to_write(picking_landed_cost_1._cache) + picking_landed_cost_1 = self.env['stock.picking'].create(vals) + + # Confirm and assign picking + self.env.user.company_id.anglo_saxon_accounting = True + picking_landed_cost_1.action_confirm() + picking_landed_cost_1.action_assign() + picking_landed_cost_1.move_lines.quantity_done = 5 + picking_landed_cost_1.button_validate() + + vals = dict(picking_default_vals, **{ + 'name': 'LC_pick_2', + 'picking_type_id': self.ref('stock.picking_type_out'), + 'move_lines': [(0, 0, { + 'product_id': product_landed_cost_2.id, + 'product_uom_qty': 10, + 'product_uom': self.ref('product.product_uom_unit'), + 'location_id': self.ref('stock.stock_location_stock'), + 'location_dest_id': self.ref('stock.stock_location_customers'), + })], + }) + picking_landed_cost_2 = self.env['stock.picking'].new(vals) + picking_landed_cost_2.onchange_picking_type() + picking_landed_cost_2.move_lines.onchange_product_id() + picking_landed_cost_2.move_lines.name = 'move 2' + vals = picking_landed_cost_2._convert_to_write(picking_landed_cost_2._cache) + picking_landed_cost_2 = self.env['stock.picking'].create(vals) + + # Confirm and assign picking + picking_landed_cost_2.action_confirm() + picking_landed_cost_2.action_assign() + picking_landed_cost_2.move_lines.quantity_done = 10 + picking_landed_cost_2.button_validate() + + # I create a landed cost for those 2 pickings + default_vals = self.env['stock.landed.cost'].default_get(list(self.env['stock.landed.cost'].fields_get())) + default_vals.update({ + 'picking_ids': [picking_landed_cost_1.id, picking_landed_cost_2.id], + 'account_journal_id': self.ref('stock_landed_costs.expenses_journal'), + 'cost_lines': [ + (0, 0, {'product_id': self.ref('product.product_product_2')}), + (0, 0, {'product_id': self.ref('product.product_product_2')}), + (0, 0, {'product_id': self.ref('product.product_product_2')}), + (0, 0, {'product_id': self.ref('product.product_product_2')})], + 'valuation_adjustment_lines': [], + }) + cost_lines_values = { + 'name': ['equal split', 'split by quantity', 'split by weight', 'split by volume'], + 'split_method': ['equal', 'by_quantity', 'by_weight', 'by_volume'], + 'price_unit': [10, 150, 250, 20], + } + stock_landed_cost_1 = self.env['stock.landed.cost'].new(default_vals) + for index, cost_line in enumerate(stock_landed_cost_1.cost_lines): + cost_line.onchange_product_id() + cost_line.name = cost_lines_values['name'][index] + cost_line.split_method = cost_lines_values['split_method'][index] + cost_line.price_unit = cost_lines_values['price_unit'][index] + vals = stock_landed_cost_1._convert_to_write(stock_landed_cost_1._cache) + stock_landed_cost_1 = self.env['stock.landed.cost'].create(vals) + + # I compute the landed cost using Compute button + stock_landed_cost_1.compute_landed_cost() + + # I check the valuation adjustment lines + for valuation in stock_landed_cost_1.valuation_adjustment_lines: + if valuation.cost_line_id.name == 'equal split': + self.assertEqual(valuation.additional_landed_cost, 5) + elif valuation.cost_line_id.name == 'split by quantity' and valuation.move_id.name == "move 1": + self.assertEqual(valuation.additional_landed_cost, 50) + elif valuation.cost_line_id.name == 'split by quantity' and valuation.move_id.name == "move 2": + self.assertEqual(valuation.additional_landed_cost, 100) + elif valuation.cost_line_id.name == 'split by weight' and valuation.move_id.name == "move 1": + self.assertEqual(valuation.additional_landed_cost, 50) + elif valuation.cost_line_id.name == 'split by weight' and valuation.move_id.name == "move 2": + self.assertEqual(valuation.additional_landed_cost, 200) + elif valuation.cost_line_id.name == 'split by volume' and valuation.move_id.name == "move 1": + self.assertEqual(valuation.additional_landed_cost, 5) + elif valuation.cost_line_id.name == 'split by volume' and valuation.move_id.name == "move 2": + self.assertEqual(valuation.additional_landed_cost, 15) + else: + raise ValidationError('unrecognized valuation adjustment line') + + # I confirm the landed cost + stock_landed_cost_1.button_validate() + + # I check that the landed cost is now "Closed" and that it has an accounting entry + self.assertEqual(stock_landed_cost_1.state, "done") + self.assertTrue(stock_landed_cost_1.account_move_id) + self.assertEqual(len(stock_landed_cost_1.account_move_id.line_ids), 48) diff --git a/addons/stock_landed_costs/tests/test_stock_landed_costs_rounding.py b/addons/stock_landed_costs/tests/test_stock_landed_costs_rounding.py new file mode 100644 index 0000000000000000000000000000000000000000..d069389439af3be30f2f38739970b4ea7a647394 --- /dev/null +++ b/addons/stock_landed_costs/tests/test_stock_landed_costs_rounding.py @@ -0,0 +1,155 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo.addons.stock_landed_costs.tests.common import TestStockLandedCostsCommon + + +class TestStockLandedCostsRounding(TestStockLandedCostsCommon): + + def test_stock_landed_costs_rounding(self): + # In order to test the rounding in landed costs feature of stock, I create 2 landed cost + + self._load('account', 'test', 'account_minimal_test.xml') + self._load('stock_account', 'test', 'stock_valuation_account.xml') + + # Define undivisible units + product_uom_unit_round_1 = self.env['product.uom'].create({ + 'category_id': self.ref('product.product_uom_categ_unit'), + 'name': 'Undivisible Unit(s)', + 'factor': 1.0, + 'rounding': 1.0, + }) + + # I create 2 products with different cost prices and configure them for real_time + # valuation and real price costing method + product_landed_cost_3 = self.env['product.product'].create({ + 'name': "LC product 3", + 'cost_method': 'fifo', + 'uom_id': product_uom_unit_round_1.id, + 'valuation': 'real_time', + 'property_stock_account_input': self.ref('stock_landed_costs.o_expense'), + 'property_stock_account_output': self.ref('stock_landed_costs.o_income'), + }) + + product_landed_cost_4 = self.env['product.product'].create({ + 'name': "LC product 4", + 'cost_method': 'fifo', + 'uom_id': product_uom_unit_round_1.id, + 'valuation': 'real_time', + 'property_stock_account_input': self.ref('stock_landed_costs.o_expense'), + 'property_stock_account_output': self.ref('stock_landed_costs.o_income'), + }) + + picking_default_vals = self.env['stock.picking'].default_get(list(self.env['stock.picking'].fields_get())) + + # I create 2 pickings moving those products + vals = dict(picking_default_vals, **{ + 'name': 'LC_pick_3', + 'picking_type_id': self.ref('stock.picking_type_in'), + 'move_lines': [(0, 0, { + 'product_id': product_landed_cost_3.id, + 'product_uom_qty': 13, + 'product_uom': product_uom_unit_round_1.id, + 'location_id': self.ref('stock.stock_location_customers'), + 'location_dest_id': self.ref('stock.stock_location_stock'), + })], + }) + picking_landed_cost_3 = self.env['stock.picking'].new(vals) + picking_landed_cost_3.onchange_picking_type() + picking_landed_cost_3.move_lines.onchange_product_id() + picking_landed_cost_3.move_lines.name = 'move 3' + vals = picking_landed_cost_3._convert_to_write(picking_landed_cost_3._cache) + picking_landed_cost_3 = self.env['stock.picking'].create(vals) + + vals = dict(picking_default_vals, **{ + 'name': 'LC_pick_4', + 'picking_type_id': self.ref('stock.picking_type_in'), + 'move_lines': [(0, 0, { + 'product_id': product_landed_cost_4.id, + 'product_uom_qty': 1, + 'product_uom': self.ref('product.product_uom_dozen'), + 'location_id': self.ref('stock.stock_location_customers'), + 'location_dest_id': self.ref('stock.stock_location_stock'), + 'price_unit': 17.00 / 12.00, + })], + }) + picking_landed_cost_4 = self.env['stock.picking'].new(vals) + picking_landed_cost_4.onchange_picking_type() + picking_landed_cost_4.move_lines.onchange_product_id() + picking_landed_cost_4.move_lines.name = 'move 4' + vals = picking_landed_cost_4._convert_to_write(picking_landed_cost_4._cache) + picking_landed_cost_4 = self.env['stock.picking'].create(vals) + + # We perform all the tests for LC_pick_3 + # I receive picking LC_pick_3, and check how many quants are created + picking_landed_cost_3.move_lines.price_unit = 1.0 + picking_landed_cost_3.action_confirm() + picking_landed_cost_3.action_assign() + picking_landed_cost_3.action_done() + + # I create a landed cost for picking 3 + default_vals = self.env['stock.landed.cost'].default_get(list(self.env['stock.landed.cost'].fields_get())) + default_vals.update({ + 'picking_ids': [picking_landed_cost_3.id], + 'account_journal_id': self.ref('stock_landed_costs.expenses_journal'), + 'cost_lines': [(0, 0, {'product_id': self.ref('product.product_product_1')})], + 'valuation_adjustment_lines': [], + }) + stock_landed_cost_2 = self.env['stock.landed.cost'].new(default_vals) + stock_landed_cost_2.cost_lines.onchange_product_id() + stock_landed_cost_2.cost_lines.name = 'equal split' + stock_landed_cost_2.cost_lines.split_method = 'equal' + stock_landed_cost_2.cost_lines.price_unit = 15 + vals = stock_landed_cost_2._convert_to_write(stock_landed_cost_2._cache) + stock_landed_cost_2 = self.env['stock.landed.cost'].create(vals) + + # I compute the landed cost using Compute button + stock_landed_cost_2.compute_landed_cost() + + # I check the valuation adjustment lines + for valuation in stock_landed_cost_2.valuation_adjustment_lines: + self.assertEqual(valuation.additional_landed_cost, 15) + + # I confirm the landed cost + stock_landed_cost_2.button_validate() + + # I check that the landed cost is now "Closed" and that it has an accounting entry + self.assertEqual(stock_landed_cost_2.state, 'done') + self.assertTrue(stock_landed_cost_2.account_move_id) + + # We perform all the tests for LC_pick_4 + # I receive picking LC_pick_4, and check how many quants are created + picking_landed_cost_4.move_lines.price_unit = 17.0/12.0 + picking_landed_cost_4.action_confirm() + picking_landed_cost_4.action_assign() + picking_landed_cost_4.action_done() + + # I create a landed cost for picking 4 + default_vals = self.env['stock.landed.cost'].default_get(list(self.env['stock.landed.cost'].fields_get())) + default_vals.update({ + 'picking_ids': [picking_landed_cost_4.id], + 'account_journal_id': self.ref('stock_landed_costs.expenses_journal'), + 'cost_lines': [(0, 0, {'product_id': self.ref('product.product_product_1')})], + 'valuation_adjustment_lines': [], + }) + stock_landed_cost_3 = self.env['stock.landed.cost'].new(default_vals) + stock_landed_cost_3.cost_lines.onchange_product_id() + stock_landed_cost_3.cost_lines.name = 'equal split' + stock_landed_cost_3.cost_lines.split_method = 'equal' + stock_landed_cost_3.cost_lines.price_unit = 11 + vals = stock_landed_cost_3._convert_to_write(stock_landed_cost_3._cache) + stock_landed_cost_3 = self.env['stock.landed.cost'].create(vals) + + # I compute the landed cost using Compute button + stock_landed_cost_3.compute_landed_cost() + + # I check the valuation adjustment lines + for valuation in stock_landed_cost_3.valuation_adjustment_lines: + self.assertEqual(valuation.additional_landed_cost, 11) + + # I confirm the landed cost + stock_landed_cost_3.button_validate() + + # I check that the landed cost is now "Closed" and that it has an accounting entry + self.assertEqual(stock_landed_cost_3.state, 'done') + self.assertTrue(stock_landed_cost_3.account_move_id)