113 lines
4.6 KiB
Python
113 lines
4.6 KiB
Python
"""Integration tests verifying all 3 depreciation methods through the engine."""
|
|
|
|
from datetime import date
|
|
|
|
from odoo.tests.common import TransactionCase
|
|
from odoo.tests import tagged
|
|
|
|
|
|
@tagged('post_install', '-at_install', 'integration')
|
|
class TestStraightLineIntegration(TransactionCase):
|
|
|
|
def setUp(self):
|
|
super().setUp()
|
|
self.engine = self.env['fusion.asset.engine']
|
|
|
|
def test_straight_line_5yr_no_salvage(self):
|
|
asset = self.env['fusion.asset'].create({
|
|
'name': 'SL Test', 'cost': 10000, 'salvage_value': 0,
|
|
'acquisition_date': date(2026, 1, 1),
|
|
'in_service_date': date(2026, 1, 1),
|
|
'method': 'straight_line', 'useful_life_years': 5,
|
|
})
|
|
self.engine.compute_depreciation_schedule(asset)
|
|
lines = asset.depreciation_line_ids.sorted('period_index')
|
|
self.assertEqual(len(lines), 5)
|
|
for line in lines:
|
|
self.assertAlmostEqual(line.amount, 2000, places=2)
|
|
|
|
def test_straight_line_10yr_with_salvage(self):
|
|
asset = self.env['fusion.asset'].create({
|
|
'name': 'SL10', 'cost': 50000, 'salvage_value': 5000,
|
|
'acquisition_date': date(2026, 1, 1),
|
|
'in_service_date': date(2026, 1, 1),
|
|
'method': 'straight_line', 'useful_life_years': 10,
|
|
})
|
|
self.engine.compute_depreciation_schedule(asset)
|
|
lines = asset.depreciation_line_ids.sorted('period_index')
|
|
self.assertEqual(len(lines), 10)
|
|
# Each year = (50000-5000)/10 = 4500; total depreciable = 45000
|
|
self.assertAlmostEqual(sum(lines.mapped('amount')), 45000, places=2)
|
|
|
|
def test_straight_line_book_value_at_end_equals_salvage(self):
|
|
asset = self.env['fusion.asset'].create({
|
|
'name': 'SL', 'cost': 10000, 'salvage_value': 1000,
|
|
'acquisition_date': date(2026, 1, 1),
|
|
'in_service_date': date(2026, 1, 1),
|
|
'method': 'straight_line', 'useful_life_years': 5,
|
|
})
|
|
self.engine.compute_depreciation_schedule(asset)
|
|
last = asset.depreciation_line_ids.sorted('period_index')[-1]
|
|
self.assertAlmostEqual(last.book_value_at_end, 1000, places=2)
|
|
|
|
|
|
@tagged('post_install', '-at_install', 'integration')
|
|
class TestDecliningBalanceIntegration(TransactionCase):
|
|
|
|
def setUp(self):
|
|
super().setUp()
|
|
self.engine = self.env['fusion.asset.engine']
|
|
|
|
def test_declining_balance_30pct(self):
|
|
asset = self.env['fusion.asset'].create({
|
|
'name': 'DB', 'cost': 10000, 'salvage_value': 1000,
|
|
'acquisition_date': date(2026, 1, 1),
|
|
'in_service_date': date(2026, 1, 1),
|
|
'method': 'declining_balance', 'useful_life_years': 5,
|
|
'declining_rate_pct': 30.0,
|
|
})
|
|
self.engine.compute_depreciation_schedule(asset)
|
|
lines = asset.depreciation_line_ids.sorted('period_index')
|
|
# First period: 10000 * 0.30 = 3000
|
|
self.assertAlmostEqual(lines[0].amount, 3000, places=2)
|
|
# Should not exceed salvage at end
|
|
self.assertGreaterEqual(lines[-1].book_value_at_end, 999.99)
|
|
|
|
def test_declining_balance_50pct_high_rate(self):
|
|
asset = self.env['fusion.asset'].create({
|
|
'name': 'DB50', 'cost': 8000, 'salvage_value': 500,
|
|
'acquisition_date': date(2026, 1, 1),
|
|
'in_service_date': date(2026, 1, 1),
|
|
'method': 'declining_balance', 'useful_life_years': 5,
|
|
'declining_rate_pct': 50.0,
|
|
})
|
|
self.engine.compute_depreciation_schedule(asset)
|
|
# First period: 8000 * 0.50 = 4000
|
|
first = asset.depreciation_line_ids.sorted('period_index')[0]
|
|
self.assertAlmostEqual(first.amount, 4000, places=2)
|
|
|
|
|
|
@tagged('post_install', '-at_install', 'integration')
|
|
class TestUnitsOfProductionIntegration(TransactionCase):
|
|
|
|
def setUp(self):
|
|
super().setUp()
|
|
self.engine = self.env['fusion.asset.engine']
|
|
|
|
def test_units_of_production_5yr_even_distribution(self):
|
|
asset = self.env['fusion.asset'].create({
|
|
'name': 'UOP', 'cost': 50000, 'salvage_value': 0,
|
|
'acquisition_date': date(2026, 1, 1),
|
|
'in_service_date': date(2026, 1, 1),
|
|
'method': 'units_of_production',
|
|
'total_units_expected': 100000,
|
|
'useful_life_years': 5,
|
|
})
|
|
self.engine.compute_depreciation_schedule(asset)
|
|
lines = asset.depreciation_line_ids.sorted('period_index')
|
|
# 5 periods, even distribution = 20000 units/period
|
|
# Each period: (20000/100000) * 50000 = 10000
|
|
self.assertEqual(len(lines), 5)
|
|
for line in lines:
|
|
self.assertAlmostEqual(line.amount, 10000, places=2)
|