import dataclasses from datetime import datetime from decimal import Decimal @dataclasses.dataclass(kw_only=True, frozen=True) class Income: """Income models financial income paid on the first day of a month""" amount: Decimal def integrate(self, start: datetime, end: datetime) -> Decimal: """Integrate the income from a start to an end date""" 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