[add]: Update loan status after repayment

This commit was merged in pull request #6.
This commit is contained in:
VivianDee
2025-04-10 18:35:26 +01:00
parent 1081467f6f
commit e5320c075e
6 changed files with 45 additions and 9 deletions
+2 -1
View File
@@ -1 +1,2 @@
from .transaction_type import TransactionType from .transaction_type import TransactionType
from .loan_status import LoanStatus
+6
View File
@@ -0,0 +1,6 @@
from enum import Enum
class LoanStatus(str, Enum):
PENDING = "pending"
ACTIVE = "active"
REPAID = "repaid"
+2 -2
View File
@@ -7,7 +7,7 @@ from app.utils.logger import logger
from app.api.schemas.provide_loan import ProvideLoanSchema from app.api.schemas.provide_loan import ProvideLoanSchema
from threading import Thread from threading import Thread
from app.models.loan import Loan from app.models.loan import Loan
from app.api.enums import LoanStatus
class ProvideLoanService(BaseService): class ProvideLoanService(BaseService):
TRANSACTION_TYPE = TransactionType.PROVIDE_LOAN TRANSACTION_TYPE = TransactionType.PROVIDE_LOAN
@@ -39,7 +39,7 @@ class ProvideLoanService(BaseService):
account_id=account_id, account_id=account_id,
offer_id=validated_data.get('offerId'), offer_id=validated_data.get('offerId'),
principal_amount=validated_data.get('requestedAmount'), principal_amount=validated_data.get('requestedAmount'),
status="active" status=LoanStatus.ACTIVE
) )
if not loan: if not loan:
+7 -1
View File
@@ -1,6 +1,8 @@
from flask import request, jsonify from flask import request, jsonify
from marshmallow import ValidationError from marshmallow import ValidationError
from app.api.enums.loan_status import LoanStatus
from app.models import Repayment from app.models import Repayment
from app.models.loan import Loan
from app.utils.logger import logger from app.utils.logger import logger
from app.api.schemas.repayment import RepaymentSchema from app.api.schemas.repayment import RepaymentSchema
from app.api.services.base_service import BaseService from app.api.services.base_service import BaseService
@@ -28,6 +30,7 @@ class RepaymentService(BaseService):
account = customer.accounts[0] account = customer.accounts[0]
validated_data['accountId'] = account.id validated_data['accountId'] = account.id
request_id = validated_data.get('requestId') request_id = validated_data.get('requestId')
loan_id = validated_data.get('debtId')
if (RepaymentService.validate_account_ownership(account_id = account.id, customer_id = customer_id)): if (RepaymentService.validate_account_ownership(account_id = account.id, customer_id = customer_id)):
@@ -35,7 +38,7 @@ class RepaymentService(BaseService):
# Save the repayment details # Save the repayment details
repayment = Repayment.create_repayment( repayment = Repayment.create_repayment(
customer_id = customer_id, customer_id = customer_id,
loan_id = validated_data.get('debtId'), loan_id = loan_id,
product_id = validated_data.get('productId') product_id = validated_data.get('productId')
) )
@@ -46,6 +49,9 @@ class RepaymentService(BaseService):
"message": "Failed to save repayment details." "message": "Failed to save repayment details."
}), 400 }), 400
#Update Loan status
Loan.update_status(loan_id = loan_id, status = LoanStatus.REPAID)
transaction = RepaymentService.log_transaction(validated_data = validated_data) transaction = RepaymentService.log_transaction(validated_data = validated_data)
if not transaction: if not transaction:
+22 -3
View File
@@ -65,16 +65,35 @@ class Loan(db.Model):
return False return False
return True return True
@classmethod @classmethod
def get_customer_loan(cls, loan_id, customer_id): def get_customer_loan(cls, loan_id, customer_id):
""" """
Check if a loan with the given ID exists and if the loan belongs to the specified customer_id. Get customer's active loans.
""" """
loan = cls.query.filter_by(id=loan_id, customer_id=customer_id).first() loan = cls.query.filter_by(id = loan_id, customer_id = customer_id).first()
if not loan: if not loan:
raise ValueError(f"Loan with ID {loan_id} does not exist or does not belong to customer {customer_id}.") raise ValueError(f"Loan with ID {loan_id} does not exist or does not belong to customer {customer_id}.")
return loan return loan
@classmethod
def update_status(cls, loan_id, status):
"""
Update the status of the loan with the given loan_id.
"""
# Retrieve loan
loan = cls.query.get(loan_id)
if not loan:
raise ValueError(f"Loan with ID {loan_id} does not exist.")
if loan.status == status:
return
# Update loan status and the updated_at timestamp
loan.status = status
db.session.commit()
def __repr__(self): def __repr__(self):
return f'<Loan {self.id}>' return f'<Loan {self.id}>'
+6 -2
View File
@@ -1,4 +1,5 @@
from datetime import datetime, timezone from datetime import datetime, timezone
from app.api.enums.loan_status import LoanStatus
from app.extensions import db from app.extensions import db
from app.models.customer import Customer from app.models.customer import Customer
from app.models.loan import Loan from app.models.loan import Loan
@@ -29,8 +30,11 @@ class Repayment(db.Model):
# Check loan exists # Check loan exists
loan = Loan.get_customer_loan(loan_id = loan_id, customer_id = customer_id) loan = Loan.get_customer_loan(loan_id = loan_id, customer_id = customer_id)
if not loan:
raise ValueError("Loan not found for customer") # Check that the loan is active
if loan.status != LoanStatus.ACTIVE:
raise ValueError(f"Repayment cannot be processed. Loan status: ({loan.status})")
repayment = cls( repayment = cls(
customer_id=customer_id, customer_id=customer_id,