Displays total of extra payments made.
Changed 'paid'column, which represented the due for the term, to 'due'.
This commit is contained in:
42
src/amort.py
42
src/amort.py
@@ -16,7 +16,8 @@ def generate_amortization_schedule(principal, interest_rate, loan_term, events=[
|
|||||||
|
|
||||||
one_time_payment = None
|
one_time_payment = None
|
||||||
if events != []:
|
if events != []:
|
||||||
one_time_payment = events.pop(0)
|
one_time_payment = events["extra-payments"].pop(0)
|
||||||
|
|
||||||
for payment_number in range(1, num_payments + 1):
|
for payment_number in range(1, num_payments + 1):
|
||||||
# Calculate interest for the current period
|
# Calculate interest for the current period
|
||||||
if remaining_balance == 0:
|
if remaining_balance == 0:
|
||||||
@@ -29,8 +30,8 @@ def generate_amortization_schedule(principal, interest_rate, loan_term, events=[
|
|||||||
# Apply one-time payment if provided
|
# Apply one-time payment if provided
|
||||||
if one_time_payment and payment_number == one_time_payment['payment-number']:
|
if one_time_payment and payment_number == one_time_payment['payment-number']:
|
||||||
principal_payment += one_time_payment['amount']
|
principal_payment += one_time_payment['amount']
|
||||||
if events != []:
|
if events["extra-payments"] != []:
|
||||||
one_time_payment = events.pop(0)
|
one_time_payment = events["extra-payments"].pop(0)
|
||||||
# Update remaining balance
|
# Update remaining balance
|
||||||
remaining_balance -= principal_payment
|
remaining_balance -= principal_payment
|
||||||
|
|
||||||
@@ -57,8 +58,7 @@ def get_totals(amortization_schedule, func=None):
|
|||||||
# Display the amortization schedule
|
# Display the amortization schedule
|
||||||
messages = []
|
messages = []
|
||||||
for payment in amortization_schedule:
|
for payment in amortization_schedule:
|
||||||
# print(payment)
|
# total_paid += payment["Payment Amount"]
|
||||||
total_paid += payment["Payment Amount"]
|
|
||||||
total_interest_paid += payment["Interest Payment"]
|
total_interest_paid += payment["Interest Payment"]
|
||||||
total_principal_paid += payment["Principal Payment"]
|
total_principal_paid += payment["Principal Payment"]
|
||||||
if payment["Remaining Balance"] < 0:
|
if payment["Remaining Balance"] < 0:
|
||||||
@@ -68,7 +68,9 @@ def get_totals(amortization_schedule, func=None):
|
|||||||
messages.append("%s" % ", ".join([str(attr) for attr in attrs]))
|
messages.append("%s" % ", ".join([str(attr) for attr in attrs]))
|
||||||
if func is not None:
|
if func is not None:
|
||||||
func(messages)
|
func(messages)
|
||||||
return total_paid, total_interest_paid, total_principal_paid
|
return ((total_interest_paid + total_principal_paid),
|
||||||
|
total_interest_paid,
|
||||||
|
total_principal_paid)
|
||||||
|
|
||||||
def compare(with_extra_payments, without):
|
def compare(with_extra_payments, without):
|
||||||
x,y,z = get_totals(with_extra_payments)
|
x,y,z = get_totals(with_extra_payments)
|
||||||
@@ -80,13 +82,13 @@ def compare(with_extra_payments, without):
|
|||||||
print(chr(916), "term (months): ", term_length)
|
print(chr(916), "term (months): ", term_length)
|
||||||
|
|
||||||
def display(table):
|
def display(table):
|
||||||
print("id, paid, interest payment, principal payment, remaining")
|
print("id, due, interest payment, principal payment, remaining")
|
||||||
for row in table:
|
for row in table:
|
||||||
print(row)
|
print(row)
|
||||||
|
|
||||||
def export(table, filename="schedule.csv"):
|
def export(table, filename="schedule.csv"):
|
||||||
with open(filename, 'w') as f:
|
with open(filename, 'w') as f:
|
||||||
print("id, paid, interest payment, principal payment, remaining", file=f)
|
print("id, due, interest payment, principal payment, remaining", file=f)
|
||||||
for row in table:
|
for row in table:
|
||||||
print(row, file=f)
|
print(row, file=f)
|
||||||
print("wrote to file", filename)
|
print("wrote to file", filename)
|
||||||
@@ -111,17 +113,24 @@ if __name__ == "__main__":
|
|||||||
if args.events is not None:
|
if args.events is not None:
|
||||||
with open(args.events) as f:
|
with open(args.events) as f:
|
||||||
l = json.loads(f.read())
|
l = json.loads(f.read())
|
||||||
extra = []
|
|
||||||
if "extra-payments" in l:
|
|
||||||
extra = l["extra-payments"]
|
|
||||||
extra.sort(key=lambda k: k["payment-number"])
|
|
||||||
if args.one_time is not None:
|
if args.one_time is not None:
|
||||||
extra.append(json.loads(args.one_time))
|
l["extra-payments"].append(json.loads(args.one_time))
|
||||||
return args.principal, args.interest_rate, args.term, extra
|
return args.principal, args.interest_rate, args.term, l
|
||||||
|
|
||||||
principal, interest_rate, loan_term, extra_payments = get_arguments()
|
|
||||||
|
|
||||||
schedule = generate_amortization_schedule(principal, interest_rate, loan_term, extra_payments)
|
principal, interest_rate, loan_term, events = get_arguments()
|
||||||
|
|
||||||
|
if events != []:
|
||||||
|
ahead_paid = float()
|
||||||
|
for extra_payment in events["extra-payments"]:
|
||||||
|
ahead_paid += extra_payment["amount"]
|
||||||
|
print("~~~~~~~~~~~~~~~~~~~~~")
|
||||||
|
print("total ahead payments:", ahead_paid)
|
||||||
|
print("~~~~~~~~~~~~~~~~~~~~~")
|
||||||
|
|
||||||
|
schedule = generate_amortization_schedule(
|
||||||
|
principal, interest_rate, loan_term, events
|
||||||
|
)
|
||||||
paid, interest_paid, principal_paid = get_totals(schedule,export)
|
paid, interest_paid, principal_paid = get_totals(schedule,export)
|
||||||
|
|
||||||
print("total paid: ", round(paid,2))
|
print("total paid: ", round(paid,2))
|
||||||
@@ -132,4 +141,5 @@ if __name__ == "__main__":
|
|||||||
compare(schedule, generate_amortization_schedule(
|
compare(schedule, generate_amortization_schedule(
|
||||||
principal, interest_rate, loan_term)
|
principal, interest_rate, loan_term)
|
||||||
)
|
)
|
||||||
|
print()
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user