[update]: repayment schedule table

This commit is contained in:
VivianDee
2025-04-25 16:04:44 +01:00
parent cf0502459b
commit 5d37ba30fb
3 changed files with 53 additions and 15 deletions
+2 -1
View File
@@ -71,6 +71,7 @@ class ProvideLoanService(BaseService):
upfront_fee = charges["upfront_payment"] upfront_fee = charges["upfront_payment"]
repayment_amount = charges["repayment_amount"] repayment_amount = charges["repayment_amount"]
installment_amount = charges["installment_amount"] installment_amount = charges["installment_amount"]
tenor = offer.tenor // 30 # Convert to months
@@ -97,7 +98,7 @@ class ProvideLoanService(BaseService):
db.session.flush() db.session.flush()
schedule = LoanRepaymentSchedule.add_repayment_schedule(loan = loan, Offer = offer, charges = charges) schedule = LoanRepaymentSchedule.add_repayment_schedule(loan = loan, tenor = tenor)
if not schedule: if not schedule:
+9 -14
View File
@@ -1,4 +1,5 @@
from datetime import datetime, timezone from datetime import datetime, timezone
from itertools import product
from app.extensions import db from app.extensions import db
from sqlalchemy.orm import relationship from sqlalchemy.orm import relationship
from dateutil.relativedelta import relativedelta from dateutil.relativedelta import relativedelta
@@ -8,13 +9,14 @@ class LoanRepaymentSchedule(db.Model):
id = db.Column(db.Integer, primary_key=True, autoincrement=True) id = db.Column(db.Integer, primary_key=True, autoincrement=True)
loan_id = db.Column(db.Integer, nullable=False) loan_id = db.Column(db.Integer, nullable=False)
product_id = db.Column(db.String(20), nullable=True)
installment_number = db.Column(db.Integer, nullable=False) installment_number = db.Column(db.Integer, nullable=False)
due_date = db.Column(db.DateTime, nullable=False) due_date = db.Column(db.DateTime, nullable=False)
principal_amount = db.Column(db.Float, default=0.0) installment_amount= db.Column(db.Float, default=0.0)
interest_amount = db.Column(db.Float, default=0.0) total_repayment_amount = db.Column(db.Float, default=0.0)
total_installment = db.Column(db.Float, default=0.0)
paid = db.Column(db.Boolean, default=False) paid = db.Column(db.Boolean, default=False)
paid_at = db.Column(db.DateTime, nullable=True) paid_at = db.Column(db.DateTime, nullable=True)
created_at = db.Column(db.DateTime, default=datetime.now(timezone.utc)) created_at = db.Column(db.DateTime, default=datetime.now(timezone.utc))
updated_at = db.Column(db.DateTime, default=datetime.now(timezone.utc), onupdate=datetime.now(timezone.utc)) updated_at = db.Column(db.DateTime, default=datetime.now(timezone.utc), onupdate=datetime.now(timezone.utc))
@@ -27,19 +29,12 @@ class LoanRepaymentSchedule(db.Model):
@classmethod @classmethod
def add_repayment_schedule(cls, loan, Offer, charges): def add_repayment_schedule(cls, loan, tenor):
""" """
Add repayment schedules for a given loan. Add repayment schedules for a given loan.
""" """
now = datetime.now(timezone.utc) now = datetime.now(timezone.utc)
schedules = [] schedules = []
interest_fee = charges["interest"]
tenor = Offer.tenor // 30
principal = loan.initial_loan_amount / tenor
interest = interest_fee["fee"] / tenor
for i in range(tenor): for i in range(tenor):
due_date = now + relativedelta(months=i + 1) due_date = now + relativedelta(months=i + 1)
@@ -47,9 +42,9 @@ class LoanRepaymentSchedule(db.Model):
loan_id=loan.id, loan_id=loan.id,
installment_number=i + 1, installment_number=i + 1,
due_date=due_date, due_date=due_date,
principal_amount=round(principal, 2), total_repayment_amount = round(loan.repayment_amount, 2),
interest_amount=round(interest, 2), installment_amount=round(loan.installment_amount, 2),
total_installment=round(loan.installment_amount, 2) product_id = loan.product_id
) )
db.session.add(schedule) db.session.add(schedule)
@@ -0,0 +1,42 @@
"""Migration on Fri Apr 25 15:01:00 UTC 2025
Revision ID: 2a45dd99c9cb
Revises: 2cf0c177ca02
Create Date: 2025-04-25 15:01:51.129681
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = '2a45dd99c9cb'
down_revision = '2cf0c177ca02'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
with op.batch_alter_table('loan_repayment_schedules', schema=None) as batch_op:
batch_op.add_column(sa.Column('product_id', sa.String(length=20), nullable=True))
batch_op.add_column(sa.Column('installment_amount', sa.Float(), nullable=True))
batch_op.add_column(sa.Column('total_repayment_amount', sa.Float(), nullable=True))
batch_op.drop_column('principal_amount')
batch_op.drop_column('interest_amount')
batch_op.drop_column('total_installment')
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
with op.batch_alter_table('loan_repayment_schedules', schema=None) as batch_op:
batch_op.add_column(sa.Column('total_installment', sa.DOUBLE_PRECISION(precision=53), autoincrement=False, nullable=True))
batch_op.add_column(sa.Column('interest_amount', sa.DOUBLE_PRECISION(precision=53), autoincrement=False, nullable=True))
batch_op.add_column(sa.Column('principal_amount', sa.DOUBLE_PRECISION(precision=53), autoincrement=False, nullable=True))
batch_op.drop_column('total_repayment_amount')
batch_op.drop_column('installment_amount')
batch_op.drop_column('product_id')
# ### end Alembic commands ###