66 lines
2.1 KiB
Python
66 lines
2.1 KiB
Python
from datetime import date
|
|
|
|
from odoo.tests.common import TransactionCase
|
|
from odoo.tests import tagged
|
|
from odoo.addons.fusion_accounting_assets.services.prorate import prorate_factor
|
|
|
|
|
|
@tagged('post_install', '-at_install')
|
|
class TestProrate(TransactionCase):
|
|
|
|
def test_full_month_convention_always_one(self):
|
|
f = prorate_factor(
|
|
period_start=date(2026, 1, 1),
|
|
period_end=date(2026, 1, 31),
|
|
asset_start=date(2026, 1, 15),
|
|
convention='full_month',
|
|
)
|
|
self.assertEqual(f, 1.0)
|
|
|
|
def test_asset_starts_before_period_full_factor(self):
|
|
f = prorate_factor(
|
|
period_start=date(2026, 1, 1),
|
|
period_end=date(2026, 1, 31),
|
|
asset_start=date(2025, 12, 1),
|
|
convention='days_period',
|
|
)
|
|
self.assertEqual(f, 1.0)
|
|
|
|
def test_asset_starts_after_period_zero_factor(self):
|
|
f = prorate_factor(
|
|
period_start=date(2026, 1, 1),
|
|
period_end=date(2026, 1, 31),
|
|
asset_start=date(2026, 2, 5),
|
|
convention='days_period',
|
|
)
|
|
self.assertEqual(f, 0.0)
|
|
|
|
def test_days_period_mid_month(self):
|
|
# Jan 16 -> Jan 31 inclusive = 16 days; period = 31 days
|
|
f = prorate_factor(
|
|
period_start=date(2026, 1, 1),
|
|
period_end=date(2026, 1, 31),
|
|
asset_start=date(2026, 1, 16),
|
|
convention='days_period',
|
|
)
|
|
self.assertAlmostEqual(f, 16 / 31, places=5)
|
|
|
|
def test_days_365_mid_month(self):
|
|
# 16 days / 365
|
|
f = prorate_factor(
|
|
period_start=date(2026, 1, 1),
|
|
period_end=date(2026, 1, 31),
|
|
asset_start=date(2026, 1, 16),
|
|
convention='days_365',
|
|
)
|
|
self.assertAlmostEqual(f, 16 / 365.0, places=5)
|
|
|
|
def test_unknown_convention_raises(self):
|
|
with self.assertRaises(ValueError):
|
|
prorate_factor(
|
|
period_start=date(2026, 1, 1),
|
|
period_end=date(2026, 1, 31),
|
|
asset_start=date(2026, 1, 15),
|
|
convention='bogus', # type: ignore[arg-type]
|
|
)
|