""" Controller for loan-related endpoints. """ from flask import Blueprint, request, jsonify from api.middleware import basic_auth_required from api.models import ( ProvideLoanRequest, ProvideLoanResponse, LoanInformationRequest, LoanInformationResponse, Loan ) from datetime import datetime, timedelta import logging # Configure logger logger = logging.getLogger(__name__) # Create blueprint loan_bp = Blueprint('loan', __name__) @loan_bp.route('/ProvideLoan', methods=['POST']) @basic_auth_required def provide_loan(): """ Endpoint to process loan provision requests. This method handles the request to provide a loan to a customer. Returns: JSON response with loan provision status """ try: # Parse and validate request data = request.get_json() if not data: return jsonify({ 'resultCode': '400', 'resultDescription': 'Invalid JSON payload' }), 400 # Validate required fields required_fields = ['$type', 'requestId', 'transactionId', 'customerId', 'accountId', 'productId', 'lienAmount', 'requestedAmount', 'collectionType', 'loanType', 'channel'] for field in required_fields: if field not in data: return jsonify({ 'resultCode': '422', 'resultDescription': f'Missing required field: {field}' }), 422 # Create request model req = ProvideLoanRequest.from_dict(data) # Process loan provision (this would connect to the business logic) # For demonstration, we'll return a mock response # Create response response = ProvideLoanResponse( requestId=req.requestId, transactionId=req.transactionId, customerId=req.customerId, accountId=req.accountId, resultCode="00", resultDescription="Loan provided successfully", msisdn=req.msisdn if hasattr(req, 'msisdn') else None ) logger.info(f"Processed loan provision for customer {req.customerId}") return jsonify(response.to_dict()) except Exception as e: logger.error(f"Error processing loan provision: {str(e)}") return jsonify({ 'resultCode': '500', 'resultDescription': 'Internal server error' }), 500 @loan_bp.route('/LoanInformation', methods=['POST']) @basic_auth_required def loan_information(): """ Endpoint to retrieve loan information. This method provides information about a customer's existing loans. Returns: JSON response with loan information """ try: # Parse and validate request data = request.get_json() if not data: return jsonify({ 'resultCode': '400', 'resultDescription': 'Invalid JSON payload' }), 400 # Validate required fields required_fields = ['$type', 'transactionId', 'customerId', 'channel'] for field in required_fields: if field not in data: return jsonify({ 'resultCode': '422', 'resultDescription': f'Missing required field: {field}' }), 422 # Create request model req = LoanInformationRequest.from_dict(data) # Process loan information request (this would connect to the business logic) # For demonstration, we'll return a mock response # Create sample loans now = datetime.now() loan_date = now - timedelta(days=15) due_date = now + timedelta(days=15) loans = [ Loan( debtId="123456789", loanDate=loan_date.strftime("%Y-%m-%d %H:%M:%S.%f")[:-3], dueDate=due_date.strftime("%Y-%m-%d %H:%M:%S.%f")[:-3], currentLoanAmount=8500.0, initialLoanAmount=10000.0, defaultFee=0.0, continiousFee=0.0, productId="101" ) ] # Create response response = LoanInformationResponse( customerId=req.customerId, loans=[loan.to_dict() for loan in loans], resultCode="00", resultDescription="Successful", totalDebtAmount=8500.0 ) logger.info(f"Processed loan information request for customer {req.customerId}") return jsonify(response.to_dict()) except Exception as e: logger.error(f"Error processing loan information request: {str(e)}") return jsonify({ 'resultCode': '500', 'resultDescription': 'Internal server error' }), 500