mirror of
https://github.com/OCA/stock-logistics-reporting.git
synced 2025-02-16 17:13:21 +02:00
[14.0][MIG]stock_account_valuation_report
This commit is contained in:
committed by
Bernat Puig Font
parent
6bab199944
commit
72288e113a
@@ -0,0 +1 @@
|
|||||||
|
../../../../stock_account_valuation_report
|
||||||
6
setup/stock_account_valuation_report/setup.py
Normal file
6
setup/stock_account_valuation_report/setup.py
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
import setuptools
|
||||||
|
|
||||||
|
setuptools.setup(
|
||||||
|
setup_requires=['setuptools-odoo'],
|
||||||
|
odoo_addon=True,
|
||||||
|
)
|
||||||
@@ -4,13 +4,17 @@
|
|||||||
|
|
||||||
{
|
{
|
||||||
"name": "Stock Account Valuation Report",
|
"name": "Stock Account Valuation Report",
|
||||||
"version": "13.0.1.0.0",
|
"version": "14.0.1.0.0",
|
||||||
"summary": "Improves logic of the Inventory Valuation Report",
|
"summary": "Improves logic of the Inventory Valuation Report",
|
||||||
"author": "ForgeFlow S.L., Odoo Community Association (OCA)",
|
"author": "ForgeFlow S.L., Odoo Community Association (OCA)",
|
||||||
"website": "https://github.com/OCA/stock-logistics-reporting",
|
"website": "https://github.com/OCA/stock-logistics-reporting",
|
||||||
"category": "Warehouse Management",
|
"category": "Warehouse Management",
|
||||||
"depends": ["stock_account"],
|
"depends": ["stock_account"],
|
||||||
"license": "AGPL-3",
|
"license": "AGPL-3",
|
||||||
"data": ["views/product_product_views.xml", "wizards/stock_valuation_history.xml"],
|
"data": [
|
||||||
|
"security/ir.model.access.csv",
|
||||||
|
"views/product_product_views.xml",
|
||||||
|
"wizards/stock_valuation_history.xml",
|
||||||
|
],
|
||||||
"installable": True,
|
"installable": True,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,2 @@
|
|||||||
|
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
|
||||||
|
access_stock_valuation_history,access.stock.valuation.history,model_stock_valuation_history,stock.group_stock_user,1,1,1,1
|
||||||
|
@@ -78,7 +78,7 @@ class TestStockAccountValuationReport(TransactionCase):
|
|||||||
)
|
)
|
||||||
|
|
||||||
def _create_user(self, login, groups, company):
|
def _create_user(self, login, groups, company):
|
||||||
""" Create a user."""
|
"""Create a user."""
|
||||||
group_ids = [group.id for group in groups]
|
group_ids = [group.id for group in groups]
|
||||||
user = self.res_users_model.with_context({"no_reset_password": True}).create(
|
user = self.res_users_model.with_context({"no_reset_password": True}).create(
|
||||||
{
|
{
|
||||||
@@ -130,7 +130,6 @@ class TestStockAccountValuationReport(TransactionCase):
|
|||||||
"type": "product",
|
"type": "product",
|
||||||
"standard_price": standard_price,
|
"standard_price": standard_price,
|
||||||
"valuation": "real_time",
|
"valuation": "real_time",
|
||||||
"invoice_policy": "delivery",
|
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
return template.product_variant_ids[0]
|
return template.product_variant_ids[0]
|
||||||
@@ -251,32 +250,32 @@ class TestStockAccountValuationReport(TransactionCase):
|
|||||||
aml = self.aml_model.search([("product_id", "=", self.product.id)])
|
aml = self.aml_model.search([("product_id", "=", self.product.id)])
|
||||||
inv_aml = aml.filtered(lambda l: l.account_id == self.account_inventory)
|
inv_aml = aml.filtered(lambda l: l.account_id == self.account_inventory)
|
||||||
balance_inv = sum(inv_aml.mapped("balance"))
|
balance_inv = sum(inv_aml.mapped("balance"))
|
||||||
self.assertEquals(balance_inv, 10.0)
|
self.assertEqual(balance_inv, 10.0)
|
||||||
move = in_picking.move_lines
|
move = in_picking.move_lines
|
||||||
layer = self.layer_model.search([("stock_move_id", "=", move.id)])
|
layer = self.layer_model.search([("stock_move_id", "=", move.id)])
|
||||||
self.assertEquals(layer.remaining_value, 10.0)
|
self.assertEqual(layer.remaining_value, 10.0)
|
||||||
# The accounting value and the stock value match
|
# The accounting value and the stock value match
|
||||||
self.assertEquals(self.product.stock_value, 10.0)
|
self.assertEqual(self.product.stock_value, 10.0)
|
||||||
self.assertEquals(self.product.account_value, 10.0)
|
self.assertEqual(self.product.account_value, 10.0)
|
||||||
# The qty also match
|
# The qty also match
|
||||||
self.assertEquals(self.product.qty_at_date, 1.0)
|
self.assertEqual(self.product.qty_at_date, 1.0)
|
||||||
self.assertEquals(self.product.account_qty_at_date, 1.0)
|
self.assertEqual(self.product.account_qty_at_date, 1.0)
|
||||||
# Create an out picking
|
# Create an out picking
|
||||||
out_picking = self._create_delivery(self.product, 1)
|
out_picking = self._create_delivery(self.product, 1)
|
||||||
self._do_picking(out_picking, fields.Datetime.now(), 1.0)
|
self._do_picking(out_picking, fields.Datetime.now(), 1.0)
|
||||||
# The original layer must have been reduced.
|
# The original layer must have been reduced.
|
||||||
self.assertEquals(layer.remaining_qty, 0.0)
|
self.assertEqual(layer.remaining_qty, 0.0)
|
||||||
self.assertEquals(layer.remaining_value, 0.0)
|
self.assertEqual(layer.remaining_value, 0.0)
|
||||||
# The layer out took that out
|
# The layer out took that out
|
||||||
move = out_picking.move_lines
|
move = out_picking.move_lines
|
||||||
layer = self.layer_model.search([("stock_move_id", "=", move.id)])
|
layer = self.layer_model.search([("stock_move_id", "=", move.id)])
|
||||||
self.assertEquals(layer.value, -10.0)
|
self.assertEqual(layer.value, -10.0)
|
||||||
# The report shows the material is gone
|
# The report shows the material is gone
|
||||||
self.product._compute_inventory_value()
|
self.product._compute_inventory_value()
|
||||||
self.assertEquals(self.product.stock_value, 0.0)
|
self.assertEqual(self.product.stock_value, 0.0)
|
||||||
self.assertEquals(self.product.account_value, 0.0)
|
self.assertEqual(self.product.account_value, 0.0)
|
||||||
self.assertEquals(self.product.qty_at_date, 0.0)
|
self.assertEqual(self.product.qty_at_date, 0.0)
|
||||||
self.assertEquals(self.product.account_qty_at_date, 0.0)
|
self.assertEqual(self.product.account_qty_at_date, 0.0)
|
||||||
|
|
||||||
def test_02_drop_ship(self):
|
def test_02_drop_ship(self):
|
||||||
"""Drop shipment from vendor to customer"""
|
"""Drop shipment from vendor to customer"""
|
||||||
@@ -295,20 +294,20 @@ class TestStockAccountValuationReport(TransactionCase):
|
|||||||
# Inventory is 0
|
# Inventory is 0
|
||||||
inv_aml = aml.filtered(lambda l: l.account_id == self.account_inventory)
|
inv_aml = aml.filtered(lambda l: l.account_id == self.account_inventory)
|
||||||
balance_inv = sum(inv_aml.mapped("balance"))
|
balance_inv = sum(inv_aml.mapped("balance"))
|
||||||
self.assertEquals(balance_inv, 0.0)
|
self.assertEqual(balance_inv, 0.0)
|
||||||
# There are two a stock valuation layers associated to this product
|
# There are two a stock valuation layers associated to this product
|
||||||
move = dropship_picking.move_lines
|
move = dropship_picking.move_lines
|
||||||
layers = self.layer_model.search([("stock_move_id", "=", move.id)])
|
layers = self.layer_model.search([("stock_move_id", "=", move.id)])
|
||||||
self.assertEquals(len(layers), 2)
|
self.assertEqual(len(layers), 2)
|
||||||
in_layer = layers.filtered(lambda l: l.quantity > 0)
|
in_layer = layers.filtered(lambda l: l.quantity > 0)
|
||||||
# Check that the layer created for the outgoing move
|
# Check that the layer created for the outgoing move
|
||||||
self.assertEquals(in_layer.remaining_qty, 0.0)
|
self.assertEqual(in_layer.remaining_qty, 0.0)
|
||||||
self.assertEquals(in_layer.remaining_value, 0.0)
|
self.assertEqual(in_layer.remaining_value, 0.0)
|
||||||
# The report shows the material is gone
|
# The report shows the material is gone
|
||||||
self.assertEquals(self.product.stock_value, 0.0)
|
self.assertEqual(self.product.stock_value, 0.0)
|
||||||
self.assertEquals(self.product.account_value, 0.0)
|
self.assertEqual(self.product.account_value, 0.0)
|
||||||
self.assertEquals(self.product.qty_at_date, 0.0)
|
self.assertEqual(self.product.qty_at_date, 0.0)
|
||||||
self.assertEquals(self.product.account_qty_at_date, 0.0)
|
self.assertEqual(self.product.account_qty_at_date, 0.0)
|
||||||
|
|
||||||
def test_03_stock_receipt_several_costs_several_dates(self):
|
def test_03_stock_receipt_several_costs_several_dates(self):
|
||||||
"""Receive into stock at different cost"""
|
"""Receive into stock at different cost"""
|
||||||
@@ -325,10 +324,10 @@ class TestStockAccountValuationReport(TransactionCase):
|
|||||||
aml = self.aml_model.search([("product_id", "=", self.product.id)])
|
aml = self.aml_model.search([("product_id", "=", self.product.id)])
|
||||||
inv_aml = aml.filtered(lambda l: l.account_id == self.account_inventory)
|
inv_aml = aml.filtered(lambda l: l.account_id == self.account_inventory)
|
||||||
balance_inv = sum(inv_aml.mapped("balance"))
|
balance_inv = sum(inv_aml.mapped("balance"))
|
||||||
self.assertEquals(balance_inv, 10.0)
|
self.assertEqual(balance_inv, 10.0)
|
||||||
move = in_picking.move_lines
|
move = in_picking.move_lines
|
||||||
layer = self.layer_model.search([("stock_move_id", "=", move.id)])
|
layer = self.layer_model.search([("stock_move_id", "=", move.id)])
|
||||||
self.assertEquals(layer.remaining_value, 10.0)
|
self.assertEqual(layer.remaining_value, 10.0)
|
||||||
# Receive more
|
# Receive more
|
||||||
in_picking2 = self._create_receipt(self.product, 2.0, False, 20.0)
|
in_picking2 = self._create_receipt(self.product, 2.0, False, 20.0)
|
||||||
# Receive two unitsat double cost.
|
# Receive two unitsat double cost.
|
||||||
@@ -344,15 +343,15 @@ class TestStockAccountValuationReport(TransactionCase):
|
|||||||
aml = self.aml_model.search([("product_id", "=", self.product.id)])
|
aml = self.aml_model.search([("product_id", "=", self.product.id)])
|
||||||
inv_aml = aml.filtered(lambda l: l.account_id == self.account_inventory)
|
inv_aml = aml.filtered(lambda l: l.account_id == self.account_inventory)
|
||||||
balance_inv = sum(inv_aml.mapped("balance"))
|
balance_inv = sum(inv_aml.mapped("balance"))
|
||||||
self.assertEquals(balance_inv, 50.0)
|
self.assertEqual(balance_inv, 50.0)
|
||||||
move2 = in_picking2.move_lines
|
move2 = in_picking2.move_lines
|
||||||
layer = self.layer_model.search([("stock_move_id", "=", move2.id)])
|
layer = self.layer_model.search([("stock_move_id", "=", move2.id)])
|
||||||
self.assertEquals(layer.remaining_value, 40.0)
|
self.assertEqual(layer.remaining_value, 40.0)
|
||||||
# Now we check the report reflects the same
|
# Now we check the report reflects the same
|
||||||
self.assertEquals(self.product.stock_value, 50.0)
|
self.assertEqual(self.product.stock_value, 50.0)
|
||||||
self.assertEquals(self.product.account_value, 50.0)
|
self.assertEqual(self.product.account_value, 50.0)
|
||||||
self.assertEquals(self.product.qty_at_date, 3.0)
|
self.assertEqual(self.product.qty_at_date, 3.0)
|
||||||
self.assertEquals(self.product.account_qty_at_date, 3.0)
|
self.assertEqual(self.product.account_qty_at_date, 3.0)
|
||||||
# That is the value tomorrow, today it is less
|
# That is the value tomorrow, today it is less
|
||||||
# We hack the date in the account move, not a topic for this module
|
# We hack the date in the account move, not a topic for this module
|
||||||
aml_layer = layer.account_move_id.line_ids
|
aml_layer = layer.account_move_id.line_ids
|
||||||
@@ -363,7 +362,7 @@ class TestStockAccountValuationReport(TransactionCase):
|
|||||||
self.product.with_context(
|
self.product.with_context(
|
||||||
at_date=fields.Datetime.now() + relativedelta(days=1)
|
at_date=fields.Datetime.now() + relativedelta(days=1)
|
||||||
)._compute_inventory_value()
|
)._compute_inventory_value()
|
||||||
self.assertEquals(self.product.stock_value, 10.0)
|
self.assertEqual(self.product.stock_value, 10.0)
|
||||||
self.assertEquals(self.product.account_value, 10.0)
|
self.assertEqual(self.product.account_value, 10.0)
|
||||||
self.assertEquals(self.product.qty_at_date, 1.0)
|
self.assertEqual(self.product.qty_at_date, 1.0)
|
||||||
self.assertEquals(self.product.account_qty_at_date, 1.0)
|
self.assertEqual(self.product.account_qty_at_date, 1.0)
|
||||||
|
|||||||
@@ -16,8 +16,8 @@ class StockValuationHistory(models.TransientModel):
|
|||||||
)
|
)
|
||||||
|
|
||||||
def open_at_date(self):
|
def open_at_date(self):
|
||||||
action = self.env["ir.actions.act_window"].for_xml_id(
|
action = self.env["ir.actions.act_window"]._for_xml_id(
|
||||||
"stock_account_valuation_report", "product_valuation_action"
|
"stock_account_valuation_report.product_valuation_action"
|
||||||
)
|
)
|
||||||
domain = [("type", "=", "product")]
|
domain = [("type", "=", "product")]
|
||||||
product_id = self.env.context.get("product_id", False)
|
product_id = self.env.context.get("product_id", False)
|
||||||
|
|||||||
Reference in New Issue
Block a user