summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--finance/income.py26
-rw-r--r--finance/test_income.py13
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]