[add]: Update loan status after repayment
This commit was merged in pull request #6.
This commit is contained in:
@@ -1 +1,2 @@
|
|||||||
from .transaction_type import TransactionType
|
from .transaction_type import TransactionType
|
||||||
|
from .loan_status import LoanStatus
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
from enum import Enum
|
||||||
|
|
||||||
|
class LoanStatus(str, Enum):
|
||||||
|
PENDING = "pending"
|
||||||
|
ACTIVE = "active"
|
||||||
|
REPAID = "repaid"
|
||||||
@@ -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:
|
||||||
|
|||||||
@@ -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
@@ -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}>'
|
||||||
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user