from marshmallow import Schema, fields, validate # Schema for the loan item in the response class LoanItemSchema(Schema): debtId = fields.Str(required=True, description="Unique identifier of a debt of a user") loanDate = fields.Str(required=True, description="Date and time of provided loan") dueDate = fields.Str(required=True, description="Due date of provided loan") currentLoanAmount = fields.Float(required=True, description="Outstanding debt amount of the user") initialLoanAmount = fields.Float(required=True, description="Initial loan amount") defaultPenaltyFee = fields.Float(required=True, description="Penalty fee amount") continuousFee = fields.Float(required=True, description="Interest fee charged continuously. First occurs when payment is delayed") productId = fields.Str(required=True, description="Identifier of a provided product to a user") # LoanStatus Request Schema class LoanStatusSchema(Schema): 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") msisdn = fields.Str(required=False, description="User's mobile number in an international format") channel = fields.Str(required=True, description="Request channel: USSD, MobileApp, or Web", validate=validate.OneOf(["USSD", "MobileApp", "Web", "100", "101", "102", "103"])) # Added numeric channel codes # LoanStatus Response Schema class LoanStatusResponseSchema(Schema): customerId = fields.Str(required=True, description="Unique identifier of a user") transactionId = fields.Str(required=True, description="Unique identifier of transaction. This transaction Id must be consistent across all platforms") loans = fields.List(fields.Nested(LoanItemSchema), required=True, description="Array of loan entities. If customer doesn't have a loan, this array will be empty") totalDebtAmount = fields.Float(required=False, description="Sum amount of all existing debts of a user") 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")