added penal log #66

Merged
ameye merged 1 commits from test into master 2026-03-11 09:46:57 +00:00
2 changed files with 32 additions and 1 deletions
+1
View File
@@ -62,6 +62,7 @@ class Config:
)
OVERDUE_GRACE_PERIOD_DAYS = int(os.getenv("OVERDUE_GRACE_PERIOD_DAYS", 30))
OVERDUE_PROCESSING_LIST_LIMIT = int(os.getenv("OVERDUE_PROCESSING_LIST_LIMIT", 100))
PENAL_CHARGE_PERCENTAGE = os.getenv("PENAL_CHARGE_PERCENTAGE", 1)
BANK_CALL_API_TIME_OUT = os.getenv("BANK_CALL_API_TIME_OUT", 100)
+31 -1
View File
@@ -3,6 +3,7 @@ from app.extensions import db
from app.utils.logger import logger
from sqlalchemy.exc import SQLAlchemyError
from app.enums.repayment_schedule_status import RepaymentScheduleStatus
from app.config import settings
from decimal import Decimal, ROUND_HALF_UP
# from dateutil.relativedelta import relativedelta
@@ -299,14 +300,43 @@ class LoanRepaymentSchedule(db.Model):
"""
try:
schedule = cls.query.get(schedule_id)
if not schedule:
raise ValueError(f"Schedule with ID {schedule_id} does not exist.")
if schedule.due_process_count is None:
schedule.due_process_count = 0
schedule.due_process_count += 1
schedule.due_process_date = datetime.now(timezone.utc)
schedule.updated_at = datetime.now(timezone.utc)
now = datetime.now(timezone.utc)
# Calculate DPD
dpd = max((now.date() - schedule.due_date.date()).days, 0)
# Determine outstanding balance
if schedule.paid_status == RepaymentScheduleStatus.PARTIALLY_PAID and schedule.partial_balance:
outstanding_amount = Decimal(str(schedule.partial_balance))
else:
outstanding_amount = Decimal(str(schedule.installment_amount))
# Calculate penal charge (1% default if settings not set)
try:
penalty_rate = getattr(settings, "PENAL_CHARGE_PERCENTAGE", 1)/100
except:
penalty_rate = 0.01
penal_charge = (outstanding_amount * Decimal(str(penalty_rate))).quantize(
Decimal("0.01"), rounding=ROUND_HALF_UP
)
#new balance + penal charge
new_balance = outstanding_amount + penal_charge
db.session.commit()
logger.info(f"Updated due process date and count for schedule ID {schedule.id}")
logger.info(f"""Updated due process date and count for schedule ID {schedule.id},
amount due: {schedule.installment_amount},
outstanding amount: {outstanding_amount},
due process count: {schedule.due_process_count},
DPD: {dpd},
penal charge(1%): {penal_charge},
new balance(plus penal charge): {new_balance}
""")
except Exception as e:
db.session.rollback()