Major update

This commit is contained in:
Azeez Muibi
2025-03-27 08:21:20 +01:00
parent 1a36416094
commit ba4d878daf
24 changed files with 776 additions and 254 deletions
+18
View File
@@ -0,0 +1,18 @@
from marshmallow import Schema, fields
# Individual SMS item schema for BulkSMS
class BulkSMSItemSchema(Schema):
text = fields.Str(required=True, description="Message to send to customer")
dest = fields.Str(required=True, description="Phone Number in international format")
unicode = fields.Bool(required=True, description="Character encoding standard (set as True for bulk SMS)")
# BulkSMS Request Schema (list of SMS items)
class BulkSMSSchema(Schema):
_schema = fields.List(fields.Nested(BulkSMSItemSchema), required=True)
# BulkSMS Response Schema
class BulkSMSResponseSchema(Schema):
data = fields.Str(required=True, description="Any additional data in response")
statusCode = fields.Int(required=True, description="Result code of executed process (200 = Success)")
IsSuccessful = fields.Bool(required=True, description="An Indicator that the process was successful or not")
errorMessage = fields.Str(required=True, allow_none=True, description="Description of status code if process is failed, null if successful")
+30 -14
View File
@@ -1,16 +1,32 @@
from marshmallow import Schema, fields
from marshmallow import Schema, fields, validate
# Collect Loan Schema
# CollectLoan Request Schema
class CollectLoanSchema(Schema):
transactionId = fields.Str(required=True)
fbnTransactionId = fields.Str(required=True)
debtId = fields.Str(required=True)
customerId = fields.Str(required=True)
accountId = fields.Str(required=True)
productId = fields.Str(required=True)
collectAmount = fields.Float(required=True)
penalCharge = fields.Float(required=False) # Optional
collectionMethod = fields.Int(required=True)
lienAmount = fields.Float(required=True)
countryId = fields.Str(required=True)
comment = fields.Str(required=False) # Optional
transactionId = fields.Str(required=True, description="Unique identifier of transaction in Simbrella system")
fbnTransactionId = fields.Str(required=True, description="Unique id of the transaction received from FBN in Eligibility or Provision requests")
debtId = fields.Str(required=True, description="Unique identifier of a loan in Simbrella system that is going to be collected (it correlates with provision request)")
customerId = fields.Str(required=True, description="Unique identifier of a user")
accountId = fields.Str(required=True, description="Specific identifier of a user's account")
productId = fields.Str(required=True, description="Identifier of a product for which collection to be made")
collectAmount = fields.Float(required=True, description="Amount to be collected from user's account (penalCharge is not included)")
penalCharge = fields.Float(required=False, description="Amount of penalty to be collected from user's account. If there is no penalty, amount is '0'")
collectionMethod = fields.Int(required=True, description="1 - on deposit of salary; 2 - on due date; 3 - initiated by user",
validate=validate.OneOf([1, 2, 3]))
lienAmount = fields.Float(required=True, description="Aggregated (summed up) lien amount")
countryId = fields.Str(required=True, description="Set to static value '01'")
comment = fields.Str(required=False, description="Any additional comment for provided loan operation")
# CollectLoan Response Schema
class CollectLoanResponseSchema(Schema):
transactionId = fields.Str(required=True, description="Unique identifier of transaction in Simbrella system")
debtId = fields.Str(required=True, description="Unique identifier of a loan in Simbrella system that is going to be collected (it correlates with provision request)")
customerId = fields.Str(required=True, description="Unique identifier of a user")
accountId = fields.Str(required=True, description="Specific identifier of a user's account")
productId = fields.Str(required=True, description="Identifier of a product for which collection to be made")
collectAmount = fields.Float(required=True, description="Amount collected from user's account (penalCharge is not included)")
penalCharge = fields.Float(required=True, description="Amount of penalty collected from user's account. If there is no penalty, amount is '0'")
lienAmount = fields.Float(required=True, description="Aggregated (summed up) lien amount")
countryId = fields.Str(required=False, description="Set to static value '01'")
comment = fields.Str(required=False, description="Any additional comment for provided loan operation")
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")
+10 -5
View File
@@ -1,8 +1,13 @@
from marshmallow import Schema, fields
# Lien Check Schema
# LienCheck Request Schema
class LienCheckSchema(Schema):
transactionId = fields.Str(required=True)
customerId = fields.Str(required=True)
accountId = fields.Str(required=True)
countryId = fields.Str(required=True)
transactionId = fields.Str(required=True, description="Unique Identifier in Simbrella system")
customerId = fields.Str(required=True, description="Unique identifier of customer")
accountId = fields.Str(required=True, description="Unique identifier of account")
# LienCheck Response Schema
class LienCheckResponseSchema(Schema):
lienAmount = fields.Float(required=True, description="Lien amount applied to the account")
resultCode = fields.Str(required=True, description="Result code of response")
resultDescription = fields.Str(required=True, description="Response description")
+29
View File
@@ -0,0 +1,29 @@
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")
+14 -11
View File
@@ -1,14 +1,17 @@
from marshmallow import Schema, fields
# Penal Charge Schema
# PenalCharge Request Schema
class PenalChargeSchema(Schema):
transactionId = fields.Str(required=True)
fbnTransactionId = fields.Str(required=True)
debtId = fields.Str(required=True)
customerId = fields.Str(required=True)
accountId = fields.Str(required=True)
penalCharge = fields.Decimal(required=True)
lienAmount = fields.Decimal(required=True)
countryId = fields.Str(required=True)
comment = fields.Str(required=False)
transactionId = fields.Str(required=True, description="Unique identifier of transaction in Simbrella system")
fbnTransactionId = fields.Str(required=True, description="Unique id of the transaction received from FBN in Eligibility or Provision requests")
debtId = fields.Str(required=True, description="Unique identifier of providing loan in Simbrella system")
customerId = fields.Str(required=True, description="Unique identifier of a user")
accountId = fields.Str(required=True, description="Specific identifier of a user's account")
penalCharge = fields.Float(required=True, description="Penalty amount that needs to be collected from user's account")
lienAmount = fields.Float(required=True, description="Aggregated (summed up) lien amount")
comment = fields.Str(required=False, description="Any additional comment for provided loan operation")
# PenalCharge Response Schema
class PenalChargeResponseSchema(Schema):
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")
+26
View File
@@ -0,0 +1,26 @@
from marshmallow import Schema, fields, validate
# ProvideLoan Request Schema
class ProvideLoanSchema(Schema):
requestId = fields.Str(required=False, 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=False, description="User's mobile number in an international format")
productId = fields.Str(required=True, description="Identifier of a product chosen by user")
requestedAmount = fields.Float(required=True, description="Amount of loan that requested by user")
collectionType = fields.Int(required=True, description="Type of collection that user is preferred. 0 as soon as salary inflow occurs; 1- as soon as any new inflow occurs, 1 collection after XX days.",
validate=validate.OneOf([0, 1]))
offerId = fields.Int(required=True, description="Offer ID of the loan selected by Customer")
channel = fields.Str(required=True, description="Request channel: 'USSD' or 'MobileApp' or 'Web' - Reference Channel types",
validate=validate.OneOf(["USSD", "MobileApp", "Web", "100", "101", "102", "103"])) # Added numeric channel codes
# ProvideLoan Response Schema
class ProvideLoanResponseSchema(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=False, description="User's mobile number in an international format")
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")
+28 -19
View File
@@ -1,23 +1,32 @@
from marshmallow import Schema, fields
class RACItemSchema(Schema):
salaryAccount = fields.Bool(required=True)
bvn = fields.Str(required=True)
crc = fields.Bool(required=True)
crms = fields.Bool(required=True)
accountStatus = fields.Str(required=True)
lien = fields.Bool(required=True)
noBouncedCheck = fields.Bool(required=True)
existingLoan = fields.Bool(required=True)
whitelist = fields.Bool(required=True)
noPastDueSalaryLoan = fields.Bool(required=True)
noPastDueOtherLoans = fields.Bool(required=True)
# RACResponse Schema
class RACResponseSchema(Schema):
Salary_account = fields.Str(data_key="Salary account", required=True, description="Has Salary account or Not (1 = Yes, 0 = No)")
BVN = fields.Str(required=False, description="BVN Ok (1 = Yes, 0 = No)")
BVNAttachedToAccount = fields.Str(required=True, description="BVN attached to account (1 = Yes, 0 = No)")
CRMS = fields.Str(required=True, description="No Delinquent loan in CRMS (1 = Yes, 0 = No)")
CRC = fields.Str(required=True, description="No Delinquent loan in CRC (1 = Yes, 0 = No)")
AccountStatus = fields.Str(required=True, description="Has 'Regular' account status (1 = Yes, 0 = No)")
Lien = fields.Str(required=True, description="No Lien on account (1 = Yes, 0 = No)")
NoBouncedCheck = fields.Str(required=True, description="No Bounced Check (1 = Yes, 0 = No)")
Whitelist = fields.Str(required=True, description="Not blacklisted (1 = Yes, 0 = No)")
NoPastDueSalaryLoan = fields.Str(required=True, description="No Past Due Salary Loan (1 = Yes, 0 = No)")
NoPastDueOtherLoan = fields.Str(required=True, description="No Past Due Other Loans (1 = Yes, 0 = No)")
# RAC Check Schema
# RACCheck Request Schema
class RACCheckSchema(Schema):
transactionId = fields.Str(required=True)
fbnTransactionId = fields.Str(required=True)
customerId = fields.Str(required=True)
accountId = fields.Str(required=True)
RAC_Array = fields.List(fields.Nested(RACItemSchema), required=True)
transactionId = fields.Str(required=True, description="Unique identifier of transaction. This transaction Id must be consistent across all platforms")
fbnTransactionId = fields.Str(required=True, description="Unique id of the transaction received from FBN in Eligibility or Provision requests")
customerId = fields.Str(required=True, description="Unique identifier of a user")
accountId = fields.Str(required=True, description="Specific identifier of a user's account")
RAC_Array = fields.List(fields.Str(), required=True, description="Array of RAC items to check (BVN, CRC, CRMS, Salary account, lien, whitelist, lien, account status, no bounced check and existing loan)")
# RACCheck Response Schema
class RACCheckResponseSchema(Schema):
transactionId = fields.Str(required=True, description="Unique identifier of transaction in Simbrella system")
customerId = fields.Str(required=True, description="Unique identifier of a user")
accountId = fields.Str(required=True, description="Specific identifier of a user's account")
RACResponse = fields.Nested(RACResponseSchema, required=True, description="Object containing binary responses for each RAC check")
resultCode = fields.Str(required=False, description="Result code of executed transaction")
resultDescription = fields.Str(required=True, description="Description of provided result code")
+33
View File
@@ -0,0 +1,33 @@
from marshmallow import Schema, fields, validate
# Repayment Request Schema
class RepaymentSchema(Schema):
requestId = fields.Str(required=True, description="Unique identifier of request")
countryCode = fields.Str(required=True, description="Unique country code. Please refer to Country Codes table")
transactionId = fields.Str(required=True, description="Unique identifier of transaction in Simbrella system")
debtId = fields.Str(required=True, description="Unique identifier of a loan in Simbrella system that is going to be collected (it correlates with provision request)")
customerId = fields.Str(required=True, description="Unique identifier of a user")
accountId = fields.Str(required=True, description="Specific identifier of a user's account")
productId = fields.Str(required=True, description="Identifier of a product for which collection to be made")
collectedAmount = fields.Float(required=True, description="Amount to be collected from user's account (penalCharge is not included)")
penalCharge = fields.Float(required=False, description="Amount of penalty to be collected from user's account. If there is no penalty, amount is '0'")
collectionMethod = fields.Int(required=True, description="1 - on deposit of salary, 2 - on due date, 3 - initiated by user",
validate=validate.OneOf([1, 2, 3]))
lienAmount = fields.Float(required=True, description="Aggregated (summed up) lien amount")
comment = fields.Str(required=False, description="Any additional comment for provided loan operation")
# Repayment Response Schema
class RepaymentResponseSchema(Schema):
requestId = fields.Str(required=True, description="Unique identifier of request")
countryCode = fields.Str(required=True, description="Unique country code. Please refer to Country Codes table")
transactionId = fields.Str(required=True, description="Unique identifier of transaction in Simbrella system")
debtId = fields.Str(required=True, description="Unique identifier of a loan in Simbrella system that is going to be collected (it correlates with provision request)")
customerId = fields.Str(required=True, description="Unique identifier of a user")
accountId = fields.Str(required=True, description="Specific identifier of a user's account")
productId = fields.Str(required=True, description="Identifier of a product for which collection to be made")
collectedAmount = fields.Float(required=True, description="Amount to be collected from user's account (penalCharge is not included)")
penalCharge = fields.Float(required=False, description="Amount of penalty to be collected from user's account. If there is no penalty, amount is '0'")
lienAmount = fields.Float(required=True, description="Aggregated (summed up) lien amount")
comment = fields.Str(required=False, description="Any additional comment for provided loan operation")
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")
+14
View File
@@ -0,0 +1,14 @@
from marshmallow import Schema, fields
# SMS Request Schema
class SMSSchema(Schema):
text = fields.Str(required=True, description="Message to send to customer")
dest = fields.Str(required=True, description="Phone Number in international format")
unicode = fields.Bool(required=True, description="Character encoding standard (set as False for single SMS)")
# SMS Response Schema
class SMSResponseSchema(Schema):
data = fields.Str(required=True, description="Any additional data in response")
statusCode = fields.Int(required=True, description="Result code of executed process (200 = Success)")
IsSuccessful = fields.Bool(required=True, description="An Indicator that the process was successful or not")
errorMessage = fields.Str(required=True, allow_none=True, description="Description of status code if process is failed, null if successful")
+27
View File
@@ -0,0 +1,27 @@
from marshmallow import Schema, fields, validate
# Nested data schema for StatusCallResponse
class StatusCallDataSchema(Schema):
transactionId = fields.Str(required=True, description="Unique identifier of transaction in Simbrella system that was sent for transaction check")
providedAmount = fields.Float(required=True, description="Amount collected from user's account within disbursement operation. Amount should always be equal to zero if operation is of any type other than Disbursement")
collectedAmount = fields.Float(required=True, description="Amount collected from user's account. In case of Disbursement this value will be equal to 0. In case of Collection this value will represent amount successfully collected from customers account. In case of Penal charge this value will represent penalty amount collected from customer's account.")
resultCode = fields.Str(required=True, description="Result code of the operation one sent for transaction check, e.g. (00 Success etc.)")
resultDescription = fields.Str(required=True, description="Description of provided result code that was sent for transaction check")
# StatusCall Request Schema
class StatusCallSchema(Schema):
requestId = fields.Str(required=True, description="RequestId for transaction sent by Simbrella within initial request to Firstbank API")
countryCode = fields.Str(required=True, description="Unique country code.")
transactionId = fields.Str(required=True, description="Unique identifier of transaction. This transaction Id must be consistent across all platforms")
debtId = fields.Str(required=True, description="Unique identifier of provided loan in Simbrella system")
transactionType = fields.Str(required=True,
description="Type of Transaction Simbrella is sending Transaction Check for",
validate=validate.OneOf(["Disbursement", "Collection", "PenalCharge"]))
customerId = fields.Str(required=True, description="Unique identifier of a user")
# StatusCall Response Schema
class StatusCallResponseSchema(Schema):
transactionId = fields.Str(required=True, description="Unique identifier of request in Simbrella system")
data = fields.Nested(StatusCallDataSchema, required=True, description="Object containing details of transaction Simbrella querying")
resultCode = fields.Str(required=True, description="Result code of executed transaction, e.g. (00 Success etc.)")
resultDescription = fields.Str(required=True, description="Description of provided result code")
+25 -10
View File
@@ -1,12 +1,27 @@
from marshmallow import Schema, fields
from marshmallow import Schema, fields, validate
# Transaction Verify Schema
# TransactionVerify Request Schema
class TransactionVerifySchema(Schema):
counter = fields.Str(required=True)
transactionId = fields.Str(required=True)
requestID = fields.Str(required=True)
customerId = fields.Str(required=True)
accountId = fields.Str(required=True)
countryId = fields.Str(required=True) # Static value “01”
transactionType = fields.Str(required=True)
requestId = fields.Str(required=True, description="Unique identifier of request")
countryCode = fields.Str(required=True, description="Unique country code. Please refer to Country Codes table")
counter = fields.Str(required=True, description="Unique counter for number of attempts of the API call. Original attempt is 1")
transactionId = fields.Str(required=True, description="Id of the transaction we are checking")
customerId = fields.Str(required=True, description="Unique identifier of a user")
accountId = fields.Str(required=True, description="Specific identifier of a user's account")
transactionType = fields.Str(required=True,
description="To check state of loan disbursal transaction, value must be 'Disbursement', to check state of loan collection transaction, value must be 'Collection', to check state of penalty charge transaction, value must be 'Penalty'",
validate=validate.OneOf(["Disbursement", "Collection", "Penalty"]))
# TransactionVerify Response Schema
class TransactionVerifyResponseSchema(Schema):
requestId = fields.Str(required=True, description="Unique identifier of request")
countryCode = fields.Str(required=True, description="Unique country code. Please refer to Country Codes table")
transactionId = fields.Str(required=True, description="Unique identifier of transaction in Simbrella system")
transactionType = fields.Str(required=True, description="Type of transaction: Disbursement, Collection, or Penalty",
validate=validate.OneOf(["Disbursement", "Collection", "Penalty"]))
customerId = fields.Str(required=True, description="Unique identifier of a user")
accountId = fields.Str(required=True, description="Specific identifier of a user's account")
providedAmount = fields.Float(required=True, description="Amount provided to a user within loan provision operation")
collectedAmount = fields.Float(required=True, description="Amount collected from user's account within collection operation")
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")