def _calculate(start_date, end_date, credit, interest, payments={}): start_date = get_date(start_date) end_date = get_date(end_date) credit = Decimal(credit) payments = {get_date(date): Decimal(payment) for date, payment in payments.items()} schedule = [] prev_date = start_date cur_month_pay = month_pay = None for date, month_interest in _iter_month_interest(start_date, end_date, interest): if month_pay is None or cur_month_pay != month_pay: month_pay = _get_month_pay(prev_date, end_date, credit, interest) cur_month_pay = payments.pop(date, month_pay) if cur_month_pay < month_pay: raise InvalidPaymentError("Invalid payment for {}.", format_date(date)) interest_pay = _round_payment(credit * month_interest) credit_pay = cur_month_pay - interest_pay credit -= credit_pay schedule.append(Payment(date, credit_pay, interest_pay, cur_month_pay, credit)) prev_date = date if payments: raise InvalidPaymentDateError("Invalid payment date: {}.", format_date(payments.popitem()[0])) if credit: payment = schedule[-1] schedule[-1] = Payment(payment.date, payment.credit_pay + credit, interest_pay, payment.month_pay + credit, 0) return schedule
def print_payment_schedule(credits): for credit in credits: table = Table([ Column("date", "Date", align=Column.ALIGN_CENTER ), Column("credit_pay", "Credit pay", ), Column("interest_pay", "Interest pay" ), Column("total", "Total" ), Column("credit", "Credit" ), ]) total_payments = 0 for payment in credit.schedule: table.add_row({ "date": format_date(payment.date), "credit_pay": payment.credit_pay, "interest_pay": payment.interest_pay, "total": payment.month_pay, "credit": payment.credit, }) total_payments += payment.month_pay table.add_row({}) table.add_row({ "total": total_payments }) table.draw("\n\nPayment schedule for {} credit from {}:".format( credit.amount, format_date(credit.start_date)))
def _calculate(start_date, end_date, credit, interest, payments={}): start_date = get_date(start_date) end_date = get_date(end_date) credit = Decimal(credit) payments = { get_date(date): Decimal(payment) for date, payment in payments.items() } schedule = [] prev_date = start_date cur_month_pay = month_pay = None for date, month_interest in _iter_month_interest(start_date, end_date, interest): if month_pay is None or cur_month_pay != month_pay: month_pay = _get_month_pay(prev_date, end_date, credit, interest) cur_month_pay = payments.pop(date, month_pay) if cur_month_pay < month_pay: raise InvalidPaymentError("Invalid payment for {}.", format_date(date)) interest_pay = _round_payment(credit * month_interest) credit_pay = cur_month_pay - interest_pay credit -= credit_pay schedule.append( Payment(date, credit_pay, interest_pay, cur_month_pay, credit)) prev_date = date if payments: raise InvalidPaymentDateError("Invalid payment date: {}.", format_date(payments.popitem()[0])) if credit: payment = schedule[-1] schedule[-1] = Payment(payment.date, payment.credit_pay + credit, interest_pay, payment.month_pay + credit, 0) return schedule
def test_format_date(): assert format_date(Date(2013, 3, 2)) == "02.03.2013"
def print_credits(credits, print_all, with_schedule): if not credits: print("No credits specified.") return today = datetime.date.today() credits = sorted(( calculator.get_credit_info(today, **credit) for credit in credits if print_all or credit["end_date"] >= today), key=lambda credit: credit.end_date) if not credits: print("There are no active credits.") return table = Table([ Column("start_date", "Open date", align=Column.ALIGN_CENTER ), Column("end_date", "Close date", align=Column.ALIGN_CENTER ), Column("amount", "Amount" ), Column("interest", "Interest" ), Column("current_amount", "Current amount", ), Column("month_pay", "Month pay", hide_if_empty=True), Column("closed", "Closed", align=Column.ALIGN_CENTER, hide_if_empty=True), ]) total_amount = 0 total_month_pay = 0 for credit in credits: closed = credit.end_date < today if not closed: total_amount += credit.current_amount if credit.month_pay is not None: total_month_pay += credit.month_pay table.add_row({ "start_date": format_date(credit.start_date), "end_date": format_date(credit.end_date), "amount": credit.amount, "interest": credit.interest, "current_amount": credit.current_amount, "month_pay": "" if credit.month_pay is None else credit.month_pay, "closed": "✓" if closed else "", }) if len(table.rows) > 1: total_row = {} if total_amount: total_row["current_amount"] = total_amount if total_month_pay: total_row["month_pay"] = total_month_pay if total_row: table.add_rows([{}, total_row]) table.draw() if with_schedule: print_payment_schedule(credits)
def test_format_date(): assert format_date(Date(2013, 3, 2)) == "02.03.2013"