Displays total of extra payments made.

Changed 'paid'column, which represented the due for the term,
to 'due'.
This commit is contained in:
2025-07-18 22:35:36 -07:00
parent 2f5a76a92a
commit 14e784aa6c

View File

@@ -16,7 +16,8 @@ def generate_amortization_schedule(principal, interest_rate, loan_term, events=[
one_time_payment = None
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):
# Calculate interest for the current period
if remaining_balance == 0:
@@ -29,8 +30,8 @@ def generate_amortization_schedule(principal, interest_rate, loan_term, events=[
# Apply one-time payment if provided
if one_time_payment and payment_number == one_time_payment['payment-number']:
principal_payment += one_time_payment['amount']
if events != []:
one_time_payment = events.pop(0)
if events["extra-payments"] != []:
one_time_payment = events["extra-payments"].pop(0)
# Update remaining balance
remaining_balance -= principal_payment
@@ -57,8 +58,7 @@ def get_totals(amortization_schedule, func=None):
# Display the amortization schedule
messages = []
for payment in amortization_schedule:
# print(payment)
total_paid += payment["Payment Amount"]
# total_paid += payment["Payment Amount"]
total_interest_paid += payment["Interest Payment"]
total_principal_paid += payment["Principal Payment"]
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]))
if func is not None:
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):
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)
def display(table):
print("id, paid, interest payment, principal payment, remaining")
print("id, due, interest payment, principal payment, remaining")
for row in table:
print(row)
def export(table, filename="schedule.csv"):
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:
print(row, file=f)
print("wrote to file", filename)
@@ -111,17 +113,24 @@ if __name__ == "__main__":
if args.events is not None:
with open(args.events) as f:
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:
extra.append(json.loads(args.one_time))
return args.principal, args.interest_rate, args.term, extra
l["extra-payments"].append(json.loads(args.one_time))
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)
print("total paid: ", round(paid,2))
@@ -132,4 +141,5 @@ if __name__ == "__main__":
compare(schedule, generate_amortization_schedule(
principal, interest_rate, loan_term)
)
print()