From 11a239c67aa87cd5ee4ae525f3e788d8ae874e84 Mon Sep 17 00:00:00 2001 From: "CHIEFSOFT\\ameye" Date: Sat, 10 May 2025 20:08:27 -0400 Subject: [PATCH] Linked loan design --- app/api/integrations/simbrella.py | 2 +- app/api/services/eligibility_check.py | 2 +- app/api/services/offer_analysis.py | 57 ++++++++++++++++++++------- app/models/loan.py | 25 +++++++++--- 4 files changed, 64 insertions(+), 22 deletions(-) diff --git a/app/api/integrations/simbrella.py b/app/api/integrations/simbrella.py index 13c7922..e46210d 100644 --- a/app/api/integrations/simbrella.py +++ b/app/api/integrations/simbrella.py @@ -35,7 +35,7 @@ class SimbrellaIntegration: ], } - logger.info(f"This is PayLoad: {str(payload)}", exc_info=True) + # logger.info(f"This is PayLoad: {str(payload)}", exc_info=True) headers = { "Content-Type": "application/json", diff --git a/app/api/services/eligibility_check.py b/app/api/services/eligibility_check.py index 65b1c5b..263d9cb 100644 --- a/app/api/services/eligibility_check.py +++ b/app/api/services/eligibility_check.py @@ -87,7 +87,7 @@ class EligibilityCheckService(BaseService): transaction_id=transactionId, rac_check=rac_check, validated_data=validated_data, - customer=customer + customer_id=customer_id ) except ValueError as ve: logger.error(str(ve)) diff --git a/app/api/services/offer_analysis.py b/app/api/services/offer_analysis.py index ad417f1..d97cc7e 100644 --- a/app/api/services/offer_analysis.py +++ b/app/api/services/offer_analysis.py @@ -34,34 +34,63 @@ class OfferAnalysis: return transaction_offer, offer, eligible_amount, original_transaction @staticmethod - def decide_offer(transaction_id, rac_check, validated_data, customer): - + def decide_offer(transaction_id, rac_check, validated_data, customer_id): + eligible_offers = [] # if we have active offers - we have to feed off it + logger.info(f"LOOOOOOOOOOOOOOOOOO** {customer_id}") # we can now find the origin transactions # Find the last loan - it will have original_transaction - # last_customer_loan = Loan.get_customer_last_loan(customer.id) + last_customer_loan = Loan.get_customer_last_loan(customer_id) # logger.info(f"{last_customer_loan}") new_eligible_amount = 0 - # if last_customer_loan: - # original_transaction = last_customer_loan.original_transaction or last_customer_loan.transaction_id + if last_customer_loan: + original_transaction = last_customer_loan.original_transaction or last_customer_loan.transaction_id + logger.info(f"transaction_id |-| original_transaction === > {transaction_id} {original_transaction}") + original_loan = Loan.get_customer_original_loan(customer_id, original_transaction) + if original_loan is not None: + logger.info(f"original_loan === > {original_loan}") + logger.info(f"loan_offer_id === > {original_loan.offer_id}") - # real_eligible_amount = last_customer_loan.eligible_amount + original_offer_id = str(original_loan.offer_id[:5]) # The last part is str + transaction_offer_id = int(original_loan.offer_id[5:]) # The last part is int + original_transaction_offer = TransactionOffer.is_valid_transaction_offer(transaction_offer_id, customer_id, original_loan.product_id) - # active_loans = Loan.get_active_loans_by_original_transaction(original_transaction) + active_loans = Loan.get_active_loans_by_original_transaction(original_transaction) + sum_active_loans = sum(loan.current_loan_amount for loan in active_loans) + logger.info(f"sum_active_loans === > {sum_active_loans}") + real_eligible_amount = original_loan.eligible_amount - sum_active_loans - # sum_active_loans = sum(loan.current_loan_amount for loan in active_loans) - - # new_eligible_amount = max(real_eligible_amount - sum_active_loans, 0) + transaction_offer = TransactionOffer.create_transaction_offer( + customer_id=customer_id, + transaction_id=transaction_id, + original_transaction=original_transaction, + offer_id=original_offer_id, + min_amount=original_transaction_offer.min_amount, + max_amount=original_transaction_offer.max_amount, + eligible_amount=real_eligible_amount, + product_id=original_loan.product_id, + tenor=original_loan.tenor + ) - # logger.info(f"Real eligible: {real_eligible_amount}, Sum of active: {sum_active_loans}, New eligible: {new_eligible_amount}") + # Visible offer ID: offer_id + padded(transaction_offer.id) + padded_id = str(transaction_offer.id).zfill(6) + public_offer_id = f"{original_offer_id}{padded_id}" + + eligible_offers.append({ + "offerId": public_offer_id, + "product_id": original_transaction_offer.product_id, + "min_amount": original_transaction_offer.min_amount, + "max_amount": real_eligible_amount, + "tenor": original_loan.tenor + }) + return eligible_offers - # Construct eligible_offers offers = Offer.get_all_offers() - eligible_offers = [] + for offer in offers: # Get approved amount @@ -71,7 +100,7 @@ class OfferAnalysis: approved_amount = round(approved_amount, 2) transaction_offer = TransactionOffer.create_transaction_offer( - customer_id=customer.id, + customer_id=customer_id, transaction_id=transaction_id, original_transaction=transaction_id, offer_id=offer.id, diff --git a/app/models/loan.py b/app/models/loan.py index 8d3613d..9309ae6 100644 --- a/app/models/loan.py +++ b/app/models/loan.py @@ -7,6 +7,8 @@ from sqlalchemy.orm import relationship from dateutil.relativedelta import relativedelta from datetime import timedelta import logging +from sqlalchemy import and_, or_, not_ + logger = logging.getLogger(__name__) @@ -137,14 +139,27 @@ class Loan(db.Model): raise ValueError(f"Loan with ID {loan_id} does not exist or does not belong to customer {customer_id}.") return loan + @classmethod + def get_customer_original_loan(cls, customer_id, original_transaction): + """ + Get customer's original loan offer. + """ + original_loan = cls.query.filter(and_( cls.customer_id ==customer_id, cls.original_transaction==original_transaction, cls.transaction_id==original_transaction )).first() + if not original_loan: + return None + + logger.info(f" get_customer_original_loan ==>>>> {original_loan}") + return original_loan + @classmethod def get_customer_last_loan(cls, customer_id): """ Get customer's active loans. """ - logger.info(f"Find last loan for [customer_id] ==>>>> {customer_id}") - loan = cls.query.filter_by( customer_id = customer_id).first() - logger.info(f" Active Loan ==>>>> RESULT************************ AMEYE") + logger.info(f"get_customer_last_loan [customer_id] ==>>>> {customer_id}") + # loan = cls.query.filter_by( cls.customer_id == customer_id).first() + loan = cls.query.filter(and_( cls.customer_id ==customer_id, cls.status=='active')).first() + if not loan: loan = { "eligible_amount": 0, @@ -153,9 +168,7 @@ class Loan(db.Model): "transaction_id": "", "resultDescription": "No Active Loan" } - logger.info(f" Active Loan ==>>>> RESULT*********************") - logger.info(f" Active Loan ==>>>> {loan}") - + logger.info(f" get_customer_last_loan ==>>>> {loan}") return loan @classmethod