Как реализовать штраф в кредите

Я делаю кредитный api в django rest framwork

может кто-нибудь подсказать, как мне реализовать функцию штрафа

?

вот как работает наказание

<

например я беру кредит в размере 50 000 на 8-23-2022 г. 11-23-2022 я начислю пени в размере 1% на оставшуюся сумму. затем к следующему месяцу 12-23-2022, если кредит не будет полностью погашен, снова начисляются пени в размере 1%

это моя модель для кредита

class Loan(models.Model):
     user = models.ForeignKey(User, on_delete=models.CASCADE)
     loan_amount = models.IntegerField()
     date = models.DateField(auto_now_add=True)

и это модель для платежей

class LoanPayment(models.Model):
     loan = models.ForeignKey(Loan, on_delete=models.CASCADE)
     payment_amount = models.IntegerField()
     date = models.DateField(auto_now_add=True)

Вы должны сначала решить эту проблему с помощью математических расчетов. Теоретически вы можете вычислить общий баланс на произвольную дату, учитывая кредит и все платежи, и вот как.

Если я взял кредит ($50000 @8-23-2022) и никогда его не выплачивал, то общий баланс на дату_n будет:

balance = 50000 * 1.01 ^ nom

где nom - количество месяцев после 11-23-2022, и может быть определено по:

nom = round_up( (date_n - 11-23-2022) / 30 )

(предполагается, что 1 месяц равен 30 дням, а ном неотрицателен)

Теперь рассматриваем любой платеж на дату_i с суммой_i. Помимо уменьшения общего баланса на сумму_i, он также уменьшает предстоящий штраф аналогично кредиту. Например, если я сделал платеж ($10000 @9-23-2022), он уменьшает общий штраф на $10000 * 1% = $100 на 11-23-2022, и еще ($10000 + $100) * 1% = $101 на 12-23-2022. Таким образом, общий баланс на 12-24-2022 должен быть:

50000 * 1.01 ^ 2 - 10000 * 1.01 ^ 2 = 40804

В общем случае, для платежа, совершенного в дату_i с суммой_i, на дату_n, его вклад в общий баланс составляет:

contrib_i = -amount_i * 1.01 ^ nom_i

Здесь nom_i (количество месяцев) немного запутанно. Интуитивно это количество месяцев после первой штрафной даты после даты_i:

first_penalty_date = round_up( (date_i - 11-23-2022) / 30 ) * 30 + 11-23-2022

и nom_i должно быть:

nom_i = round_up( (date_n - first_penalty_date) / 30 )

Если сложить все вместе и посмотреть в уравнение, то окажется, что оно представляет собой общее количество месяцев, минус количество штрафных месяцев, пропущенных по платежу:

nom_i = nom - round_up( (date_i - 11-23-2022) / 30 )

(возможно, это звучит еще сложнее, но это упрощает кодирование)

Затем общий баланс:

balance = loan_amount * 1.01 ^ nom - sum( amount_i * 1.01 ^ nom_i ) over payments

Выше приведена идея, как можно реализовать функцию штрафа. Если вам нужна дополнительная помощь в том, как добиться этого в Django, оставьте комментарий.

Вернуться на верх