[update]: repayment schedule table
This commit is contained in:
@@ -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:
|
||||||
|
|||||||
@@ -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 ###
|
||||||
Reference in New Issue
Block a user