58 lines
1.4 KiB
Python
58 lines
1.4 KiB
Python
from datetime import datetime
|
|
from decimal import Decimal
|
|
|
|
from dateutil.relativedelta import relativedelta
|
|
|
|
|
|
def current_date():
|
|
return datetime.now().date()
|
|
|
|
|
|
def format_date(d):
|
|
return d.strftime("%d.%m.%Y")
|
|
|
|
|
|
def round_with_dec_places(number, places):
|
|
if number is None:
|
|
return None
|
|
dec_num = number if isinstance(number, Decimal) else Decimal(number)
|
|
return dec_num.quantize(Decimal(10) ** -places)
|
|
|
|
|
|
def format_price(number):
|
|
if number is None:
|
|
return None
|
|
return f"{round_with_dec_places(number, 2)}€"
|
|
|
|
|
|
def _count_rates(start, end, months_delta):
|
|
delta = relativedelta(months=months_delta)
|
|
count = 0
|
|
current = start
|
|
while current <= end:
|
|
count += 1
|
|
current += delta
|
|
return count
|
|
|
|
|
|
def get_transaction_progress(transaction):
|
|
if rec_months := transaction.recurring_months:
|
|
start = transaction.booking_date
|
|
current = current_date()
|
|
if end := transaction.not_recurring_after:
|
|
total = _count_rates(start, end, rec_months)
|
|
if current >= end:
|
|
paid = total
|
|
else:
|
|
paid = _count_rates(start, current, rec_months)
|
|
else:
|
|
total = None
|
|
paid = _count_rates(start, current, rec_months)
|
|
else:
|
|
total = 1
|
|
if transaction.booking_date < current_date():
|
|
paid = 1
|
|
else:
|
|
paid = 0
|
|
return total, paid
|