From 798d264748c1382aeb9f20d1fc50d54425d0aa25 Mon Sep 17 00:00:00 2001 From: "CHIEFSOFT\\ameye" Date: Mon, 3 Nov 2025 12:47:17 -0500 Subject: [PATCH] Handle duplicate repayment attempts --- app/api/services/repayment.py | 2 +- app/models/transaction.py | 28 +++++++++++++++++----------- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/app/api/services/repayment.py b/app/api/services/repayment.py index daf1c47..c3e5d4f 100644 --- a/app/api/services/repayment.py +++ b/app/api/services/repayment.py @@ -57,7 +57,7 @@ class RepaymentService(BaseService): return ResponseHelper.error(result_description="Failed to save repayment details.") #Update Loan status - Loan.update_status(loan_id = loan_id, status = LoanStatus.START_REPAY) # repay started bu user + Loan.update_status(loan_id = loan_id, status = LoanStatus.START_REPAY) # repay started by user transaction = RepaymentService.log_transaction(validated_data = validated_data) if not transaction: diff --git a/app/models/transaction.py b/app/models/transaction.py index 5a6db18..9c9a32d 100644 --- a/app/models/transaction.py +++ b/app/models/transaction.py @@ -4,6 +4,8 @@ from app.models import account from sqlalchemy.exc import IntegrityError from sqlalchemy import and_, or_, not_ from sqlalchemy.sql import func +from app.api.enums import TransactionType + class Transaction(db.Model): __tablename__ = 'transactions' @@ -20,7 +22,7 @@ class Transaction(db.Model): phone_number = db.Column(db.String(50), nullable=True) created_at = db.Column(db.DateTime(timezone=True), server_default=func.now()) updated_at = db.Column(db.DateTime(timezone=True), server_default=func.now(), onupdate=func.now()) - + def __repr__(self): return f'' @@ -30,17 +32,21 @@ class Transaction(db.Model): # if cls.query.filter_by(transaction_id=transaction_id).first(): # raise ValueError("Duplicate Transaction") - if cls.query.filter( and_( cls.transaction_id ==transaction_id, cls.type==type) ).first(): - raise ValueError("Duplicate Transaction") - - + if cls.query.filter(and_(cls.transaction_id == transaction_id, cls.type == type)).first(): + if type == TransactionType.REPAYMENT: + logger.info('Repayment transaction already exists :::: But we like to continue.') + now = datetime.now() + type = TransactionType.REPAYMENT + '.'+ now.strftime("%Y%m%d%H%M%S") + logger.info('Modify Type :::: {0}'.format(type)) + else: + raise ValueError("Duplicate Transaction") transaction = cls( - transaction_id = transaction_id, - customer_id = customer_id, - account_id = account_id, - type = type, - channel = channel, + transaction_id=transaction_id, + customer_id=customer_id, + account_id=account_id, + type=type, + channel=channel, created_at=datetime.now(timezone.utc), updated_at=datetime.now(timezone.utc) ) @@ -54,4 +60,4 @@ class Transaction(db.Model): @classmethod def get_transaction_by_id(cls, transaction_id): - return cls.query.get(transaction_id) \ No newline at end of file + return cls.query.get(transaction_id)