Как реализовать штраф в кредите
Я делаю кредитный 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, оставьте комментарий.