From 877b50ef8802f8b59d81ccabcab22fe185e898d7 Mon Sep 17 00:00:00 2001 From: xengineering Date: Wed, 4 Sep 2024 20:56:03 +0200 Subject: Rename income to flow Modeling income and expenses separately does not make sense since the only difference is the sign of the amount. Separate definitions would lead to a lot of duplicated code. --- finance/flow.py | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 finance/flow.py (limited to 'finance/flow.py') diff --git a/finance/flow.py b/finance/flow.py new file mode 100644 index 0000000..fb28228 --- /dev/null +++ b/finance/flow.py @@ -0,0 +1,33 @@ +import dataclasses +from datetime import datetime +from decimal import Decimal + + +@dataclasses.dataclass(kw_only=True, frozen=True) +class Flow: + """Time-discrete flow of money paid on the first day of a month""" + + amount: Decimal + + def integrate(self, start: datetime, end: datetime) -> Decimal: + """Integrate the flow between two dates to an amount of money""" + + retval = Decimal(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 -- cgit v1.2.3-70-g09d2