import random import string from app.services.repayment import RepaymentService from app.services.loan import LoanService from app.helpers.response_helper import ResponseHelper from app.utils.logger import logger from decimal import Decimal, ROUND_HALF_UP from app.services.loan_repayment_schedule import LoanRepaymentScheduleService from app.enums.loan_status import LoanStatus class CollectLoanHelper: @staticmethod def _validate_repayment_and_loan(data): repayment = RepaymentService.get_repayment_by_id(id=data['Id']) if not repayment: logger.info(f"Repayment id: {data['Id']}, was not found") return None, None, ResponseHelper.error("Repayment not found") repayment_data = repayment.to_dict() loan = LoanService.get_loan_by_loan_id(loan_id=int(repayment_data['loanId'])) if not loan: logger.info(f"Loan id: {repayment_data['loanId']}, was not found") return None, None, ResponseHelper.error("Loan not found") loan return repayment_data, loan, None @staticmethod def _build_collect_loan_payload(loan_data, repayment_data, data, collectionMethod): debtId = str(loan_data.get('debtId', "")).strip().zfill(6) t_id = ''.join(random.choices(string.ascii_uppercase, k=22)) return { "transactionId": t_id, "fbnTransactionId": loan_data['transactionId'], "debtId": debtId, "customerId": repayment_data['customerId'], "accountId": loan_data['accountId'], "productId": repayment_data['productId'], "collectAmount": ( data['overdueLoanScheduleAmount'] if data.get('overdueLoanScheduleAmount') is not None else loan_data.get('balance', 0) ), "penalCharge": 0, "channel": "USSD", "collectionMethod": collectionMethod, "lienAmount": 0, "countryId": "NG", "comment": "COLLECT LOAN" }