Files
2025-03-22 17:11:46 +01:00

92 lines
3.3 KiB
Python

"""
Controller for offer selection endpoints.
"""
from flask import Blueprint, request, jsonify
from app.middleware import basic_auth_required
from app.models import SelectOffersRequest, SelectOffersResponse, Offer
import logging
# Configure logger
logger = logging.getLogger(__name__)
# Create blueprint
offers_bp = Blueprint('offers', __name__)
@offers_bp.route('/SelectOffer', methods=['POST'])
@basic_auth_required
def select_offer():
"""
Endpoint to send the offer the customer selected to Simbrella.
This method processes the customer's selected offer and returns detailed offer information.
Returns:
JSON response with detailed offer 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 = ['requestId', 'transactionId', 'customerId', 'accountId',
'msisdn', 'requestedAmount', 'productid', '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 = SelectOffersRequest.from_dict(data)
# Process offer selection (this would connect to the business logic)
# For demonstration, we'll return a mock response
# Create sample offers
offers = [
Offer(
offerId="14451",
productId=req.productid,
amount=req.requestedAmount,
upfrontPayment=req.requestedAmount * 0.1, # 10% upfront
interestRate=3.0,
Interest=req.requestedAmount * 0.03, # 3% interest
ManagementRate=1.0,
ManagementFee=req.requestedAmount * 0.01, # 1% management fee
InsuranceRate=1.0,
InsuranceFee=req.requestedAmount * 0.01, # 1% insurance
VATRate=7.5,
VATamount=(req.requestedAmount * 0.01) * 0.075, # VAT on management fee
recommendedRepaymentDates=["2023-04-30", "2023-05-30", "2023-06-29"],
installmentAmount=req.requestedAmount * 1.05 / 3, # Split into 3 payments with 5% total fees
totalRepaymentAmount=req.requestedAmount * 1.05 # Total with 5% fees
)
]
# Create response
response = SelectOffersResponse(
requestId=req.requestId,
transactionId=req.transactionId,
customerId=req.customerId,
accountId=req.accountId,
offers=[offer.to_dict() for offer in offers],
resultCode="00",
resultDescription="Successful",
outstandingDebtAmount=0.0
)
logger.info(f"Processed offer selection for customer {req.customerId}")
return jsonify(response.to_dict())
except Exception as e:
logger.error(f"Error processing offer selection: {str(e)}")
return jsonify({
'resultCode': '500',
'resultDescription': 'Internal server error'
}), 500