from marshmallow import Schema, fields, validate # Schema for the loan item in the response class LoanItemSchema(Schema): offerId = fields.Str(required=True, description="Unique identifier of the offer") productId = fields.Str(required=True, description="Product identifier") amount = fields.Float(required=True, description="Amount of loan customer is eligible for") upfrontPayment = fields.Float(required=True, description="Amount to be deducted upfront") interestRate = fields.Float(required=True, description="Percentage (%) of interest rate") Interest = fields.Float(required=True, description="Amount of interest") ManagementRate = fields.Float(required=True, description="Percentage (%) of management fee") ManagementFee = fields.Float(required=True, description="Amount of management fee") InsuranceRate = fields.Float(required=True, description="Percentage (%) of insurance") InsuranceFee = fields.Float(required=True, description="Amount of insurance") VATRate = fields.Float(required=True, description="Percentage (%) of VAT") VATamount = fields.Float(required=True, description="Amount of VAT") recommendedRepaymentDates = fields.List(fields.Str(), required=True, description="Array of recommended payment dates for all installments in yyyy-mm-dd format") installmentAmount = fields.Float(required=True, description="Amount to be paid each month (upfrontPayment not included)") totalRepaymentAmount = fields.Float(required=True, description="Total amount to be paid by customer. All installment amounts + upfront payment") # SelectOffer Request Schema class SelectOfferSchema(Schema): requestId = fields.Str(required=True, description="Unique identifier of request") transactionId = fields.Str(required=True, description="Unique identifier of transaction. This transaction Id must be consistent across all platforms") customerId = fields.Str(required=True, description="Unique identifier of a customer") accountId = fields.Str(required=True, description="Specific identifier of a user's account") msisdn = fields.Str(required=True, description="User's mobile number in an international format") requestedAmount = fields.Float(required=True, description="Amount of loan requested by user") productId = fields.Str(required=True, description="Product ID") channel = fields.Str(required=True, description="Channel of incoming request", validate=validate.OneOf(["USSD", "FistMobile LitApp", "Web"])) # SelectOffer Response Schema class SelectOfferResponseSchema(Schema): requestId = fields.Str(required=True, description="Unique identifier of request") transactionId = fields.Str(required=True, description="Unique identifier of transaction. This transaction Id must be consistent across all platform") customerId = fields.Str(required=True, description="Unique identifier of a customer") accountId = fields.Str(required=True, description="Specific identifier of a user's account") outstandingDebtAmount = fields.Float(required=False, description="Outstanding debt amount if any") loan = fields.List(fields.Nested(LoanItemSchema), required=True, description="Array of loan offers") resultCode = fields.Str(required=True, description="Result code of executed transaction, e.g. (00 – Success etc.) see result codes table") resultDescription = fields.Str(required=True, description="Description of provided result code")