diff --git a/src/amort.py b/src/amort.py index 3adc389..209f7ef 100644 --- a/src/amort.py +++ b/src/amort.py @@ -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()