Merge branch 'loan_reference' of DigiFi/digifi-BankToProductCore into master
This commit is contained in:
@@ -10,3 +10,4 @@ class RepaymentSchema(Schema):
|
|||||||
accountId = fields.Str(required=True)
|
accountId = fields.Str(required=True)
|
||||||
customerId = fields.Str(required=True)
|
customerId = fields.Str(required=True)
|
||||||
channel = fields.Str(required=True)
|
channel = fields.Str(required=True)
|
||||||
|
initiatedBy = fields.Str(required=False)
|
||||||
|
|||||||
@@ -30,8 +30,10 @@ class LoanStatusService(BaseService):
|
|||||||
validated_data = LoanStatusService.validate_data(data, LoanStatusSchema())
|
validated_data = LoanStatusService.validate_data(data, LoanStatusSchema())
|
||||||
|
|
||||||
customer_id = validated_data.get('customerId')
|
customer_id = validated_data.get('customerId')
|
||||||
|
|
||||||
logger.info(f"Looking for customer *** {customer_id}")
|
logger.info(f"Looking for customer *** {customer_id}")
|
||||||
customer = Customer.get_customer_with_loan_list(customer_id)
|
customer = Customer.get_customer_with_loan_list(customer_id)
|
||||||
|
|
||||||
transactionId = validated_data.get('transactionId')
|
transactionId = validated_data.get('transactionId')
|
||||||
account_id = validated_data.get('accountId')
|
account_id = validated_data.get('accountId')
|
||||||
|
|
||||||
|
|||||||
@@ -109,6 +109,9 @@ class ProvideLoanService(BaseService):
|
|||||||
insurance = charges["insurance"]
|
insurance = charges["insurance"]
|
||||||
vat = charges["vat"]
|
vat = charges["vat"]
|
||||||
|
|
||||||
|
padded_id = str(transaction_id).zfill(12)
|
||||||
|
loan_ref = f"{padded_id}{channel}{offer.product_id}"
|
||||||
|
|
||||||
|
|
||||||
# Save the loan details
|
# Save the loan details
|
||||||
loan = Loan.create_loan(
|
loan = Loan.create_loan(
|
||||||
@@ -126,6 +129,7 @@ class ProvideLoanService(BaseService):
|
|||||||
eligible_amount=eligible_amount,
|
eligible_amount=eligible_amount,
|
||||||
status = LoanStatus.ACTIVE,
|
status = LoanStatus.ACTIVE,
|
||||||
tenor = offer.tenor,
|
tenor = offer.tenor,
|
||||||
|
reference = loan_ref
|
||||||
)
|
)
|
||||||
|
|
||||||
if not loan:
|
if not loan:
|
||||||
@@ -155,14 +159,12 @@ class ProvideLoanService(BaseService):
|
|||||||
else:
|
else:
|
||||||
return ResponseHelper.error(result_description="Invalid Customer or Account")
|
return ResponseHelper.error(result_description="Invalid Customer or Account")
|
||||||
|
|
||||||
padded_id = str(transaction_id).zfill(12)
|
|
||||||
loanref = f"{padded_id}{channel}{offer.product_id}"
|
|
||||||
|
|
||||||
|
|
||||||
response_data = {
|
response_data = {
|
||||||
"requestId": request_id,
|
"requestId": request_id,
|
||||||
"transactionId": transaction_id,
|
"transactionId": transaction_id,
|
||||||
"loanRef": loanref,
|
"loanRef": loan_ref,
|
||||||
"customerId": customer_id,
|
"customerId": customer_id,
|
||||||
"accountId": account_id,
|
"accountId": account_id,
|
||||||
"msisdn": customer.msisdn
|
"msisdn": customer.msisdn
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ class RepaymentService(BaseService):
|
|||||||
account_id = validated_data.get('accountId')
|
account_id = validated_data.get('accountId')
|
||||||
customer = Customer.get_customer_with_loan_list(customer_id)
|
customer = Customer.get_customer_with_loan_list(customer_id)
|
||||||
transaction_id = validated_data.get('transactionId')
|
transaction_id = validated_data.get('transactionId')
|
||||||
|
initiated_by = validated_data.get('initiatedBy')
|
||||||
|
|
||||||
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)):
|
||||||
|
|
||||||
|
|||||||
@@ -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 app.models.customer import Customer
|
from app.models.customer import Customer
|
||||||
from app.models.account import Account
|
from app.models.account import Account
|
||||||
@@ -43,6 +44,7 @@ class Loan(db.Model):
|
|||||||
eligible_amount = db.Column(db.Float, nullable=True, default=0.0)
|
eligible_amount = db.Column(db.Float, nullable=True, default=0.0)
|
||||||
disburse_date = db.Column(db.DateTime, nullable=True)
|
disburse_date = db.Column(db.DateTime, nullable=True)
|
||||||
disburse_verify = db.Column(db.DateTime, nullable=True)
|
disburse_verify = db.Column(db.DateTime, nullable=True)
|
||||||
|
reference = db.Column(db.String(50), nullable=True)
|
||||||
|
|
||||||
customer = relationship(
|
customer = relationship(
|
||||||
"Customer",
|
"Customer",
|
||||||
@@ -82,6 +84,7 @@ class Loan(db.Model):
|
|||||||
installment_amount,
|
installment_amount,
|
||||||
tenor,
|
tenor,
|
||||||
eligible_amount,
|
eligible_amount,
|
||||||
|
reference,
|
||||||
status = "pending",
|
status = "pending",
|
||||||
):
|
):
|
||||||
# Check if customer exists
|
# Check if customer exists
|
||||||
@@ -110,6 +113,7 @@ class Loan(db.Model):
|
|||||||
tenor = tenor,
|
tenor = tenor,
|
||||||
status = status,
|
status = status,
|
||||||
eligible_amount =eligible_amount,
|
eligible_amount =eligible_amount,
|
||||||
|
reference = reference,
|
||||||
created_at=datetime.now(timezone.utc),
|
created_at=datetime.now(timezone.utc),
|
||||||
updated_at=datetime.now(timezone.utc)
|
updated_at=datetime.now(timezone.utc)
|
||||||
)
|
)
|
||||||
@@ -213,6 +217,9 @@ class Loan(db.Model):
|
|||||||
"""
|
"""
|
||||||
return {
|
return {
|
||||||
'debtId': self.id,
|
'debtId': self.id,
|
||||||
|
'transactionId': self.transaction_id,
|
||||||
|
'loanRef': self.reference,
|
||||||
|
'productId': self.product_id,
|
||||||
'initialLoanAmount': self.initial_loan_amount,
|
'initialLoanAmount': self.initial_loan_amount,
|
||||||
'currentLoanAmount': self.current_loan_amount,
|
'currentLoanAmount': self.current_loan_amount,
|
||||||
'defaultPenaltyFee': self.default_penalty_fee,
|
'defaultPenaltyFee': self.default_penalty_fee,
|
||||||
@@ -222,6 +229,7 @@ class Loan(db.Model):
|
|||||||
'repaymentAmount': self.repayment_amount,
|
'repaymentAmount': self.repayment_amount,
|
||||||
'installmentAmount': self.installment_amount,
|
'installmentAmount': self.installment_amount,
|
||||||
'status': self.status,
|
'status': self.status,
|
||||||
|
'tenor': self.tenor,
|
||||||
'dueDate': self.due_date.isoformat() if self.due_date else None,
|
'dueDate': self.due_date.isoformat() if self.due_date else None,
|
||||||
'loanDate': self.created_at.isoformat() if self.created_at else None,
|
'loanDate': self.created_at.isoformat() if self.created_at else None,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ class Repayment(db.Model):
|
|||||||
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)
|
||||||
|
|
||||||
# Check that the loan is active
|
# Check that the loan is active
|
||||||
if loan.status != LoanStatus.ACTIVE:
|
if loan.status not in [LoanStatus.ACTIVE, LoanStatus.START_REPAY]:
|
||||||
raise ValueError(f"Repayment cannot be processed. Loan status: ({loan.status})")
|
raise ValueError(f"Repayment cannot be processed. Loan status: ({loan.status})")
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,32 @@
|
|||||||
|
"""empty message
|
||||||
|
|
||||||
|
Revision ID: b3a5e10bc77e
|
||||||
|
Revises: e8dd9b841ad7
|
||||||
|
Create Date: 2025-05-27 01:52:48.538333
|
||||||
|
|
||||||
|
"""
|
||||||
|
from alembic import op
|
||||||
|
import sqlalchemy as sa
|
||||||
|
|
||||||
|
|
||||||
|
# revision identifiers, used by Alembic.
|
||||||
|
revision = 'b3a5e10bc77e'
|
||||||
|
down_revision = 'e8dd9b841ad7'
|
||||||
|
branch_labels = None
|
||||||
|
depends_on = None
|
||||||
|
|
||||||
|
|
||||||
|
def upgrade():
|
||||||
|
# ### commands auto generated by Alembic - please adjust! ###
|
||||||
|
with op.batch_alter_table('loans', schema=None) as batch_op:
|
||||||
|
batch_op.add_column(sa.Column('reference', sa.String(length=50), nullable=True))
|
||||||
|
|
||||||
|
# ### end Alembic commands ###
|
||||||
|
|
||||||
|
|
||||||
|
def downgrade():
|
||||||
|
# ### commands auto generated by Alembic - please adjust! ###
|
||||||
|
with op.batch_alter_table('loans', schema=None) as batch_op:
|
||||||
|
batch_op.drop_column('reference')
|
||||||
|
|
||||||
|
# ### end Alembic commands ###
|
||||||
Reference in New Issue
Block a user