made changes on the api to match bank api

This commit was merged in pull request #6.
This commit is contained in:
Chinenye Nmoh
2025-05-18 20:18:15 +01:00
parent 556d51f133
commit d0d51f35c0
26 changed files with 1085 additions and 776 deletions
+18
View File
@@ -0,0 +1,18 @@
[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"
[packages]
flask = "==2.3.3"
flask-marshmallow = "==0.15.0"
marshmallow = "==3.19.0"
flask-cors = "==3.0.10"
gunicorn = "*"
flask-swagger-ui = "*"
python-dotenv = "*"
[dev-packages]
[requires]
python_version = "3.13"
Generated
+213
View File
@@ -0,0 +1,213 @@
{
"_meta": {
"hash": {
"sha256": "4729a28392b881795159ff885c9db5ee8ce14e84697fd7343f4999f53cfbac22"
},
"pipfile-spec": 6,
"requires": {
"python_version": "3.13"
},
"sources": [
{
"name": "pypi",
"url": "https://pypi.org/simple",
"verify_ssl": true
}
]
},
"default": {
"blinker": {
"hashes": [
"sha256:b4ce2265a7abece45e7cc896e98dbebe6cead56bcf805a3d23136d145f5445bf",
"sha256:ba0efaa9080b619ff2f3459d1d500c57bddea4a6b424b60a91141db6fd2f08bc"
],
"markers": "python_version >= '3.9'",
"version": "==1.9.0"
},
"click": {
"hashes": [
"sha256:6b303f0b2aa85f1cb4e5303078fadcbcd4e476f114fab9b5007005711839325c",
"sha256:f5452aeddd9988eefa20f90f05ab66f17fce1ee2a36907fd30b05bbb5953814d"
],
"markers": "python_version >= '3.10'",
"version": "==8.2.0"
},
"colorama": {
"hashes": [
"sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44",
"sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"
],
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6'",
"version": "==0.4.6"
},
"flask": {
"hashes": [
"sha256:09c347a92aa7ff4a8e7f3206795f30d826654baf38b873d0744cd571ca609efc",
"sha256:f69fcd559dc907ed196ab9df0e48471709175e696d6e698dd4dbe940f96ce66b"
],
"index": "pypi",
"markers": "python_version >= '3.8'",
"version": "==2.3.3"
},
"flask-cors": {
"hashes": [
"sha256:74efc975af1194fc7891ff5cd85b0f7478be4f7f59fe158102e91abb72bb4438",
"sha256:b60839393f3b84a0f3746f6cdca56c1ad7426aa738b70d6c61375857823181de"
],
"index": "pypi",
"version": "==3.0.10"
},
"flask-marshmallow": {
"hashes": [
"sha256:2083ae55bebb5142fff98c6bbd483a2f5dbc531a8bc1be2180ed5f75e7f3fccc",
"sha256:ce08a153f74da6ebfffd8065d1687508b0179df37fff7fc0c8f28ccfb64f1b56"
],
"index": "pypi",
"markers": "python_version >= '3.7'",
"version": "==0.15.0"
},
"flask-swagger-ui": {
"hashes": [
"sha256:5ecff6c284d7c5559f3473bd534a31fa5dfc0022502d63f4a04728c2b10596f6",
"sha256:872d038dc11a68eacab88f6f05be3c533aa300453e273775dad3e029b31e03d4"
],
"index": "pypi",
"version": "==5.21.0"
},
"gunicorn": {
"hashes": [
"sha256:ec400d38950de4dfd418cff8328b2c8faed0edb0d517d3394e457c317908ca4d",
"sha256:f014447a0101dc57e294f6c18ca6b40227a4c90e9bdb586042628030cba004ec"
],
"index": "pypi",
"markers": "python_version >= '3.7'",
"version": "==23.0.0"
},
"itsdangerous": {
"hashes": [
"sha256:c6242fc49e35958c8b15141343aa660db5fc54d4f13a1db01a3f5891b98700ef",
"sha256:e0050c0b7da1eea53ffaf149c0cfbb5c6e2e2b69c4bef22c81fa6eb73e5f6173"
],
"markers": "python_version >= '3.8'",
"version": "==2.2.0"
},
"jinja2": {
"hashes": [
"sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d",
"sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67"
],
"markers": "python_version >= '3.7'",
"version": "==3.1.6"
},
"markupsafe": {
"hashes": [
"sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4",
"sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30",
"sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0",
"sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9",
"sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396",
"sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13",
"sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028",
"sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca",
"sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557",
"sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832",
"sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0",
"sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b",
"sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579",
"sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a",
"sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c",
"sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff",
"sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c",
"sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22",
"sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094",
"sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb",
"sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e",
"sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5",
"sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a",
"sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d",
"sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a",
"sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b",
"sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8",
"sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225",
"sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c",
"sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144",
"sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f",
"sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87",
"sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d",
"sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93",
"sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf",
"sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158",
"sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84",
"sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb",
"sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48",
"sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171",
"sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c",
"sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6",
"sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd",
"sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d",
"sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1",
"sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d",
"sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca",
"sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a",
"sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29",
"sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe",
"sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798",
"sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c",
"sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8",
"sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f",
"sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f",
"sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a",
"sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178",
"sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0",
"sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79",
"sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430",
"sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50"
],
"markers": "python_version >= '3.9'",
"version": "==3.0.2"
},
"marshmallow": {
"hashes": [
"sha256:90032c0fd650ce94b6ec6dc8dfeb0e3ff50c144586462c389b81a07205bedb78",
"sha256:93f0958568da045b0021ec6aeb7ac37c81bfcccbb9a0e7ed8559885070b3a19b"
],
"index": "pypi",
"markers": "python_version >= '3.7'",
"version": "==3.19.0"
},
"packaging": {
"hashes": [
"sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484",
"sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f"
],
"markers": "python_version >= '3.8'",
"version": "==25.0"
},
"python-dotenv": {
"hashes": [
"sha256:41f90bc6f5f177fb41f53e87666db362025010eb28f60a01c9143bfa33a2b2d5",
"sha256:d7c01d9e2293916c18baf562d95698754b0dbbb5e74d457c45d4f6561fb9d55d"
],
"index": "pypi",
"markers": "python_version >= '3.9'",
"version": "==1.1.0"
},
"six": {
"hashes": [
"sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274",
"sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"
],
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'",
"version": "==1.17.0"
},
"werkzeug": {
"hashes": [
"sha256:54b78bf3716d19a65be4fceccc0d1d7b89e608834989dfae50ea87564639213e",
"sha256:60723ce945c19328679790e3282cc758aa4a6040e4bb330f53d30fa546d44746"
],
"markers": "python_version >= '3.9'",
"version": "==3.1.3"
}
},
"develop": {}
}
+4 -9
View File
@@ -13,25 +13,20 @@ def create_app():
# Load configuration # Load configuration
app.config.from_object(Config) app.config.from_object(Config)
CORS(app)
CORS(app)
# Swagger Doc # Swagger Doc
SWAGGER_URL = app.config.get("SWAGGER_URL") SWAGGER_URL = app.config.get("SWAGGER_URL")
API_URL = app.config.get("API_URL") API_URL = app.config.get("API_URL")
# Register blueprints with /api prefix for the main API routes
# Register blueprints app.register_blueprint(api, url_prefix='/api')
app.register_blueprint(api)
swagger_ui_blueprint = get_swaggerui_blueprint(SWAGGER_URL, API_URL) swagger_ui_blueprint = get_swaggerui_blueprint(SWAGGER_URL, API_URL)
app.register_blueprint(swagger_ui_blueprint, url_prefix=SWAGGER_URL) app.register_blueprint(swagger_ui_blueprint, url_prefix=SWAGGER_URL)
# Error Handlers # Error Handlers
register_error_handlers(app) register_error_handlers(app)
return app return app
+43 -24
View File
@@ -40,14 +40,17 @@ def serve_paths(filename):
return send_from_directory(swagger_dir, filename) return send_from_directory(swagger_dir, filename)
# RACCheck Endpoint # RACCheck Endpoint
@api.route('/RACCheck', methods=['POST']) @api.route('/rac-check', methods=['POST'])
@require_api_key @require_api_key
@require_app_id @require_app_id
def rac_check(): def rac_check():
data = request.get_json() try:
# logger.info(f"RACCheck request received: {data}") data = request.get_json()
response = RACCheckService.process_request(data) response = RACCheckService.process_request(data)
return response return response
except Exception as e:
logger.exception("Unhandled exception in /RACCheck route")
return jsonify({"message": "Unhandled server error"}), 500
# CompleteRACcheck Endpoint # CompleteRACcheck Endpoint
@api.route('/CompleteRACcheck', methods=['POST']) @api.route('/CompleteRACcheck', methods=['POST'])
@@ -60,45 +63,61 @@ def complete_rac_check():
return response return response
# Disbursement Endpoint # Disbursement Endpoint
@api.route('/Disbursement', methods=['POST']) @api.route('/DisburseLoan', methods=['POST'])
@require_api_key @require_api_key
@require_app_id @require_app_id
def disbursement(): def disbursement():
try:
data = request.get_json() data = request.get_json()
# logger.info(f"Disbursement request received: {data}") # logger.info(f"Disbursement request received: {data}")
response = DisbursementService.process_request(data) response = DisbursementService.process_request(data)
return response return response
except Exception as e:
logger.exception("Unhandled exception in /Disbursement route")
return jsonify({"message": "Unhandled server error"}), 500
# CollectLoan Endpoint # CollectLoan Endpoint
@api.route('/CollectLoan', methods=['POST']) @api.route('/CollectLoan', methods=['POST'])
@require_api_key @require_api_key
@require_app_id @require_app_id
def collect_loan(): def collect_loan():
data = request.get_json() try:
# logger.info(f"CollectLoan request received: {data}") data = request.get_json()
response = CollectLoanService.process_request(data) # logger.info(f"CollectLoan request received: {data}")
return response response = CollectLoanService.process_request(data)
return response
except Exception as e:
logger.exception("Unhandled exception in /CollectLoan route")
return jsonify({"message": "Unhandled server error"}), 500
# TransactionVerify Endpoint # TransactionVerify Endpoint
@api.route('/TransactionVerify', methods=['POST']) @api.route('/TransactionVerify', methods=['POST'])
@require_api_key @require_api_key
@require_app_id @require_app_id
def transaction_verify(): def transaction_verify():
data = request.get_json() try:
# logger.info(f"TransactionVerify request received: {data}") data = request.get_json()
response = TransactionVerifyService.process_request(data) # logger.info(f"TransactionVerify request received: {data}")
return response response = TransactionVerifyService.process_request(data)
return response
except Exception as e:
logger.exception("Unhandled exception in /TransactionVerify route")
return jsonify({"message": "Unhandled server error"}), 500
# PenalCharge Endpoint # PenalCharge Endpoint
@api.route('/PenalCharge', methods=['POST']) @api.route('/CollectPenalFee', methods=['POST'])
@require_api_key @require_api_key
@require_app_id @require_app_id
def penal_charge(): def penal_charge():
data = request.get_json() try:
# logger.info(f"PenalCharge request received: {data}") data = request.get_json()
response = PenalChargeService.process_request(data) # logger.info(f"PenalCharge request received: {data}")
return response response = PenalChargeService.process_request(data)
return response
except Exception as e:
logger.exception("Unhandled exception in /PenalCharge route")
return jsonify({"message": "Unhandled server error"}), 500
# RevokeEnableConsent Endpoint # RevokeEnableConsent Endpoint
@api.route('/RevokeEnableConsent', methods=['POST']) @api.route('/RevokeEnableConsent', methods=['POST'])
+27 -13
View File
@@ -1,16 +1,30 @@
from marshmallow import Schema, fields from marshmallow import Schema, fields
# Collect Loan Schema
class CollectLoanSchema(Schema): class CollectLoanSchema(Schema):
transactionId = fields.Str(required=True) channel = fields.Str(allow_none=True)
fbnTransactionId = fields.Str(required=True) transactionId = fields.Str(allow_none=True)
debtId = fields.Str(required=True) fbnTransactionId = fields.Str(allow_none=True)
customerId = fields.Str(required=True) debtId = fields.Str(allow_none=True)
accountId = fields.Str(required=True) accountId = fields.Str(allow_none=True)
productId = fields.Str(required=True) customerId = fields.Str(allow_none=True)
collectAmount = fields.Float(required=True) productId = fields.Str(allow_none=True)
penalCharge = fields.Float(required=False) # Optional collectAmount = fields.Float(required=True)
collectionMethod = fields.Int(required=True) penalCharge = fields.Float(required=True)
lienAmount = fields.Float(required=True) collectionMethod = fields.Str(allow_none=True)
countryId = fields.Str(required=True) lienAmount = fields.Float(required=True)
comment = fields.Str(required=False) # Optional countryId = fields.Str(allow_none=True)
comment = fields.Str(allow_none=True)
class CollectLoanResponseSchema(Schema):
responseCode = fields.Str(allow_none=True)
responseDescr = fields.Str(allow_none=True)
fullDescription = fields.Str(allow_none=True)
transactionId = fields.Str(allow_none=True)
debtId = fields.Str(allow_none=True)
customerId = fields.Str(allow_none=True)
accountId = fields.Str(allow_none=True)
productId = fields.Str(allow_none=True)
amountCollected = fields.Float(required=True)
countryId = fields.Str(allow_none=True)
comment = fields.Str(allow_none=True)
responseMessage = fields.Str(allow_none=True)
+28 -10
View File
@@ -1,17 +1,35 @@
from marshmallow import Schema, fields from marshmallow import Schema, fields
# Disbursement Schema
class DisbursementSchema(Schema): class DisbursementSchema(Schema):
requestId = fields.Str(required=True) transactionId = fields.Str(required=False, allow_none=True)
debtId = fields.Str(required=True) fbnTransactionId = fields.Str(required=False, allow_none=True)
transactionId = fields.Str(required=True) debtId = fields.Str(required=False, allow_none=True)
customerId = fields.Str(required=True) customerId = fields.Str(required=False, allow_none=True)
accountId = fields.Str(required=True) accountId = fields.Str(required=False, allow_none=True)
productId = fields.Str(required=True) productId = fields.Str(required=False, allow_none=True)
provideAmount = fields.Float(required=True) provideAmount = fields.Float(required=True)
collectAmountInterest = fields.Float(required=False) # Optional collectAmountInterest = fields.Float(required=True)
collectAmountMgtFee = fields.Float(required=True) collectAmountMgtFee = fields.Float(required=True)
collectAmountInsurance = fields.Float(required=True) collectAmountInsurance = fields.Float(required=True)
collectAmountVAT = fields.Float(required=True) collectAmountVAT = fields.Float(required=True)
countryId = fields.Str(required=True) countryId = fields.Str(required=False, allow_none=True)
comment = fields.Str(required=False) # Optional comment = fields.Str(required=False, allow_none=True)
class DisburseLoanResponseSchema(Schema):
transactionId = fields.Str(allow_none=True)
fbnTransactionId = fields.Str(allow_none=True)
debtId = fields.Str(allow_none=True)
customerId = fields.Str(allow_none=True)
accountId = fields.Str(allow_none=True)
productId = fields.Str(allow_none=True)
provideAmount = fields.Float(required=True)
collectAmountInterest = fields.Float(required=True)
collectAmountMgtFee = fields.Float(required=True)
collectAmountInsurance = fields.Float(required=True)
collectAmountVAT = fields.Float(required=True)
countryId = fields.Str(allow_none=True)
responseCode = fields.Str(allow_none=True)
responseMessage = fields.Str(allow_none=True)
+22 -11
View File
@@ -1,14 +1,25 @@
from marshmallow import Schema, fields from marshmallow import Schema, fields
# This file contains the schema for penal charge operations
# Penal Charge Schema
class PenalChargeSchema(Schema): class PenalChargeSchema(Schema):
transactionId = fields.Str(required=True) channel = fields.Str(allow_none=True)
fbnTransactionId = fields.Str(required=True) transactionId = fields.Str(allow_none=True)
debtId = fields.Str(required=True) fbnTransactionId = fields.Str(allow_none=True)
customerId = fields.Str(required=True) debtId = fields.Str(allow_none=True)
accountId = fields.Str(required=True) accountId = fields.Str(allow_none=True)
penalCharge = fields.Decimal(required=True) penalCharge = fields.Float(required=True)
lienAmount = fields.Decimal(required=True) customerId = fields.Str(allow_none=True)
countryId = fields.Str(required=True) lienAmount = fields.Float(required=True)
comment = fields.Str(required=False) comment = fields.Str(allow_none=True)
countryId = fields.Str(allow_none=True)
#represents the response schema for penal charge
class CollectPenalFeeResponseSchema(Schema):
customerId = fields.Str(allow_none=True)
transactionId = fields.Str(allow_none=True)
amountCollected = fields.Float(required=True)
accountId = fields.Str(allow_none=True)
responseCode = fields.Str(allow_none=True)
responseMessage = fields.Str(allow_none=True)
+17 -12
View File
@@ -1,18 +1,15 @@
from marshmallow import Schema, fields from marshmallow import Schema, fields
class RACItemSchema(Schema): class RACItemSchema(Schema):
salaryAccount = fields.Bool(required=True) hasSalaryAccount = fields.Bool(required=True)
bvn = fields.Str(required=True) bvnValidated = fields.Bool(required=True)
crc = fields.Bool(required=True) creditBureauCheck = fields.Bool(required=True)
crms = fields.Bool(required=True) crmsCheck = fields.Bool(required=True)
accountStatus = fields.Str(required=True) accountStatus = fields.Bool(required=True)
lien = fields.Bool(required=True) hasLien = fields.Bool(required=True)
noBouncedCheck = fields.Bool(required=True) noBouncedCheck = fields.Bool(required=True)
existingLoan = fields.Bool(required=True) isWhitelisted = fields.Bool(required=True)
whitelist = fields.Bool(required=True) hasPastDueLoan = fields.Bool(required=True)
noPastDueSalaryLoan = fields.Bool(required=True)
noPastDueOtherLoans = fields.Bool(required=True)
# RAC Check Schema # RAC Check Schema
class RACCheckSchema(Schema): class RACCheckSchema(Schema):
@@ -20,4 +17,12 @@ class RACCheckSchema(Schema):
fbnTransactionId = fields.Str(required=True) fbnTransactionId = fields.Str(required=True)
customerId = fields.Str(required=True) customerId = fields.Str(required=True)
accountId = fields.Str(required=True) accountId = fields.Str(required=True)
RAC_Array = fields.List(fields.Nested(RACItemSchema), required=True) channel = fields.Str(required=True)
countryCode = fields.Str(required=True)
class RACCheckResponseSchema(Schema):
transactionId = fields.Str(required=True)
customerId = fields.Str(required=True)
accountId = fields.Str(required=True)
racResponse = fields.Nested(RACItemSchema, required=True)
+18 -9
View File
@@ -1,12 +1,21 @@
from marshmallow import Schema, fields from marshmallow import Schema, fields
# Transaction Verify Schema
class TransactionVerifySchema(Schema): class TransactionVerifySchema(Schema):
counter = fields.Str(required=True) channel = fields.Str(allow_none=True)
transactionId = fields.Str(required=True) accountId = fields.Str(allow_none=True)
requestID = fields.Str(required=True) customerId = fields.Str(allow_none=True)
customerId = fields.Str(required=True) transactionId = fields.Str(allow_none=True)
accountId = fields.Str(required=True) transactionType = fields.Str(allow_none=True)
countryId = fields.Str(required=True) # Static value “01” countryId = fields.Str(allow_none=True)
transactionType = fields.Str(required=True) requestId = fields.Str(allow_none=True)
class TransactionVerifyResponseSchema(Schema):
responseCode = fields.Str(allow_none=True)
responseDescr = fields.Str(allow_none=True)
fullDescription = fields.Str(allow_none=True)
customerId = fields.Str(allow_none=True)
accountId = fields.Str(allow_none=True)
providedAmount = fields.Float(required=True)
collectedAmount = fields.Float(required=True)
transactionId = fields.Str(allow_none=True)
transactionType = fields.Str(allow_none=True)
+20 -22
View File
@@ -2,7 +2,7 @@ from flask import request, jsonify
from marshmallow import ValidationError from marshmallow import ValidationError
from app.utils.logger import logger from app.utils.logger import logger
from app.api.helpers.response_helper import ResponseHelper from app.api.helpers.response_helper import ResponseHelper
from app.api.schemas.collect_loan import CollectLoanSchema from app.api.schemas.collect_loan import CollectLoanSchema, CollectLoanResponseSchema
class CollectLoanService: class CollectLoanService:
@staticmethod @staticmethod
@@ -14,7 +14,7 @@ class CollectLoanService:
data (dict): The request data. data (dict): The request data.
Returns: Returns:
dict: A standardized response. tuple: JSON response and status code.
""" """
try: try:
logger.info("Processing CollectLoan request") logger.info("Processing CollectLoan request")
@@ -25,35 +25,33 @@ class CollectLoanService:
# Simulated processing logic # Simulated processing logic
response_data = { response_data = {
"transactionId": "T002", "transactionId": validated_data.get("transactionId", "T002"),
"debtId": "273194670", "debtId": validated_data.get("debtId", "273194670"),
"customerId": "CN621868", "customerId": validated_data.get("customerId", "CN621868"),
"accountId": "2017821799", "accountId": validated_data.get("accountId", "2017821799"),
"productId": "101", "productId": validated_data.get("productId", "101"),
"collectAmount": 60000.00, "amountCollected": validated_data.get("collectAmount", 60000.00),
"penalCharge": 0, "countryId": validated_data.get("countryId", "01"),
"lienAmount": 20000, "comment": validated_data.get("comment", "Testing CollectionLoanRequest"),
"countryId": "01", "responseCode": "00",
"comment": "Testing CollectionLoanRequest", "responseDescr": "Loan Collection Successful",
"resultCode": "00", "fullDescription": "Loan collection completed successfully",
"resultDescription": "Loan Collection Successful" "responseMessage": "Loan collection completed successfully"
} }
# Validate and serialize the response data
response_schema = CollectLoanResponseSchema()
result = response_schema.dump(response_data)
# return ResponseHelper.success( return jsonify(result), 200
# data=response_data,
# message="Loan collection completed successfully"
# )
return response_data
except ValidationError as err: except ValidationError as err:
logger.error(f"Validation Error: {err.messages}") logger.error(f"Validation Error: {err.messages}")
return jsonify({ return jsonify({
"message": "Validation exception" "message": "Validation exception",
"errors": err.messages
}) , 422 }) , 422
except Exception as e: except Exception as e:
logger.error(f"An error occurred: {str(e)}", exc_info=True) logger.error(f"An error occurred: {str(e)}", exc_info=True)
return jsonify({ return jsonify({
+26 -27
View File
@@ -1,8 +1,7 @@
from flask import request, jsonify from flask import request, jsonify
from marshmallow import ValidationError from marshmallow import ValidationError
from app.utils.logger import logger from app.utils.logger import logger
from app.api.helpers.response_helper import ResponseHelper from app.api.schemas.disbursement import DisbursementSchema, DisburseLoanResponseSchema
from app.api.schemas.disbursement import DisbursementSchema
class DisbursementService: class DisbursementService:
@staticmethod @staticmethod
@@ -14,7 +13,7 @@ class DisbursementService:
data (dict): The request data. data (dict): The request data.
Returns: Returns:
dict: A standardized response. tuple: JSON response and HTTP status code.
""" """
try: try:
logger.info("Processing Disbursement request") logger.info("Processing Disbursement request")
@@ -23,40 +22,40 @@ class DisbursementService:
schema = DisbursementSchema() schema = DisbursementSchema()
validated_data = schema.load(data) # Raises ValidationError if invalid validated_data = schema.load(data) # Raises ValidationError if invalid
# Simulated processing logic
# For demo purposes, we simulate a response using the validated data
response_data = { response_data = {
"transactionId": "T001", "transactionId": validated_data.get("transactionId"),
"TransactionId": "Tr201712RK9232P115", "fbnTransactionId": "Tr201712RK9232P115", # Example or generated value
"debtId": "273194670", "debtId": validated_data.get("debtId"),
"customerId": "CN621868", "customerId": validated_data.get("customerId"),
"accountId": "2017821799", "accountId": validated_data.get("accountId"),
"productId": "101", "productId": validated_data.get("productId"),
"provideAmount": 100000.0, "provideAmount": validated_data.get("provideAmount"),
"collectAmountInterest": 5000, "collectAmountInterest": validated_data.get("collectAmountInterest"),
"collectAmountMgtFee": 1000, "collectAmountMgtFee": validated_data.get("collectAmountMgtFee"),
"collectAmountInsurance": 1000, "collectAmountInsurance": validated_data.get("collectAmountInsurance"),
"collectAmountVAT": 75, "collectAmountVAT": validated_data.get("collectAmountVAT"),
"countryId": "01", "countryId": validated_data.get("countryId"),
"resultCode": "00", "responseCode": "00", # success code example
"resultDescription": "Loan Request Completed Successfully!" "responseMessage": "Loan Request Completed Successfully!"
} }
# Serialize response
response_schema = DisburseLoanResponseSchema()
result = response_schema.dump(response_data)
# return ResponseHelper.success( return jsonify(result), 200
# data=response_data,
# message="Disbursement completed successfully"
# )
return response_data
except ValidationError as err: except ValidationError as err:
logger.error(f"Validation Error: {err.messages}") logger.error(f"Validation Error: {err.messages}")
return jsonify({ return jsonify({
"message": "Validation exception" "message": "Validation exception",
}) , 422 "errors": err.messages
}), 422
except Exception as e: except Exception as e:
logger.error(f"An error occurred: {str(e)}", exc_info=True) logger.error(f"An error occurred: {str(e)}", exc_info=True)
return jsonify({ return jsonify({
"message": "Internal Server Error" "message": "Internal Server Error"
}) , 500 }), 500
+16 -13
View File
@@ -2,7 +2,7 @@ from flask import request, jsonify
from marshmallow import ValidationError from marshmallow import ValidationError
from app.utils.logger import logger from app.utils.logger import logger
from app.api.helpers.response_helper import ResponseHelper from app.api.helpers.response_helper import ResponseHelper
from app.api.schemas.penal_charge import PenalChargeSchema from app.api.schemas.penal_charge import PenalChargeSchema, CollectPenalFeeResponseSchema
class PenalChargeService: class PenalChargeService:
@@ -22,30 +22,33 @@ class PenalChargeService:
# Validate input data using PenalChargeSchema # Validate input data using PenalChargeSchema
schema = PenalChargeSchema() schema = PenalChargeSchema()
validated_data = schema.load(data) # Raises ValidationError if invalid validated_data = schema.load(data)
# Simulated processing logic # Simulated processing logic
response_data = { response_data = {
"resultCode": "00", "customerId": validated_data.get("customerId"),
"resultDescription": "Penal charge debited successfully" "transactionId": validated_data.get("transactionId"),
"amountCollected": validated_data.get("penalCharge", 0.0),
"accountId": validated_data.get("accountId"),
"responseCode": "00",
"responseMessage": "Penal charge debited successfully"
} }
# Optionally validate/serialize response using schema
response_schema = CollectPenalFeeResponseSchema()
result = response_schema.dump(response_data)
# return ResponseHelper.success( return result
# data=response_data,
# message="Penal charge applied successfully"
# )
return response_data
except ValidationError as err: except ValidationError as err:
logger.error(f"Validation Error: {err.messages}") logger.error(f"Validation Error: {err.messages}")
return jsonify({ return jsonify({
"message": "Validation exception" "message": "Validation exception",
}) , 422 "errors": err.messages
}), 422
except Exception as e: except Exception as e:
logger.error(f"An error occurred: {str(e)}", exc_info=True) logger.error(f"An error occurred: {str(e)}", exc_info=True)
return jsonify({ return jsonify({
"message": "Internal Server Error" "message": "Internal Server Error"
}) , 500 }), 500
+28 -29
View File
@@ -2,7 +2,7 @@ from flask import request, jsonify
from marshmallow import ValidationError from marshmallow import ValidationError
from app.utils.logger import logger from app.utils.logger import logger
from app.api.helpers.response_helper import ResponseHelper from app.api.helpers.response_helper import ResponseHelper
from app.api.schemas.rac_check import RACCheckSchema from app.api.schemas.rac_check import RACCheckSchema, RACCheckResponseSchema
class RACCheckService: class RACCheckService:
@staticmethod @staticmethod
@@ -14,50 +14,49 @@ class RACCheckService:
data (dict): The request data. data (dict): The request data.
Returns: Returns:
dict: A standardized response. tuple: JSON response and status code.
""" """
try: try:
logger.info("Processing RACCheck request") logger.info("Processing RACCheck request")
# Validate input data using RACCheckSchema # Validate input data
schema = RACCheckSchema() schema = RACCheckSchema()
validated_data = schema.load(data) # Raises ValidationError if invalid validated_data = schema.load(data)
# Simulated processing logic # Simulated RAC check logic — create racResponse manually or via logic
response_data = { rac_response = {
"resultCode": "00", "hasSalaryAccount": True,
"RACResponse": { "bvnValidated": True,
"SalaryAccount": "1", "creditBureauCheck": False,
"BVN": "1", "crmsCheck": True,
"BVNAttachedToAccount": "1", "accountStatus": True,
"CRMS": "1", "hasLien": False,
"CRC": "1", "noBouncedCheck": True,
"AccountStatus": "1", "isWhitelisted": True,
"Lien": "1", "hasPastDueLoan": False
"NoBouncedCheck": "1",
"Whitelist": "1",
"NoPastDueSalaryLoan": "1",
"NoPastDueOtherLoan": "1"
},
"resultDescription": "RAC Check Successful"
} }
full_response = {
"transactionId": validated_data["transactionId"],
"customerId": validated_data["customerId"],
"accountId": validated_data["accountId"],
"racResponse": rac_response
}
# return ResponseHelper.success( response_schema = RACCheckResponseSchema()
# data=response_data, result = response_schema.dump(full_response)
# message="RAC check completed successfully"
# )
return response_data return jsonify(result), 200
except ValidationError as err: except ValidationError as err:
logger.error(f"Validation Error: {err.messages}") logger.error(f"Validation Error: {err.messages}")
return jsonify({ return jsonify({
"message": "Validation exception" "message": "Validation exception",
}) , 422 "errors": err.messages
}), 422
except Exception as e: except Exception as e:
logger.error(f"An error occurred: {str(e)}", exc_info=True) logger.error(f"An error occurred: {str(e)}", exc_info=True)
return jsonify({ return jsonify({
"message": "Internal Server Error" "message": "Internal Server Error"
}) , 500 }), 500
+19 -16
View File
@@ -2,7 +2,10 @@ from flask import request, jsonify
from marshmallow import ValidationError from marshmallow import ValidationError
from app.utils.logger import logger from app.utils.logger import logger
from app.api.helpers.response_helper import ResponseHelper from app.api.helpers.response_helper import ResponseHelper
from app.api.schemas.transaction_verify import TransactionVerifySchema from app.api.schemas.transaction_verify import (
TransactionVerifySchema,
TransactionVerifyResponseSchema
)
class TransactionVerifyService: class TransactionVerifyService:
@@ -26,32 +29,32 @@ class TransactionVerifyService:
# Simulated processing logic # Simulated processing logic
response_data = { response_data = {
"type": "TransactionCheckResponse", "responseCode": "00",
"nativeId": "FBN20191031104405CN621868", "responseDescr": "Success",
"customerId": "CN621868", "fullDescription": "Collect Status retrieved successfully.",
"accountId": "2017821799", "customerId": validated_data.get("customerId"),
"accountId": validated_data.get("accountId"),
"providedAmount": 0.0, "providedAmount": 0.0,
"collectedAmount": 7.50, "collectedAmount": 7.50,
"resultCode": "00", "transactionId": validated_data.get("transactionId"),
"resultDescription": "Collect Status retrieved successfully." "transactionType": validated_data.get("transactionType")
} }
# Validate and serialize response with TransactionVerifyResponseSchema
response_schema = TransactionVerifyResponseSchema()
serialized_response = response_schema.dump(response_data)
# return ResponseHelper.success( return jsonify(serialized_response), 200
# data=response_data,
# message="Transaction verification completed successfully"
# )
return response_data
except ValidationError as err: except ValidationError as err:
logger.error(f"Validation Error: {err.messages}") logger.error(f"Validation Error: {err.messages}")
return jsonify({ return jsonify({
"message": "Validation exception" "message": "Validation exception",
}) , 422 "errors": err.messages
}), 422
except Exception as e: except Exception as e:
logger.error(f"An error occurred: {str(e)}", exc_info=True) logger.error(f"An error occurred: {str(e)}", exc_info=True)
return jsonify({ return jsonify({
"message": "Internal Server Error" "message": "Internal Server Error"
}) , 500 }), 500
+6 -3
View File
@@ -1,10 +1,11 @@
import os import os
from dotenv import load_dotenv
class Config: class Config:
"""Base configuration for Flask app""" """Base configuration for Flask app"""
load_dotenv()
SWAGGER_URL = os.getenv("SWAGGER_URL", "/documentation") SWAGGER_URL = os.getenv("SWAGGER_URL")
API_URL = os.getenv("API_URL", "/swagger.json") API_URL = '/api/swagger.json'
DEBUG = True DEBUG = True
VALID_APP_ID = os.getenv("VALID_APP_ID", "app1") VALID_APP_ID = os.getenv("VALID_APP_ID", "app1")
@@ -15,3 +16,5 @@ class Config:
# SECRET_KEY = os.environ.get("SECRET_KEY", "your_secret_key") # SECRET_KEY = os.environ.get("SECRET_KEY", "your_secret_key")
DEBUG = True DEBUG = True
def configure():
load_dotenv()
+21 -21
View File
@@ -16,6 +16,9 @@
"servers": [ "servers": [
{ {
"url": "http://localhost:6337" "url": "http://localhost:6337"
},
{
"url": "http://localhost:5000"
}, },
{ {
"url": "http://10.10.11.17:6337" "url": "http://10.10.11.17:6337"
@@ -107,35 +110,32 @@
} }
], ],
"paths": { "paths": {
"/RACCheck": { "/api/rac-check": {
"$ref": "./paths/RACCheck.json" "$ref": "swagger/paths/RACCheck.json"
}, },
"/CompleteRACcheck": { "/api/DisburseLoan": {
"$ref": "./paths/CompleteRACcheck.json" "$ref": "swagger/paths/Disbursement.json"
}, },
"/Disbursement": { "/api/CollectLoan": {
"$ref": "./paths/Disbursement.json" "$ref": "swagger/paths/CollectLoan.json"
}, },
"/CollectLoan": { "/api/TransactionVerify": {
"$ref": "./paths/CollectLoan.json" "$ref": "swagger/paths/TransactionVerify.json"
}, },
"/TransactionVerify": { "/api/CollectPenalFee": {
"$ref": "./paths/TransactionVerify.json" "$ref": "swagger/paths/PenalCharge.json"
}, },
"/PenalCharge": { "/api/RevokeEnableConsent": {
"$ref": "./paths/PenalCharge.json" "$ref": "swagger/paths/RevokeEnableConsent.json"
}, },
"/RevokeEnableConsent": { "/api/TokenValidation": {
"$ref": "./paths/RevokeEnableConsent.json" "$ref": "swagger/paths/TokenValidation.json"
}, },
"/TokenValidation": { "/api/LienCheck": {
"$ref": "./paths/TokenValidation.json" "$ref": "swagger/paths/LienCheck.json"
}, },
"/LienCheck": { "/api/NewTransactionCheck": {
"$ref": "./paths/LienCheck.json" "$ref": "swagger/paths/NewTransactionCheck.json"
},
"/NewTransactionCheck": {
"$ref": "./paths/NewTransactionCheck.json"
} }
}, },
"components": { "components": {
+65 -68
View File
@@ -1,70 +1,67 @@
{ {
"type": "object", "type": "object",
"properties": { "properties": {
"transactionId": { "transactionId": {
"type": "string", "type": "string",
"example": "T002" "example": "T002"
},
"fbnTransactionId": {
"type": "string",
"example": "FBN20231123"
},
"debtId": {
"type": "string",
"example": "273194670"
},
"customerId": {
"type": "string",
"example": "CN621868"
},
"accountId": {
"type": "string",
"example": "2017821799"
},
"productId": {
"type": "string",
"example": "101"
},
"collectAmount": {
"type": "number",
"format": "double",
"example": 80000.0
},
"penalCharge": {
"type": "number",
"format": "double",
"example": 0.0
},
"collectionMethod": {
"type": "integer",
"example": 1
},
"lienAmount": {
"type": "number",
"format": "double",
"example": 80000.0
},
"countryId": {
"type": "string",
"example": "01"
},
"comment": {
"type": "string",
"example": "Testing CollectionLoanRequest"
}
}, },
"required": [ "fbnTransactionId": {
"transactionId", "type": "string",
"fbnTransactionId", "example": "FBN20231123"
"debtId", },
"customerId", "debtId": {
"accountId", "type": "string",
"productId", "example": "273194670"
"collectAmount", },
"penalCharge", "customerId": {
"collectionMethod", "type": "string",
"lienAmount", "example": "CN621868"
"countryId", },
"comment" "accountId": {
] "type": "string",
} "example": "2017821799"
},
"productId": {
"type": "string",
"example": "101"
},
"collectAmount": {
"type": "number",
"format": "double",
"example": 80000.0
},
"penalCharge": {
"type": "number",
"format": "double",
"example": 0.0
},
"collectionMethod": {
"type": "string",
"example": "string"
},
"lienAmount": {
"type": "number",
"format": "double",
"example": 80000.0
},
"countryId": {
"type": "string",
"example": "01"
},
"comment": {
"type": "string",
"example": "Testing CollectionLoanRequest"
},
"channel": {
"type": "string",
"example": "string"
}
},
"required": [
"collectAmount",
"penalCharge",
"lienAmount"
],
"additionalProperties": false
}
+67 -68
View File
@@ -1,70 +1,69 @@
{ {
"type": "object", "type": "object",
"properties": { "properties": {
"transactionId": { "responseCode": {
"type": "string", "type": "string",
"example": "T002" "nullable": true,
}, "example": "00"
"debtId": {
"type": "string",
"example": "273194670"
},
"customerId": {
"type": "string",
"example": "CN621868"
},
"accountId": {
"type": "string",
"example": "2017821799"
},
"productId": {
"type": "string",
"example": "101"
},
"collectAmount": {
"type": "number",
"format": "double",
"example": 60000.0
},
"penalCharge": {
"type": "number",
"format": "double",
"example": 0.0
},
"lienAmount": {
"type": "number",
"format": "double",
"example": 20000.0
},
"countryId": {
"type": "string",
"example": "01"
},
"comment": {
"type": "string",
"example": "Testing CollectionLoanRequest"
},
"resultCode": {
"type": "string",
"example": "00"
},
"resultDescription": {
"type": "string",
"example": "Loan Collection Successful"
}
}, },
"required": [ "responseDescr": {
"transactionId", "type": "string",
"debtId", "nullable": true,
"customerId", "example": "Success"
"accountId", },
"productId", "fullDescription": {
"collectAmount", "type": "string",
"penalCharge", "nullable": true,
"lienAmount", "example": "Loan Collection Successful"
"countryId", },
"comment", "transactionId": {
"resultCode", "type": "string",
"resultDescription" "nullable": true,
] "example": "T002"
} },
"debtId": {
"type": "string",
"nullable": true,
"example": "273194670"
},
"customerId": {
"type": "string",
"nullable": true,
"example": "CN621868"
},
"accountId": {
"type": "string",
"nullable": true,
"example": "2017821799"
},
"productId": {
"type": "string",
"nullable": true,
"example": "101"
},
"amountCollected": {
"type": "number",
"format": "double",
"example": 60000.0
},
"countryId": {
"type": "string",
"nullable": true,
"example": "01"
},
"comment": {
"type": "string",
"nullable": true,
"example": "Testing CollectionLoanRequest"
},
"responseMessage": {
"type": "string",
"nullable": true,
"example": "Loan processed successfully"
}
},
"required": [
"amountCollected"
],
"additionalProperties": false
}
+76 -75
View File
@@ -1,77 +1,78 @@
{ {
"type": "object", "type": "object",
"properties": { "properties": {
"requestId": { "transactionId": {
"type": "string", "type": "string",
"example": "7876786" "example": "T001",
}, "nullable": true
"transactionId": {
"type": "string",
"example": "T001"
},
"debtId": {
"type": "string",
"example": "273194670"
},
"customerId": {
"type": "string",
"example": "CN621868"
},
"accountId": {
"type": "string",
"example": "2017821799"
},
"productId": {
"type": "string",
"example": "101"
},
"provideAmount": {
"type": "number",
"format": "double",
"example": 100000.0
},
"collectAmountInterest": {
"type": "number",
"format": "double",
"example": 5000.0
},
"collectAmountMgtFee": {
"type": "number",
"format": "double",
"example": 1000.0
},
"collectAmountInsurance": {
"type": "number",
"format": "double",
"example": 1000.0
},
"collectAmountVAT": {
"type": "number",
"format": "double",
"example": 75.0
},
"countryId": {
"type": "string",
"example": "01"
},
"comment": {
"type": "string",
"example": "Testing LoanRequest"
}
}, },
"required": [ "fbnTransactionId": {
"requestId", "type": "string",
"transactionId", "example": "Tr201712RK9232P115",
"debtId", "nullable": true
"customerId", },
"accountId", "debtId": {
"productId", "type": "string",
"provideAmount", "example": "273194670",
"collectAmountInterest", "nullable": true
"collectAmountMgtFee", },
"collectAmountInsurance", "customerId": {
"collectAmountVAT", "type": "string",
"countryId", "example": "CN621868",
"comment" "nullable": true
] },
} "accountId": {
"type": "string",
"example": "2017821799",
"nullable": true
},
"productId": {
"type": "string",
"example": "101",
"nullable": true
},
"provideAmount": {
"type": "number",
"format": "double",
"example": 100000.0
},
"collectAmountInterest": {
"type": "number",
"format": "double",
"example": 5000.0
},
"collectAmountMgtFee": {
"type": "number",
"format": "double",
"example": 1000.0
},
"collectAmountInsurance": {
"type": "number",
"format": "double",
"example": 1000.0
},
"collectAmountVAT": {
"type": "number",
"format": "double",
"example": 75.0
},
"countryId": {
"type": "string",
"example": "01",
"nullable": true
},
"comment": {
"type": "string",
"example": "Testing LoanRequest",
"nullable": true
}
},
"required": [
"provideAmount",
"collectAmountInterest",
"collectAmountMgtFee",
"collectAmountInsurance",
"collectAmountVAT"
],
"additionalProperties": false
}
+80 -80
View File
@@ -1,82 +1,82 @@
{ {
"type": "object", "type": "object",
"properties": { "properties": {
"transactionId": { "transactionId": {
"type": "string", "type": "string",
"example": "T001" "example": "T001",
}, "nullable": true
"TransactionId": {
"type": "string",
"example": "Tr201712RK9232P115"
},
"debtId": {
"type": "string",
"example": "273194670"
},
"customerId": {
"type": "string",
"example": "CN621868"
},
"accountId": {
"type": "string",
"example": "2017821799"
},
"productId": {
"type": "string",
"example": "101"
},
"provideAmount": {
"type": "number",
"format": "double",
"example": 100000.0
},
"collectAmountInterest": {
"type": "number",
"format": "double",
"example": 5000.0
},
"collectAmountMgtFee": {
"type": "number",
"format": "double",
"example": 1000.0
},
"collectAmountInsurance": {
"type": "number",
"format": "double",
"example": 1000.0
},
"collectAmountVAT": {
"type": "number",
"format": "double",
"example": 75.0
},
"countryId": {
"type": "string",
"example": "01"
},
"resultCode": {
"type": "string",
"example": "00"
},
"resultDescription": {
"type": "string",
"example": "Loan Request Completed Successfully!"
}
}, },
"required": [ "fbnTransactionId": {
"transactionId", "type": "string",
"TransactionId", "example": "Tr201712RK9232P115",
"debtId", "nullable": true
"customerId", },
"accountId", "debtId": {
"productId", "type": "string",
"provideAmount", "example": "273194670",
"collectAmountInterest", "nullable": true
"collectAmountMgtFee", },
"collectAmountInsurance", "customerId": {
"collectAmountVAT", "type": "string",
"countryId", "example": "CN621868",
"resultCode", "nullable": true
"resultDescription" },
] "accountId": {
} "type": "string",
"example": "2017821799",
"nullable": true
},
"productId": {
"type": "string",
"example": "101",
"nullable": true
},
"provideAmount": {
"type": "number",
"format": "double",
"example": 100000.0
},
"collectAmountInterest": {
"type": "number",
"format": "double",
"example": 5000.0
},
"collectAmountMgtFee": {
"type": "number",
"format": "double",
"example": 1000.0
},
"collectAmountInsurance": {
"type": "number",
"format": "double",
"example": 1000.0
},
"collectAmountVAT": {
"type": "number",
"format": "double",
"example": 75.0
},
"countryId": {
"type": "string",
"example": "01",
"nullable": true
},
"responseCode": {
"type": "string",
"example": "00",
"nullable": true
},
"responseMessage": {
"type": "string",
"example": "Loan Request Completed Successfully!",
"nullable": true
}
},
"required": [
"provideAmount",
"collectAmountInterest",
"collectAmountMgtFee",
"collectAmountInsurance",
"collectAmountVAT"
]
}
+57 -39
View File
@@ -1,41 +1,59 @@
{ {
"type": "object", "type": "object",
"properties": { "properties": {
"transactionId": { "channel": {
"type": "string", "type": "string",
"example": "T004" "nullable": true
}, },
"fbnTransactionId": { "transactionId": {
"type": "string", "type": "string",
"example": "Tr201712RK9232P115" "nullable": true,
}, "example": "T004"
"debtId": { },
"type": "string", "fbnTransactionId": {
"example": "273194670" "type": "string",
}, "nullable": true,
"customerId": { "example": "Tr201712RK9232P115"
"type": "string", },
"example": "CN621868" "debtId": {
}, "type": "string",
"accountId": { "nullable": true,
"type": "string", "example": "273194670"
"example": "2017821799" },
}, "customerId": {
"penalCharge": { "type": "string",
"type": "number", "nullable": true,
"example": 1.2 "example": "CN621868"
}, },
"lienAmount": { "accountId": {
"type": "number", "type": "string",
"example": 101.2 "nullable": true,
}, "example": "2017821799"
"countryId": { },
"type": "string", "penalCharge": {
"example": "01" "type": "number",
}, "format": "double",
"comment": { "example": 1.2
"type": "string", },
"example": "Testing PenalChargeRequest" "lienAmount": {
} "type": "number",
"format": "double",
"example": 101.2
},
"countryId": {
"type": "string",
"nullable": true,
"example": "01"
},
"comment": {
"type": "string",
"nullable": true,
"example": "Testing PenalChargeRequest"
} }
} },
"required": [
"penalCharge",
"lienAmount"
],
"additionalProperties": false
}
+35 -11
View File
@@ -1,13 +1,37 @@
{ {
"type": "object", "type": "object",
"properties": { "properties": {
"resultCode": { "customerId": {
"type": "string", "type": "string",
"example": "00" "nullable": true,
}, "example": "CN621868"
"resultDescription": { },
"type": "string", "transactionId": {
"example": "Penal charge debited successfully" "type": "string",
} "nullable": true,
"example": "T004"
},
"amountCollected": {
"type": "number",
"format": "double",
"example": 101.2
},
"accountId": {
"type": "string",
"nullable": true,
"example": "2017821799"
},
"responseCode": {
"type": "string",
"nullable": true,
"example": "00"
},
"responseMessage": {
"type": "string",
"nullable": true,
"example": "Penal charge debited successfully"
} }
} },
"required": ["amountCollected"],
"additionalProperties": false
}
+37 -88
View File
@@ -1,91 +1,40 @@
{ {
"type": "object", "type": "object",
"properties": { "properties": {
"transactionId": { "transactionId": {
"type": "string", "type": "string",
"example": "T001" "example": "T001"
},
"fbnTransactionId": {
"type": "string",
"example": "Tr201712RK9232P115"
},
"customerId": {
"type": "string",
"example": "CN621868"
},
"accountId": {
"type": "string",
"example": "2017821799"
},
"RAC_Array": {
"type": "array",
"items": {
"type": "object",
"properties": {
"salaryAccount": {
"type": "boolean",
"example": true
},
"bvn": {
"type": "string",
"example": "12345678901"
},
"crc": {
"type": "boolean",
"example": false
},
"crms": {
"type": "boolean",
"example": true
},
"accountStatus": {
"type": "string",
"example": "active"
},
"lien": {
"type": "boolean",
"example": false
},
"noBouncedCheck": {
"type": "boolean",
"example": true
},
"existingLoan": {
"type": "boolean",
"example": false
},
"whitelist": {
"type": "boolean",
"example": true
},
"noPastDueSalaryLoan": {
"type": "boolean",
"example": true
},
"noPastDueOtherLoans": {
"type": "boolean",
"example": false
}
}
},
"example": [
{
"salaryAccount": true,
"bvn": "12345678901",
"crc": false,
"crms": true,
"accountStatus": "active",
"lien": false,
"noBouncedCheck": true,
"existingLoan": false,
"whitelist": true,
"noPastDueSalaryLoan": true,
"noPastDueOtherLoans": false
}
]
}
}, },
"xml": { "fbnTransactionId": {
"name": "RACCheckRequest" "type": "string",
"example": "Tr201712RK9232P115"
},
"customerId": {
"type": "string",
"example": "CN621868"
},
"accountId": {
"type": "string",
"example": "2017821799"
},
"channel": {
"type": "string",
"example": "USSD"
},
"countryCode": {
"type": "string",
"example": "NG"
} }
} },
"required": [
"transactionId",
"fbnTransactionId",
"customerId",
"accountId",
"channel",
"countryCode"
],
"xml": {
"name": "RACCheckRequest"
}
}
+64 -62
View File
@@ -1,65 +1,67 @@
{ {
"type": "object", "type": "object",
"properties": { "properties": {
"resultCode": { "transactionId": {
"type": "string", "type": "string",
"example": "00" "example": "T001"
},
"RACResponse": {
"type": "object",
"properties": {
"Salary account": {
"type": "string",
"example": "1"
},
"BVN": {
"type": "string",
"example": "1"
},
"BVNAttachedtoAccount": {
"type": "string",
"example": "1"
},
"CRMS": {
"type": "string",
"example": "1"
},
"CRC": {
"type": "string",
"example": "1"
},
"AccountStatus": {
"type": "string",
"example": "1"
},
"Lien": {
"type": "string",
"example": "1"
},
"NoBouncedCheck": {
"type": "string",
"example": "1"
},
"Whitelist": {
"type": "string",
"example": "1"
},
"NoPastDueSalaryLoan": {
"type": "string",
"example": "1"
},
"NoPastDueOtherLoan": {
"type": "string",
"example": "1"
}
}
},
"resultDescription": {
"type": "string",
"example": "RAC Check Successful"
}
}, },
"xml": { "customerId": {
"name": "RACCheckResponse" "type": "string",
"example": "CN621868"
},
"accountId": {
"type": "string",
"example": "2017821799"
},
"racResponse": {
"type": "object",
"properties": {
"hasSalaryAccount": {
"type": "boolean",
"example": true
},
"bvnValidated": {
"type": "boolean",
"example": true
},
"creditBureauCheck": {
"type": "boolean",
"example": true
},
"crmsCheck": {
"type": "boolean",
"example": true
},
"accountStatus": {
"type": "boolean",
"example": true
},
"hasLien": {
"type": "boolean",
"example": true
},
"noBouncedCheck": {
"type": "boolean",
"example": true
},
"isWhitelisted": {
"type": "boolean",
"example": true
},
"hasPastDueLoan": {
"type": "boolean",
"example": true
}
}
} }
} },
"required": [
"transactionId",
"customerId",
"accountId",
"racResponse"
],
"xml": {
"name": "RACCheckResponse"
}
}
@@ -1,33 +1,34 @@
{ {
"type": "object", "type": "object",
"properties": { "properties": {
"counter": { "channel": {
"type": "string", "type": "string",
"example": "2" "example": "MOBILE"
}, },
"transactionId": { "transactionId": {
"type": "string", "type": "string",
"example": "T002" "example": "T002"
}, },
"requestID": { "requestId": {
"type": "string", "type": "string",
"example": "R02802" "example": "R02802"
}, },
"customerId": { "customerId": {
"type": "string", "type": "string",
"example": "CN621868" "example": "CN621868"
}, },
"accountId": { "accountId": {
"type": "string", "type": "string",
"example": "2017821799" "example": "2017821799"
}, },
"countryId": { "countryId": {
"type": "string", "type": "string",
"example": "01" "example": "01"
}, },
"transactionType": { "transactionType": {
"type": "string", "type": "string",
"example": "Disbursement" "example": "Disbursement"
}
} }
} },
"additionalProperties": false
}
@@ -1,37 +1,48 @@
{ {
"type": "object", "type": "object",
"properties": { "properties": {
"$type": { "responseCode": {
"type": "string", "type": "string",
"example": "TransactionCheckResponse" "example": "00"
}, },
"nativeId": { "responseDescr": {
"type": "string", "type": "string",
"example": "FBN20191031104405CN621868" "example": "Collect Status retrieved successfully."
}, },
"customerId": { "fullDescription": {
"type": "string", "type": "string",
"example": "CN621868" "example": "Disbursement was verified and collection completed."
}, },
"accountId": { "customerId": {
"type": "string", "type": "string",
"example": "2017821799" "example": "CN621868"
}, },
"providedAmount": { "accountId": {
"type": "number", "type": "string",
"example": 0.0 "example": "2017821799"
}, },
"collectedAmount": { "providedAmount": {
"type": "number", "type": "number",
"example": 7.50 "format": "double",
}, "example": 0.0
"resultCode": { },
"type": "string", "collectedAmount": {
"example": "00" "type": "number",
}, "format": "double",
"resultDescription": { "example": 7.50
"type": "string", },
"example": "Collect Status retrieved successfully." "transactionId": {
} "type": "string",
"example": "T002"
},
"transactionType": {
"type": "string",
"example": "Disbursement"
} }
} },
"required": [
"providedAmount",
"collectedAmount"
],
"additionalProperties": false
}