--- /dev/null
+from datetime import date, timedelta
+
+def interest_next_payment(last_pay_date,
+ last_pay_balance,
+ next_pay_date,
+ daily_interest):
+
+ diff = next_pay_date - last_pay_date
+ interval = diff.days
+
+ compounded = (1 + daily_interest) ** interval
+ newbal = last_pay_balance * compounded
+
+ return round(newbal - last_pay_balance, 2)
+
+# expect 55.22
+# print(interest_next_payment(date(2017,12,16),
+# 14219.26,
+# date(2018,1,12),
+# 0.0525/365.0))
+
+# expect 67.54
+# print(interest_next_payment(date(2018,1,12),
+# 13809.65,
+# date(2018,2,15),
+# 0.0525/365.0))
+
+
+def amortize_to_end(last_pay_date,
+ last_pay_balance,
+ pay_dates_monthly,
+ daily_interest):
+
+ # pay_dates_monthly in form:
+ # [(12,500.00),(28,200.00)]
+
+ payments = []
+
+ while last_pay_balance > 0:
+
+ closest_pay_date = None
+ closest_pay_amount = None
+ for one_pay_day, one_pay_amount in pay_dates_monthly:
+ one_pay_date = last_pay_date
+ while True:
+ one_pay_date += timedelta(1)
+ if one_pay_date.day == one_pay_day:
+ break
+
+ if closest_pay_date:
+ if one_pay_date < closest_pay_date:
+ closest_pay_date = one_pay_date
+ closest_pay_amount = one_pay_amount
+ else:
+ closest_pay_date = one_pay_date
+ closest_pay_amount = one_pay_amount
+
+ interest = interest_next_payment(last_pay_date,
+ last_pay_balance,
+ closest_pay_date,
+ daily_interest)
+ interest = round(interest,2)
+ last_pay_balance = last_pay_balance + interest - closest_pay_amount
+ last_pay_balance = round(last_pay_balance,2)
+
+ # last payment
+ if last_pay_balance < 0:
+ last_pay_balance = 0
+
+ payments.append((closest_pay_date,last_pay_balance,interest))
+ last_pay_date = closest_pay_date
+
+ return payments
+
+
+p = amortize_to_end(date(2017,12,16),
+ 14219.26,
+ [(12,500.00),(28,200.00)],
+ 0.0525/365.0)
+# print(p)
+
+import ledger
+
+j = ledger.read_journal("ledger")
+lbal = 0
+payment_date = None
+for post in j.query("reg Liabilities:Hyundai"):
+ lbal += post.amount
+ payment_date = post.xact.date
+ # print("Posting {}".format(post.amount))
+
+print("balance was {} on {}".format(lbal,payment_date))
+print(dir(lbal))
+p = amortize_to_end(payment_date,
+ -lbal.to_double(),
+ [(12,500.00),(28,200.00)],
+ 0.0525/365.0)
+print(p)