diff options
author | xengineering <me@xengineering.eu> | 2024-09-03 21:34:08 +0200 |
---|---|---|
committer | xengineering <me@xengineering.eu> | 2024-09-08 17:21:32 +0200 |
commit | 4f3d4de3796744ee1d6d0e91e8bec76e0487de90 (patch) | |
tree | 2bf795e09fa051c66916011657dea31cfb1d8338 | |
parent | b0b34adbd86fc778923a766273c145cc657918cd (diff) | |
download | finance-py-4f3d4de3796744ee1d6d0e91e8bec76e0487de90.tar finance-py-4f3d4de3796744ee1d6d0e91e8bec76e0487de90.tar.zst finance-py-4f3d4de3796744ee1d6d0e91e8bec76e0487de90.zip |
finance: Use datetime for Income.integrate()
Time-based Integration in general is done between two time stamps. For
the financial context it makes sense to use Python's datetime.datetime
class for this purpose.
This commit implements integrating an income between two
datetime.datetime time stamps.
-rw-r--r-- | finance/income.py | 26 | ||||
-rw-r--r-- | finance/test_income.py | 13 |
2 files changed, 36 insertions, 3 deletions
diff --git a/finance/income.py b/finance/income.py index 12d5d4e..94759ff 100644 --- a/finance/income.py +++ b/finance/income.py @@ -1,10 +1,32 @@ import dataclasses +from datetime import datetime @dataclasses.dataclass(kw_only=True, frozen=True) class Income: + """Income models financial income paid on the first day of a month""" amount: float - def integrate(self, delta_t: int) -> float: - return delta_t * self.amount + def integrate(self, start: datetime, end: datetime) -> float: + """Integrate the income from a start to an end date""" + + retval = 0.0 + + current = datetime(start.year, start.month, 1) + + if start == current: + retval += self.amount + + while True: + if current.month == 12: + current = datetime(current.year + 1, 1, 1) + else: + current = datetime(current.year, current.month + 1, 1) + + if current <= end: + retval += self.amount + else: + break + + return retval diff --git a/finance/test_income.py b/finance/test_income.py index 21d42f7..0ce3507 100644 --- a/finance/test_income.py +++ b/finance/test_income.py @@ -1,6 +1,17 @@ +from datetime import datetime + from finance import income def test_income_integration() -> None: inc = income.Income(amount=3000.0) - assert inc.integrate(5) == 15000.0 + + tests = ( + (datetime(2024, 3, 12), datetime(2024, 4, 2), 3000.0), + (datetime(2024, 3, 1), datetime(2024, 3, 15), 3000.0), + (datetime(2024, 2, 25), datetime(2024, 3, 1), 3000.0), + (datetime(2024, 2, 25), datetime(2024, 6, 12), 12000.0), + ) + + for test in tests: + assert inc.integrate(start=test[0], end=test[1]) == test[2] |