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
Exemple #2
0
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"
Exemple #5
0
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"