diff --git a/src/amort.py b/src/amort.py index 209f7ef..f4720c1 100644 --- a/src/amort.py +++ b/src/amort.py @@ -81,6 +81,26 @@ def compare(with_extra_payments, without): print(chr(916), "principal paid: ", round(abs(z-c),2)) print(chr(916), "term (months): ", term_length) +def whatif(events, x = 500, terms = 120): + """ + What if I paid an extra x dollars each term. + Parameters: + x = amount to pay + terms = total expected terms + """ + key_list = "extra-payments" + key_attr1 = "payment-number" + key_attr2 = "amount" + # get the last payment number from events + latest = events[key_list][-1][key_attr1] + start = latest + 1 + for i in range(start, 120): + new_event = dict() + new_event[key_attr1] = i + new_event[key_attr2] = x + events[key_list].append(new_event) + return events, start + def display(table): print("id, due, interest payment, principal payment, remaining") for row in table: @@ -94,7 +114,7 @@ def export(table, filename="schedule.csv"): print("wrote to file", filename) if __name__ == "__main__": - import argparse, json + import argparse, json, copy def get_arguments(): p = argparse.ArgumentParser() @@ -117,29 +137,47 @@ if __name__ == "__main__": l["extra-payments"].append(json.loads(args.one_time)) return args.principal, args.interest_rate, args.term, l + def main(): + principal, interest_rate, loan_term, events = get_arguments() - 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)) - print("total interest paid: ", round(interest_paid,2)) - print("total principal paid: ", round(principal_paid,2)) - - # without extra payments for comparison - compare(schedule, generate_amortization_schedule( - principal, interest_rate, loan_term) - ) - print() - + wi_start = 0 + wi_x = 500 + if events: + # the amount paid ahead canonically + ahead_paid = sum(pay["amount"] for pay in events["extra-payments"]) + ahead_msg = f"total extra payments: {ahead_paid}" + border = "~" * len(ahead_msg) + print(border) + print(ahead_msg) + print(border) + events, wi_start = whatif(events, x=wi_x) + # generate the schedule + schedule = generate_amortization_schedule( + principal, interest_rate, loan_term, copy.deepcopy(events) + ) + paid, interest_paid, principal_paid = get_totals(schedule,export) + # report on schedule + print("total paid: ", round(paid,2)) + print("total interest paid: ", round(interest_paid,2)) + print("total principal paid: ", round(principal_paid,2)) + # get the last term of the schedule + if events: + wi_end = schedule[-1]["Payment Number"] + wi_paid = sum( + pay["amount"] for pay in \ + events["extra-payments"][wi_start:wi_end] + ) + wi_msg = f"total if {wi_x} was also paid each term: {wi_paid}" + border = '~' * len(wi_msg) + print(border) + print(wi_msg) + print(border) + # without extra payments for comparison + compare(schedule, generate_amortization_schedule( + principal, interest_rate, loan_term) + ) + print() + # with open("extra_payments.json") as f: + # e = json.load(f) + # print(whatif(e)) + main()