32 Commits

Author SHA1 Message Date
VivianDee b48ccacd7c [add]: Make all customers valid 2025-09-26 12:03:33 +01:00
VivianDee c0f1845c5d [add]: Partial loan collection 2025-08-29 12:51:28 +01:00
ameye cfc40b89dc Merge branch 'health_check' of DigiFi/digifi-BankEmulator into master 2025-06-28 13:50:03 +00:00
VivianDee eb7c0f6221 [add]: health check 2025-06-27 15:58:12 +01:00
ameye d69bcd11ea Merge branch 'randomize_rac_check_values' of DigiFi/digifi-BankEmulator into master 2025-06-25 17:32:57 +00:00
VivianDee c4d7db5c59 Update rac_check.py 2025-06-25 17:31:02 +01:00
CHIEFSOFT\ameye d359532775 Fbn trax 2025-06-21 10:52:09 -04:00
CHIEFSOFT\ameye 2b12e1ab0b Partial simulation 2025-06-21 10:41:53 -04:00
vivian.d.simbrellang.com 23b352d9c3 Merge branch 'rac_check' of DigiFi/digifi-BankEmulator into master 2025-06-12 14:33:11 +00:00
VivianDee f665d7b8e4 Update rac_check.py 2025-06-12 15:32:00 +01:00
ameye 855f343626 Merge branch 'sync_payload' of DigiFi/digifi-BankEmulator into master 2025-06-09 19:40:35 +00:00
Chinenye Nmoh e7279a8c65 expanded disbursement endpoint 2025-06-09 20:31:32 +01:00
CHIEFSOFT\ameye 3e4fad5418 responseCode 2025-06-05 22:50:45 -04:00
CHIEFSOFT\ameye 4b018a26e9 res 2025-06-05 22:46:46 -04:00
CHIEFSOFT\ameye dfdfa51583 res[pose code 2025-06-05 22:43:38 -04:00
CHIEFSOFT\ameye 82053f41ce Fix emulator data 2025-06-05 18:18:56 -04:00
ameye 0833d0d0f2 Merge branch 'rac_check_update' of DigiFi/digifi-BankEmulator into master 2025-06-05 14:49:16 +00:00
VivianDee b674b6e6f0 [update]: Rac check response 2025-06-05 12:47:32 +01:00
VivianDee 8c73fe48c5 Update rac_check.py 2025-06-05 11:56:52 +01:00
CHIEFSOFT\ameye 61fda080d5 remove request id 2025-06-04 19:52:41 -04:00
CHIEFSOFT\ameye 13a45eeb77 Fix data 2025-06-04 19:39:33 -04:00
ameye 900c0e0ab3 Merge branch 'sync_payload' of DigiFi/digifi-BankEmulator into master 2025-05-26 21:17:44 +00:00
Chinenye Nmoh 43c07769a8 corrected checkRac swagger endpoint 2025-05-26 22:02:39 +01:00
ameye 1fd0a5be64 Merge branch 'sync_payload' of DigiFi/digifi-BankEmulator into master 2025-05-23 12:58:18 +00:00
Chinenye Nmoh 9b91bbe091 added missing dependencies to the docker file 2025-05-23 13:09:27 +01:00
ameye 7373eb4e58 Merge branch 'sync_payload' of DigiFi/digifi-BankEmulator into master 2025-05-23 10:46:03 +00:00
Chinenye Nmoh d0d51f35c0 made changes on the api to match bank api 2025-05-23 11:20:50 +01:00
ameye 556d51f133 Merge branch 'feature' of DigiFi/digifi-BankEmulator into master 2025-05-23 01:02:30 +00:00
CHIEFSOFT\ameye 4181db05ee Sample from the bank 2025-05-14 11:29:20 -04:00
Azeez Muibi 8454722a27 added complete rac 2025-05-09 14:25:12 +01:00
Azeez Muibi 6638fcabde B
Revert "complete rac check"

This reverts commit 78a1b573d5.
2025-05-09 13:52:18 +01:00
Azeez Muibi 78a1b573d5 complete rac check 2025-05-08 15:32:25 +01:00
40 changed files with 3977 additions and 803 deletions
+1
View File
@@ -0,0 +1 @@
https://first-advance-middleware-develop.fbn-devops-dev-asenv.appserviceenvironment.net/swagger/v1/swagger.json
+1916
View File
File diff suppressed because it is too large Load Diff
+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": {}
}
+1 -1
View File
@@ -45,7 +45,7 @@ This ensures that the application uses secure API keys and app IDs.
Once you have the repository cloned, you can easily set up and run the application using Docker Compose. Simply execute the following command: Once you have the repository cloned, you can easily set up and run the application using Docker Compose. Simply execute the following command:
```bash ```bash
docker-compose up --build docker-compose up -d --build
``` ```
This command will build the Docker image and start the Flask application in a container. By default, the application will be accessible at `http://localhost:6337`. This command will build the Docker image and start the Flask application in a container. By default, the application will be accessible at `http://localhost:6337`.
+2 -7
View File
@@ -13,16 +13,14 @@ 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)
@@ -31,7 +29,4 @@ def create_app():
# Error Handlers # Error Handlers
register_error_handlers(app) register_error_handlers(app)
return app return app
+1 -1
View File
@@ -11,7 +11,7 @@ def require_api_key(f):
@wraps(f) @wraps(f)
def decorated_function(*args, **kwargs): def decorated_function(*args, **kwargs):
api_key = request.headers.get("X-API-KEY") api_key = request.headers.get("X-API-KEY")
logger.info(f"Received API key: {api_key}")
if not api_key: if not api_key:
logger.error("Unauthorized access: Missing API key.") logger.error("Unauthorized access: Missing API key.")
+88 -26
View File
@@ -1,4 +1,5 @@
from flask import Flask, Blueprint, request, jsonify, send_from_directory from flask import Flask, Blueprint, request, jsonify, send_from_directory
import sys
import os import os
from app.api.services import ( from app.api.services import (
RACCheckService, RACCheckService,
@@ -10,11 +11,13 @@ from app.api.services import (
TokenValidationService, TokenValidationService,
LienCheckService, LienCheckService,
NewTransactionCheckService, NewTransactionCheckService,
CompleteRACcheckService
) )
from app.utils.logger import logger from app.utils.logger import logger
from app.api.middlewares import require_api_key, require_app_id, enforce_json from app.api.middlewares import require_api_key, require_app_id, enforce_json
api = Blueprint("api", __name__) api = Blueprint("api", __name__)
@@ -39,55 +42,87 @@ 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
@api.route('/CompleteRACcheck', methods=['POST'])
@require_api_key
@require_app_id
def complete_rac_check():
try:
data = request.get_json()
response = CompleteRACcheckService.process_request(data)
return response
except Exception as e:
logger.exception("Unhandled exception in /CompleteRACcheck route")
return jsonify({"message": "Unhandled server error"}), 500
# 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'])
@@ -129,7 +164,34 @@ def new_transaction_check():
response = NewTransactionCheckService.process_request(data) response = NewTransactionCheckService.process_request(data)
return response return response
# Health Check Endpoint # Health Check Endpoint
@api.route('/health', methods=['GET']) @api.route('/system-health-check', methods=['GET'])
def health_check(): def health_check():
return {"status": "ok"} , 200 """Basic system health check"""
try:
checks = {
"python_version": sys.version_info >= (3, 6),
"disk_space": os.statvfs('/').f_bavail * os.statvfs('/').f_frsize > 500 * 1024 * 1024,
"system_operational": True
}
if all(checks.values()):
return jsonify({
"status": "Active",
"responseCode": "00",
"responseMessage": "Successful"
}), 200
else:
return jsonify({
"status": "Degraded",
"responseCode": "01",
"responseMessage": "System check failed"
}), 200
except Exception as e:
return jsonify({
"status": "Error",
"responseCode": "99",
"responseMessage": f"Health check failed: {str(e)}"
}), 500
+30 -11
View File
@@ -1,16 +1,35 @@
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)
productId = fields.Str(allow_none=True)
collectAmount = fields.Float(required=True) collectAmount = fields.Float(required=True)
penalCharge = fields.Float(required=False) # Optional penalCharge = fields.Float(required=True)
collectionMethod = fields.Int(required=True) collectionMethod = fields.Str(allow_none=True)
lienAmount = fields.Float(required=True) lienAmount = fields.Float(required=True)
countryId = fields.Str(required=True) countryId = fields.Str(allow_none=True)
comment = fields.Str(required=False) # Optional comment = fields.Str(allow_none=True)
class CollectLoanResponseSchema(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)
amountCollected = fields.Float(required=True)
interestCollected = fields.Float(required=True)
penalChargeCollected = fields.Float(required=True)
lienAmount = fields.Float(required=True)
countryId = fields.Str(allow_none=True)
comment = fields.Str(allow_none=True)
responseCode = fields.Str(allow_none=True)
responseMessage = fields.Str(allow_none=True)
responseDescr = fields.Str(allow_none=True)
fullDescription = fields.Str(allow_none=True)
+18
View File
@@ -0,0 +1,18 @@
from marshmallow import Schema, fields, validate
# CompleteRACcheck Request Schema
class CompleteRACcheckSchema(Schema):
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 identifier of transaction in FBN 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")
RAC_Array = fields.Dict(required=True, description="Risk Acceptance Criteria array")
# CompleteRACcheck Response Schema
class CompleteRACcheckResponseSchema(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")
CompleteRACCheckResponse = fields.Dict(required=True, description="Complete RAC check response details")
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")
+36 -10
View File
@@ -1,17 +1,43 @@
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)
disburseMessage = fields.Str(allow_none=True)
disburseDate = fields.Str(allow_none=True)
disburseVerify = fields.Str(allow_none=True)
disburseDescription = fields.Str(allow_none=True)
verifyResult = fields.Str(allow_none=True)
verifyDescription = 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)
+46 -12
View File
@@ -1,17 +1,43 @@
from marshmallow import Schema, fields from marshmallow import Schema, fields
from marshmallow import Schema, fields
from datetime import date
class RACItemSchema(Schema): class RACItemSchema(Schema):
salaryAccount = fields.Bool(required=True) PROCESS_DATE = fields.Date(required=True, default=date.today)
bvn = fields.Str(required=True) CIF_ID = fields.Str(required=True)
crc = fields.Bool(required=True) CUSTOMER_id = fields.Str(required=True)
crms = fields.Bool(required=True) SALACCT_1 = fields.Str(required=True)
accountStatus = fields.Str(required=True) ALERT_PHONE = fields.Str(required=True)
lien = fields.Bool(required=True) AVERAGE_SALARY = fields.Decimal(required=True, as_string=True)
noBouncedCheck = fields.Bool(required=True) LOAN_OUSTANDING_BAL = fields.Decimal(required=True, as_string=True)
existingLoan = fields.Bool(required=True) EMI = fields.Decimal(required=True, as_string=True)
whitelist = fields.Bool(required=True) ELIG_AMT = fields.Decimal(required=True, as_string=True)
noPastDueSalaryLoan = fields.Bool(required=True)
noPastDueOtherLoans = fields.Bool(required=True) rule1_45day_sal = fields.Bool(required=True)
rule2_2m_sal = fields.Bool(required=True)
rule3_no_bounced_check = fields.Bool(required=True)
rule4_current_loan_payments = fields.Bool(required=True)
rule5_no_past_due_fadv_loan = fields.Bool(required=True)
rule6_no_past_due_other_loan = fields.Bool(required=True)
rule7_consistent_salary_amount = fields.Bool(required=True)
rule8_whitelisted = fields.Bool(required=True)
rule9_regular_account = fields.Bool(required=True)
rule10_bvn_validation = fields.Bool(required=True)
rule11_CRC_no_delinquency = fields.Bool(required=True)
rule12_CRMS_no_delinquency = fields.Bool(required=True)
rule13_BVN_ignore = fields.Bool(required=True)
rule14_no_lien = fields.Bool(required=True)
rule15_null_ignore = fields.Bool(required=True)
OVERALL_ELIG = fields.Bool(required=True)
SALARYPAYMENT_1 = fields.Decimal(required=True, as_string=True)
SALARYPAYMENT_2 = fields.Decimal(required=True, as_string=True)
SALARYPAYMENT_3 = fields.Decimal(required=True, as_string=True)
SALARYPAYMENT_4 = fields.Decimal(required=True, as_string=True)
SALARYPAYMENT_5 = fields.Decimal(required=True, as_string=True)
SALARYPAYMENT_6 = fields.Decimal(required=True, as_string=True)
# RAC Check Schema # RAC Check Schema
@@ -20,4 +46,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)
+22 -9
View File
@@ -1,12 +1,25 @@
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)
disburseVerify = fields.Str(allow_none=True)
verifyDescription = fields.Str(allow_none=True)
verifyResult = fields.Str(allow_none=True)
+1
View File
@@ -7,3 +7,4 @@ from app.api.services.revoke_enable_consent import RevokeEnableConsentService
from app.api.services.token_validation import TokenValidationService from app.api.services.token_validation import TokenValidationService
from app.api.services.lien_check import LienCheckService from app.api.services.lien_check import LienCheckService
from app.api.services.new_transaction_check import NewTransactionCheckService from app.api.services.new_transaction_check import NewTransactionCheckService
from app.api.services.complete_rac_check_service import CompleteRACcheckService
+74 -32
View File
@@ -1,21 +1,23 @@
import random
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.helpers.response_helper import ResponseHelper
from app.api.schemas.collect_loan import CollectLoanSchema from app.api.schemas.collect_loan import CollectLoanSchema, CollectLoanResponseSchema
from app.config import Config
"""
Process the CollectLoan request.
Args:
data (dict): The request data.
Returns:
tuple: JSON response and status code.
"""
class CollectLoanService: class CollectLoanService:
@staticmethod @staticmethod
def process_request(data): def process_request(data):
"""
Process the CollectLoan request.
Args:
data (dict): The request data.
Returns:
dict: A standardized response.
"""
try: try:
logger.info("Processing CollectLoan request") logger.info("Processing CollectLoan request")
@@ -23,37 +25,77 @@ class CollectLoanService:
schema = CollectLoanSchema() schema = CollectLoanSchema()
validated_data = schema.load(data) validated_data = schema.load(data)
# Simulated processing logic amountForCollection = validated_data.get("collectAmount")
response_data = { productId = validated_data.get("productId")
"transactionId": "T002", customerId = validated_data.get("customerId")
"debtId": "273194670", amountCollected = amountForCollection
"customerId": "CN621868", responseDescr= "Loan Collection Successful EMULATOR"
"accountId": "2017821799", fullDescription= "Loan collection completed successfully EMULATOR"
"productId": "101", responseMessage= "Loan collection completed successfully EMULATOR"
"collectAmount": 60000.00, interestCollected = amountForCollection * 0.03
"penalCharge": 0, lienAmount = validated_data.get("lienAmount", 0)
"lienAmount": 20000,
"countryId": "01",
"comment": "Testing CollectionLoanRequest",
"resultCode": "00",
"resultDescription": "Loan Collection Successful"
}
isValid = not (
int(customerId[-1]) in [2, 7, 9]
)
if Config.MIN_AMOUNT_FOR_COLLECTION <= amountForCollection <= Config.MAX_AMOUNT_FOR_COLLECTION:
amountCollected = amountForCollection if lienAmount >= amountForCollection else 0
responseDescr = "Partial Loan Collection Successful EMULATOR"
fullDescription = "Partial Loan collection completed successfully EMULATOR"
responseMessage = "Partial Loan collection completed successfully EMULATOR"
# return ResponseHelper.success( response_data = {
# data=response_data, "transactionId": validated_data.get("transactionId"),
# message="Loan collection completed successfully" "fbnTransactionId": validated_data.get("fbnTransactionId"),
# ) "debtId": validated_data.get("debtId"),
"customerId": validated_data.get("customerId"),
"accountId": validated_data.get("accountId"),
"productId": validated_data.get("productId"),
"amountCollected": amountCollected,
"interestCollected": interestCollected,
"penalChargeCollected": 0,
"lienAmount": lienAmount if amountCollected == 0 else 0,
"countryId": validated_data.get("countryId"),
"comment": validated_data.get("comment", "Testing CollectionLoanRequest EMULATOR"),
"responseCode": "00",
"responseDescr": responseDescr,
"fullDescription": fullDescription,
"responseMessage": responseMessage
}
return response_data else:
response_data = {
"transactionId": validated_data.get("transactionId"),
"fbnTransactionId": validated_data.get("fbnTransactionId"),
"debtId": validated_data.get("debtId"),
"customerId": validated_data.get("customerId"),
"accountId": validated_data.get("accountId"),
"productId": validated_data.get("productId"),
"amountCollected": amountCollected,
"interestCollected": interestCollected,
"penalChargeCollected": 0,
"amountCollected": amountCollected,
"countryId": validated_data.get("countryId"),
"comment": validated_data.get("comment", "Testing CollectionLoanRequest EMULATOR"),
"responseCode": "00",
"responseDescr": responseDescr,
"fullDescription": fullDescription,
"responseMessage": responseMessage
}
# Validate and serialize the response data
response_schema = CollectLoanResponseSchema()
result = response_schema.dump(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",
"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({
@@ -0,0 +1,105 @@
from flask import request, jsonify
from marshmallow import ValidationError
from app.utils.logger import logger
from app.api.schemas.complete_rac_check import CompleteRACcheckSchema, CompleteRACcheckResponseSchema
from datetime import datetime
class CompleteRACcheckService:
@staticmethod
def process_request(data):
"""
Process the CompleteRACcheck request.
Args:
data (dict): The request data.
Returns:
dict: A standardized response.
"""
try:
# Validate input data using CompleteRACcheckSchema
schema = CompleteRACcheckSchema()
validated_data = schema.load(data) # Raises ValidationError if invalid
# Simulated processing logic
# In a real implementation, this would interact with your business logic
# to check the complete RAC criteria
# For demonstration, we'll simulate a successful RAC check with sample data
current_date = datetime.now().strftime("%Y-%m-%d")
response_data = {
"transactionId": validated_data.get('transactionId'),
"customerId": validated_data.get('customerId'),
"accountId": validated_data.get('accountId'),
"CompleteRACCheckResponse": {
"PROCESS_DATE": current_date,
"CIF_ID": "123456789",
"CUST_FIRST_NAME": "Ade",
"CUST_MIDDLE_NAME": "Isaac",
"CUST_LAST_NAME": "Juwon",
"BVN": "44834386619",
"GENDER": "MALE",
"AGE": "31",
"CRM_EMAIL": "test@test.com",
"ALERT_EMAIL": "",
"CRM_PHONE": "2.34804E+12",
"ALERT_PHONE": "",
"CRM_ADDRESS": "",
"OCCUPATION": "Analyst",
"AVERAGE_SALARY": "1,000,000.00",
"STAFF_STAT": "N",
"SALACCT_1": "253844780",
"SALACCT_2": "",
"SALACCT_3": "",
"LOAN_OUSTANDING_BAL": "0",
"EMI": "0",
"ELIG_AMT": "500,000",
"RULE1": "Y",
"RULE2": "Y",
"RULE3": "Y",
"RULE4": "Y",
"RULE5": "Y",
"RULE6": "Y",
"RULE7": "Y",
"RULE8": "Y",
"RULE9": "Y",
"RULE10": "Y",
"RULE11": "Y",
"RULE12": "Y",
"RULE13": "Y",
"RULE14": "Y",
"RULE15": "Y",
"OVERALL_ELIG": "Y",
"SALARYPAYMENT_1": "1000000",
"SALARYPAYMENT_2": "1000000",
"SALARYPAYMENT_3": "1000000",
"SALARYPAYMENT_4": "0",
"SALARYPAYMENT_5": "0",
"SALARYPAYMENT_6": "0",
"OTHERACCT_SAVINGS": "",
"OTHERACCT_CURRENT": ""
},
"resultCode": "00",
"resultDescription": "RAC Check Successful"
}
# Validate the response using the response schema
response_schema = CompleteRACcheckResponseSchema()
validated_response = response_schema.dump(response_data)
return jsonify(validated_response)
except ValidationError as err:
logger.error(f"Validation Error: {err.messages}")
return jsonify({
"resultCode": "01",
"resultDescription": f"Validation error: {err.messages}"
}), 422
except Exception as e:
logger.error(f"An error occurred: {str(e)}", exc_info=True)
return jsonify({
"resultCode": "08",
"resultDescription": f"Error occurred: {str(e)}"
}), 500
+30 -27
View File
@@ -1,8 +1,8 @@
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 import datetime
class DisbursementService: class DisbursementService:
@staticmethod @staticmethod
@@ -14,7 +14,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 +23,43 @@ 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": validated_data.get("fbnTransactionId"), # 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!",
"disburseDate": datetime.datetime.now().isoformat(),
"disburseResult": "00",
"disburseDescription": "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
+80 -29
View File
@@ -2,7 +2,9 @@ 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
from datetime import datetime
from decimal import Decimal
class RACCheckService: class RACCheckService:
@staticmethod @staticmethod
@@ -14,50 +16,99 @@ 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 customer_id = validated_data["customerId"]
response_data = { is_valid = True
"resultCode": "00",
"RACResponse": {
"SalaryAccount": "1", try:
"BVN": "1", salary_count = int(str(customer_id)[-1]) + 1
"BVNAttachedToAccount": "1", if salary_count < 1 or salary_count > 6:
"CRMS": "1", salary_count = 3
"CRC": "1", except ValueError:
"AccountStatus": "1", salary_count = 3
"Lien": "1",
"NoBouncedCheck": "1", salary_payments = {}
"Whitelist": "1", total_salary = 0
"NoPastDueSalaryLoan": "1",
"NoPastDueOtherLoan": "1" for i in range(1, salary_count + 1):
}, salary = (((salary_count + i) * 7919) % 200000 + 10000) * 5
"resultDescription": "RAC Check Successful" salary_payments[f"salarypaymenT_{i}"] = salary
total_salary += salary
average_salary = total_salary // salary_count if salary_count > 0 else 0
rac_response = {
"procesS_DATE": datetime.strptime("2025-06-05", "%Y-%m-%d").date(),
"ciF_ID": "416405737",
"customeR_id": customer_id,
"salaccT_1": "4142904114",
"alerT_PHONE": "2348039301606",
"averagE_SALARY": average_salary,
"loaN_OUSTANDING_BAL": 0,
"emi": 1000,
"eliG_AMT": 25000,
"rule1_45day_sal": is_valid,
"rule2_2m_sal": is_valid,
"rule3_no_bounced_check": is_valid,
"rule4_current_loan_payments": True if is_valid is False else is_valid,
"rule5_no_past_due_fadv_loan": is_valid,
"rule6_no_past_due_other_loan": is_valid,
"rule7_consistent_salary_amount": is_valid,
"rule8_whitelisted": True if is_valid is False else is_valid,
"rule9_regular_account": True if is_valid is False else is_valid,
"rule10_bvn_validation": is_valid,
"rule11_CRC_no_delinquency": is_valid,
"rule12_CRMS_no_delinquency": True if is_valid is False else is_valid,
"rule13_BVN_ignore": is_valid,
"rule14_no_lien": is_valid,
"rule15_null_ignore": True if is_valid is False else is_valid,
"overalL_ELIG": is_valid
# "salarypaymenT_1": 180000,
# "salarypaymenT_2": 50000,
# "salarypaymenT_3": 70000,
# "salarypaymenT_4": 0,
# "salarypaymenT_5": 0,
# "salarypaymenT_6": 0
} }
rac_response.update(salary_payments)
# return ResponseHelper.success(
# data=response_data,
# message="RAC check completed successfully"
# )
return response_data full_response = {
"transactionId": validated_data["transactionId"],
"customerId": validated_data["customerId"],
"accountId": validated_data["accountId"],
"racResponse": rac_response
}
# response_schema = RACCheckResponseSchema()
result = {
"responseCode": "00",
"responseMessage": "Operation Successful",
"data": full_response
}
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
+23 -16
View File
@@ -2,7 +2,11 @@ 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
)
import datetime
class TransactionVerifyService: class TransactionVerifyService:
@@ -26,32 +30,35 @@ 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"),
"disburseVerify": datetime.datetime.now().isoformat(),
"verifyResult": "00",
"verifyDescription": "Collect Status retrieved successfully.",
} }
# 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
+9 -3
View File
@@ -1,17 +1,23 @@
import os import os
from re import M
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")
VALID_API_KEY = os.getenv("VALID_API_KEY", "test-api-key-12345") VALID_API_KEY = os.getenv("VALID_API_KEY", "test-api-key-12345")
MIN_AMOUNT_FOR_COLLECTION = int(os.getenv("MIN_AMOUNT_FOR_COLLECTION", 10000))
MAX_AMOUNT_FOR_COLLECTION = int(os.getenv("MAX_AMOUNT_FOR_COLLECTION", 25000))
# SQLALCHEMY_DATABASE_URI =os.environ.get("DATABASE_URL", "database_url") # SQLALCHEMY_DATABASE_URI =os.environ.get("DATABASE_URL", "database_url")
# SQLALCHEMY_TRACK_MODIFICATIONS = False # SQLALCHEMY_TRACK_MODIFICATIONS = False
# 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()
+53 -30
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"
@@ -33,6 +36,14 @@
"url": "https://www.simbrellang.net" "url": "https://www.simbrellang.net"
} }
}, },
{
"name": "CompleteRACcheck",
"description": "Complete Risk Acceptance Criteria Request",
"externalDocs": {
"description": "Find out more",
"url": "https://www.simbrellang.net"
}
},
{ {
"name": "Disbursement", "name": "Disbursement",
"description": "Loan Disbursement Request", "description": "Loan Disbursement Request",
@@ -99,98 +110,110 @@
} }
], ],
"paths": { "paths": {
"/RACCheck": { "/api/system-health-check": {
"$ref": "swagger/paths/HealthCheck.json"
},
"/api/rac-check": {
"$ref": "swagger/paths/RACCheck.json" "$ref": "swagger/paths/RACCheck.json"
}, },
"/Disbursement": { "/api/CompleteRACcheck": {
"$ref": "swagger/paths/CompleteRACcheck.json"
},
"/api/DisburseLoan": {
"$ref": "swagger/paths/Disbursement.json" "$ref": "swagger/paths/Disbursement.json"
}, },
"/CollectLoan": { "/api/CollectLoan": {
"$ref": "swagger/paths/CollectLoan.json" "$ref": "swagger/paths/CollectLoan.json"
}, },
"/TransactionVerify": { "/api/TransactionVerify": {
"$ref": "swagger/paths/TransactionVerify.json" "$ref": "swagger/paths/TransactionVerify.json"
}, },
"/PenalCharge": { "/api/CollectPenalFee": {
"$ref": "swagger/paths/PenalCharge.json" "$ref": "swagger/paths/PenalCharge.json"
}, },
"/RevokeEnableConsent": { "/api/RevokeEnableConsent": {
"$ref": "swagger/paths/RevokeEnableConsent.json" "$ref": "swagger/paths/RevokeEnableConsent.json"
}, },
"/TokenValidation": { "/api/TokenValidation": {
"$ref": "swagger/paths/TokenValidation.json" "$ref": "swagger/paths/TokenValidation.json"
}, },
"/LienCheck": { "/api/LienCheck": {
"$ref": "swagger/paths/LienCheck.json" "$ref": "swagger/paths/LienCheck.json"
}, },
"/NewTransactionCheck": { "/api/NewTransactionCheck": {
"$ref": "swagger/paths/NewTransactionCheck.json" "$ref": "swagger/paths/NewTransactionCheck.json"
} }
}, },
"components": { "components": {
"schemas": { "schemas": {
"RACCheckRequest": { "RACCheckRequest": {
"$ref": "swagger/schemas/RACCheckRequest.json" "$ref": "./schemas/RACCheckRequest.json"
}, },
"RACCheckResponse": { "RACCheckResponse": {
"$ref": "swagger/schemas/RACCheckResponse.json" "$ref": "./schemas/RACCheckResponse.json"
},
"CompleteRACcheckRequest": {
"$ref": "./schemas/CompleteRACcheckRequest.json"
},
"CompleteRACcheckResponse": {
"$ref": "./schemas/CompleteRACcheckResponse.json"
}, },
"CustomerConsentRequest": { "CustomerConsentRequest": {
"$ref": "swagger/schemas/CustomerConsentRequest.json" "$ref": "./schemas/CustomerConsentRequest.json"
}, },
"CustomerConsentResponse": { "CustomerConsentResponse": {
"$ref": "swagger/schemas/CustomerConsentResponse.json" "$ref": "./schemas/CustomerConsentResponse.json"
}, },
"DisbursementRequest": { "DisbursementRequest": {
"$ref": "swagger/schemas/DisbursementRequest.json" "$ref": "./schemas/DisbursementRequest.json"
}, },
"DisbursementResponse": { "DisbursementResponse": {
"$ref": "swagger/schemas/DisbursementResponse.json" "$ref": "./schemas/DisbursementResponse.json"
}, },
"CollectLoanRequest": { "CollectLoanRequest": {
"$ref": "swagger/schemas/CollectLoanRequest.json" "$ref": "./schemas/CollectLoanRequest.json"
}, },
"CollectLoanResponse": { "CollectLoanResponse": {
"$ref": "swagger/schemas/CollectLoanResponse.json" "$ref": "./schemas/CollectLoanResponse.json"
}, },
"TransactionVerifyRequest": { "TransactionVerifyRequest": {
"$ref": "swagger/schemas/TransactionVerifyRequest.json" "$ref": "./schemas/TransactionVerifyRequest.json"
}, },
"TransactionVerifyResponse": { "TransactionVerifyResponse": {
"$ref": "swagger/schemas/TransactionVerifyResponse.json" "$ref": "./schemas/TransactionVerifyResponse.json"
}, },
"PenalChargeRequest": { "PenalChargeRequest": {
"$ref": "swagger/schemas/PenalChargeRequest.json" "$ref": "./schemas/PenalChargeRequest.json"
}, },
"PenalChargeResponse": { "PenalChargeResponse": {
"$ref": "swagger/schemas/PenalChargeResponse.json" "$ref": "./schemas/PenalChargeResponse.json"
}, },
"RevokeEnableConsentRequest": { "RevokeEnableConsentRequest": {
"$ref": "swagger/schemas/RevokeEnableConsentRequest.json" "$ref": "./schemas/RevokeEnableConsentRequest.json"
}, },
"RevokeEnableConsentResponse": { "RevokeEnableConsentResponse": {
"$ref": "swagger/schemas/RevokeEnableConsentResponse.json" "$ref": "./schemas/RevokeEnableConsentResponse.json"
}, },
"TokenValidationRequest": { "TokenValidationRequest": {
"$ref": "swagger/schemas/TokenValidationRequest.json" "$ref": "./schemas/TokenValidationRequest.json"
}, },
"TokenValidationResponse": { "TokenValidationResponse": {
"$ref": "swagger/schemas/TokenValidationResponse.json" "$ref": "./schemas/TokenValidationResponse.json"
}, },
"NewTransactionCheckRequest": { "NewTransactionCheckRequest": {
"$ref": "swagger/schemas/NewTransactionCheckRequest.json" "$ref": "./schemas/NewTransactionCheckRequest.json"
}, },
"NewTransactionCheckResponse": { "NewTransactionCheckResponse": {
"$ref": "swagger/schemas/NewTransactionCheckResponse.json" "$ref": "./schemas/NewTransactionCheckResponse.json"
}, },
"LienCheckRequest": { "LienCheckRequest": {
"$ref": "swagger/schemas/LienCheckRequest.json" "$ref": "./schemas/LienCheckRequest.json"
}, },
"LienCheckResponse": { "LienCheckResponse": {
"$ref": "swagger/schemas/LienCheckResponse.json" "$ref": "./schemas/LienCheckResponse.json"
}, },
"ApiResponse": { "ApiResponse": {
"$ref": "swagger/schemas/ApiResponse.json" "$ref": "./schemas/ApiResponse.json"
} }
}, },
"securitySchemes": { "securitySchemes": {
+56
View File
@@ -0,0 +1,56 @@
{
"post": {
"tags": ["CompleteRACcheck"],
"summary": "Complete Risk Acceptance Criteria check",
"description": "This request is used to check if a customer passes the Complete Bank Risk Acceptance Criteria",
"operationId": "completeRACcheck",
"requestBody": {
"description": "Complete RAC check request details",
"content": {
"application/json": {
"schema": {
"$ref": "../schemas/CompleteRACcheckRequest.json"
}
},
"application/xml": {
"schema": {
"$ref": "../schemas/CompleteRACcheckRequest.json"
}
},
"application/x-www-form-urlencoded": {
"schema": {
"$ref": "../schemas/CompleteRACcheckRequest.json"
}
}
},
"required": true
},
"responses": {
"200": {
"description": "Complete RAC Check Successful",
"content": {
"application/json": {
"schema": {
"$ref": "../schemas/CompleteRACcheckResponse.json"
}
},
"application/xml": {
"schema": {
"$ref": "../schemas/CompleteRACcheckResponse.json"
}
}
}
},
"400": {
"description": "Invalid request parameters"
},
"401": {
"description": "Authentication failed"
},
"500": {
"description": "Internal server error"
}
}
}
}
+19
View File
@@ -0,0 +1,19 @@
{
"get": {
"tags": ["System"],
"summary": "System Health Check",
"description": "Returns the current health status of the system",
"responses": {
"200": {
"description": "Successful operation",
"content": {
"application/json": {
"schema": {
"$ref": "../schemas/HealthCheckResponse.json"
}
}
}
}
}
}
}
+64 -67
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
} }
+66 -67
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
} }
@@ -0,0 +1,109 @@
{
"type": "object",
"required": ["transactionId", "customerId", "accountId", "RAC_Array"],
"properties": {
"transactionId": {
"type": "string",
"description": "Unique identifier of transaction. This transaction Id must be consistent across all platforms",
"example": "T001"
},
"fbnTransactionId": {
"type": "string",
"description": "FirstBank transaction ID",
"example": "Tr201712RK9232P115"
},
"customerId": {
"type": "string",
"description": "Unique identifier of a user",
"example": "CN621868"
},
"accountId": {
"type": "string",
"description": "Specific identifier of a user's account",
"example": "2017821799"
},
"RAC_Array": {
"type": "object",
"description": "Risk Acceptance Criteria array",
"properties": {
"Salary account": {
"type": "string",
"description": "Has Salary account or Not",
"example": "1"
},
"BVN": {
"type": "string",
"description": "BVN Ok",
"example": "1"
},
"BVN attached to account": {
"type": "string",
"description": "BVN attached to account",
"example": "1"
},
"CRC": {
"type": "string",
"description": "No Delinquent loan",
"example": "1"
},
"CRMS": {
"type": "string",
"description": "No Delinquent loan",
"example": "1"
},
"Account status": {
"type": "string",
"description": "Has 'Regular' account status",
"example": "1"
},
"Lien": {
"type": "string",
"description": "No Lien on account",
"example": "1"
},
"No bounced check": {
"type": "string",
"description": "No Bounced (Ever?)",
"example": "1"
},
"Whitelist": {
"type": "string",
"description": "False if blacklisted",
"example": "1"
},
"No Past Due Salary Loan": {
"type": "string",
"description": "No Past Due Salary Loan",
"example": "1"
},
"No Past Due Other Loans": {
"type": "string",
"description": "No Past Due Other Loans",
"example": "1"
}
}
}
},
"example": {
"transactionId": "T001",
"fbnTransactionId": "Tr201712RK9232P115",
"customerId": "CN621868",
"accountId": "2017821799",
"RAC_Array": {
"Salary account": "1",
"BVN": "1",
"BVN attached to account": "1",
"CRC": "1",
"CRMS": "1",
"Account status": "1",
"Lien": "1",
"No bounced check": "1",
"Whitelist": "1",
"No Past Due Salary Loan": "1",
"No Past Due Other Loans": "1"
}
},
"xml": {
"name": "CompleteRACcheckRequest"
}
}
@@ -0,0 +1,332 @@
{
"type": "object",
"required": [
"transactionId",
"customerId",
"accountId",
"CompleteRACCheckResponse",
"resultCode",
"resultDescription"
],
"properties": {
"transactionId": {
"type": "string",
"description": "Unique identifier of transaction in Simbrella system",
"example": "T001"
},
"customerId": {
"type": "string",
"description": "Unique identifier of a user",
"example": "CN621868"
},
"accountId": {
"type": "string",
"description": "Specific identifier of a user's account",
"example": "2017821799"
},
"CompleteRACCheckResponse": {
"type": "object",
"description": "Complete RAC check response details",
"properties": {
"PROCESS_DATE": {
"type": "string",
"description": "RAC process Date",
"example": "2025-05-06"
},
"CIF_ID": {
"type": "string",
"description": "Customer Information File ID",
"example": "123456789"
},
"CUST_FIRST_NAME": {
"type": "string",
"description": "Customer's First Name",
"example": "Ade"
},
"CUST_MIDDLE_NAME": {
"type": "string",
"description": "Customer's Middlename",
"example": "Isaac"
},
"CUST_LAST_NAME": {
"type": "string",
"description": "Customer's Last name",
"example": "Juwon"
},
"BVN": {
"type": "string",
"description": "Bank Verification Number",
"example": "44834386619"
},
"GENDER": {
"type": "string",
"description": "Customers gender (M/F)",
"example": "MALE"
},
"AGE": {
"type": "string",
"description": "Customer's Age",
"example": "31"
},
"CRM_EMAIL": {
"type": "string",
"description": "Customer's Email address",
"example": "test@test.com"
},
"ALERT_EMAIL": {
"type": "string",
"description": "Alert Email Address",
"example": ""
},
"CRM_PHONE": {
"type": "string",
"description": "Customer's Phone Number",
"example": "2.34804E+12"
},
"ALERT_PHONE": {
"type": "string",
"description": "Alert Phone number",
"example": ""
},
"CRM_ADDRESS": {
"type": "string",
"description": "Customer's Address",
"example": ""
},
"OCCUPATION": {
"type": "string",
"description": "Customer's Occupation",
"example": "Analyst"
},
"AVERAGE_SALARY": {
"type": "string",
"description": "Customer's Avg Salary",
"example": "1,000,000.00"
},
"STAFF_STAT": {
"type": "string",
"description": "Staff Status",
"example": "N"
},
"SALACCT_1": {
"type": "string",
"description": "Salary account 1",
"example": "253844780"
},
"SALACCT_2": {
"type": "string",
"description": "Salary account 2",
"example": ""
},
"SALACCT_3": {
"type": "string",
"description": "Salary account 3",
"example": ""
},
"LOAN_OUSTANDING_BAL": {
"type": "string",
"description": "Outstanding Balance",
"example": "0"
},
"EMI": {
"type": "string",
"description": "Equated Monthly Installment",
"example": "0"
},
"ELIG_AMT": {
"type": "string",
"description": "Eligible Amount",
"example": "500,000"
},
"RULE1": {
"type": "string",
"description": "Rule 1",
"example": "Y"
},
"RULE2": {
"type": "string",
"description": "Rule 2",
"example": "Y"
},
"RULE3": {
"type": "string",
"description": "Rule 3",
"example": "Y"
},
"RULE4": {
"type": "string",
"description": "Rule 4",
"example": "Y"
},
"RULE5": {
"type": "string",
"description": "Rule 5",
"example": "Y"
},
"RULE6": {
"type": "string",
"description": "Rule 6",
"example": "Y"
},
"RULE7": {
"type": "string",
"description": "Rule 7",
"example": "Y"
},
"RULE8": {
"type": "string",
"description": "Rule 8",
"example": "Y"
},
"RULE9": {
"type": "string",
"description": "Rule 9",
"example": "Y"
},
"RULE10": {
"type": "string",
"description": "Rule 10",
"example": "Y"
},
"RULE11": {
"type": "string",
"description": "Rule 11",
"example": "Y"
},
"RULE12": {
"type": "string",
"description": "Rule 12",
"example": "Y"
},
"RULE13": {
"type": "string",
"description": "Rule 13",
"example": "Y"
},
"RULE14": {
"type": "string",
"description": "Rule 14",
"example": "Y"
},
"RULE15": {
"type": "string",
"description": "Rule 15",
"example": "Y"
},
"OVERALL_ELIG": {
"type": "string",
"description": "Overall Eligible Amount",
"example": "Y"
},
"SALARYPAYMENT_1": {
"type": "string",
"description": "Salary Payment 1",
"example": "1000000"
},
"SALARYPAYMENT_2": {
"type": "string",
"description": "Salary Payment 2",
"example": "1000000"
},
"SALARYPAYMENT_3": {
"type": "string",
"description": "Salary Payment 3",
"example": "1000000"
},
"SALARYPAYMENT_4": {
"type": "string",
"description": "Salary Payment 4",
"example": "0"
},
"SALARYPAYMENT_5": {
"type": "string",
"description": "Salary Payment 5",
"example": "0"
},
"SALARYPAYMENT_6": {
"type": "string",
"description": "Salary Payment 6",
"example": "0"
},
"OTHERACCT_SAVINGS": {
"type": "string",
"description": "Other customer's account_Saving",
"example": ""
},
"OTHERACCT_CURRENT": {
"type": "string",
"description": "Other Customer's account_Current",
"example": ""
}
}
},
"resultCode": {
"type": "string",
"description": "Result code of executed transaction, e.g. (00 Success etc.) see result codes table",
"example": "00"
},
"resultDescription": {
"type": "string",
"description": "Description of provided result code",
"example": "RAC Check Successful"
}
},
"example": {
"transactionId": "T001",
"customerId": "CN621868",
"accountId": "2017821799",
"CompleteRACCheckResponse": {
"PROCESS_DATE": "2025-05-06",
"CIF_ID": "123456789",
"CUST_FIRST_NAME": "Ade",
"CUST_MIDDLE_NAME": "Isaac",
"CUST_LAST_NAME": "Juwon",
"BVN": "44834386619",
"GENDER": "MALE",
"AGE": "31",
"CRM_EMAIL": "test@test.com",
"ALERT_EMAIL": "",
"CRM_PHONE": "2.34804E+12",
"ALERT_PHONE": "",
"CRM_ADDRESS": "",
"OCCUPATION": "Analyst",
"AVERAGE_SALARY": "1,000,000.00",
"STAFF_STAT": "N",
"SALACCT_1": "253844780",
"SALACCT_2": "",
"SALACCT_3": "",
"LOAN_OUSTANDING_BAL": "0",
"EMI": "0",
"ELIG_AMT": "500,000",
"RULE1": "Y",
"RULE2": "Y",
"RULE3": "Y",
"RULE4": "Y",
"RULE5": "Y",
"RULE6": "Y",
"RULE7": "Y",
"RULE8": "Y",
"RULE9": "Y",
"RULE10": "Y",
"RULE11": "Y",
"RULE12": "Y",
"RULE13": "Y",
"RULE14": "Y",
"RULE15": "Y",
"OVERALL_ELIG": "Y",
"SALARYPAYMENT_1": "1000000",
"SALARYPAYMENT_2": "1000000",
"SALARYPAYMENT_3": "1000000",
"SALARYPAYMENT_4": "0",
"SALARYPAYMENT_5": "0",
"SALARYPAYMENT_6": "0",
"OTHERACCT_SAVINGS": "",
"OTHERACCT_CURRENT": ""
},
"resultCode": "00",
"resultDescription": "RAC Check Successful"
},
"xml": {
"name": "CompleteRACcheckResponse"
}
}
+75 -74
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
} }
+95 -79
View File
@@ -1,82 +1,98 @@
{ {
"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
},
"disburseDate": {
"type": "string",
"format": "date-time",
"example": "2023-10-01T12:00:00Z",
"nullable": true
},
"disburseResult": {
"type": "string",
"example": "00",
"nullable": true
},
"disburseDescription": {
"type": "string",
"example": "Loan Request Completed Successfully!",
"nullable": true
}
},
"required": [
"provideAmount",
"collectAmountInterest",
"collectAmountMgtFee",
"collectAmountInsurance",
"collectAmountVAT"
]
} }
@@ -0,0 +1,17 @@
{
"type": "object",
"properties": {
"status": {
"type": "string",
"example": "Active"
},
"responseCode": {
"type": "string",
"example": "00"
},
"responseMessage": {
"type": "string",
"example": "Successful"
}
}
}
@@ -0,0 +1,17 @@
{
"type": "object",
"properties": {
"status": {
"type": "string",
"example": "Active"
},
"responseCode": {
"type": "string",
"example": "00"
},
"responseMessage": {
"type": "string",
"example": "Successful"
}
}
}
+56 -38
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
} }
+34 -10
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
} }
+36 -87
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"
}
} }
+90 -61
View File
@@ -1,65 +1,94 @@
{ {
"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": {
"PROCESS_DATE": {
"type": "string",
"format": "date",
"example": "2025-06-05"
},
"CIF_ID": {
"type": "string",
"example": "123456789"
},
"CUSTOMER_id": {
"type": "string",
"example": "987654321"
},
"SALACCT_1": {
"type": "string",
"example": "34567831"
},
"ALERT_PHONE": {
"type": "string",
"example": "2348031234567"
},
"AVERAGE_SALARY": {
"type": "number",
"format": "decimal",
"example": 50000
},
"LOAN_OUSTANDING_BAL": {
"type": "number",
"format": "decimal",
"example": 0
},
"EMI": {
"type": "number",
"format": "decimal",
"example": 10000
},
"ELIG_AMT": {
"type": "number",
"format": "decimal",
"example": 25000
},
"rule1-45day-sal": { "type": "boolean", "example": true },
"rule2-2m-sal": { "type": "boolean", "example": true },
"rule3-no-bounced-check": { "type": "boolean", "example": true },
"rule4-current-loan-payments": { "type": "boolean", "example": true },
"rule5-no-past-due-fadv-loan": { "type": "boolean", "example": true },
"rule6--no-past-due-other-loan": { "type": "boolean", "example": true },
"rule7-consistent-salary-amount": { "type": "boolean", "example": true },
"rule8-whitelisted": { "type": "boolean", "example": true },
"rule9-regular-account": { "type": "boolean", "example": true },
"rule10-bvn-validation": { "type": "boolean", "example": true },
"rule11-CRC-no-delinquency": { "type": "boolean", "example": true },
"rule12-CRMS-no-delinquency": { "type": "boolean", "example": true },
"rule13-BVN-ignore": { "type": "boolean", "example": true },
"rule14-no-lien": { "type": "boolean", "example": true },
"rule15-null-ignore": { "type": "boolean", "example": true },
"OVERALL_ELIG": { "type": "boolean", "example": true },
"SALARYPAYMENT_1": { "type": "number", "format": "decimal", "example": 50000 },
"SALARYPAYMENT_2": { "type": "number", "format": "decimal", "example": 50000 },
"SALARYPAYMENT_3": { "type": "number", "format": "decimal", "example": 50000 },
"SALARYPAYMENT_4": { "type": "number", "format": "decimal", "example": 50000 },
"SALARYPAYMENT_5": { "type": "number", "format": "decimal", "example": 50000 },
"SALARYPAYMENT_6": { "type": "number", "format": "decimal", "example": 50000 }
}
} }
},
"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,62 @@
{ {
"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"
},
"disburseVerify":{
"type": "string",
"format": "date-time",
"example": "2023-10-01T12:00:00Z",
"nullable": true
},
"verifyResult": {
"type": "string",
"example": "Success"
},
"verifyDescription": {
"type": "string",
"example": "Disbursement was verified and collection completed."
} }
},
"required": [
"providedAmount",
"collectedAmount"
],
"additionalProperties": false
} }
+1 -3
View File
@@ -5,11 +5,9 @@ marshmallow==3.19.0
Flask-Cors==3.0.10 Flask-Cors==3.0.10
gunicorn gunicorn
flask-swagger-ui flask-swagger-ui
python-dotenv
# Logging (Python Standard Library, for reference) # Logging (Python Standard Library, for reference)