From d0d51f35c07c05b3ecab2f33dacdad9a50cda28a Mon Sep 17 00:00:00 2001 From: Chinenye Nmoh Date: Sun, 18 May 2025 20:18:15 +0100 Subject: [PATCH] made changes on the api to match bank api --- Pipfile | 18 ++ Pipfile.lock | 213 ++++++++++++++++++ app/__init__.py | 13 +- app/api/routes/routes.py | 67 ++++-- app/api/schemas/collect_loan.py | 40 ++-- app/api/schemas/disbursement.py | 38 +++- app/api/schemas/penal_charge.py | 33 ++- app/api/schemas/rac_check.py | 29 ++- app/api/schemas/transaction_verify.py | 27 ++- app/api/services/collect_loan.py | 42 ++-- app/api/services/disbursement.py | 53 +++-- app/api/services/penal_charge.py | 29 +-- app/api/services/rac_check.py | 57 +++-- app/api/services/transaction_verify.py | 35 +-- app/config.py | 9 +- app/swagger/digifi_swagger.json | 42 ++-- app/swagger/schemas/CollectLoanRequest.json | 133 ++++++----- app/swagger/schemas/CollectLoanResponse.json | 135 ++++++----- app/swagger/schemas/DisbursementRequest.json | 151 +++++++------ app/swagger/schemas/DisbursementResponse.json | 160 ++++++------- app/swagger/schemas/PenalChargeRequest.json | 96 ++++---- app/swagger/schemas/PenalChargeResponse.json | 46 +++- app/swagger/schemas/RACCheckRequest.json | 125 +++------- app/swagger/schemas/RACCheckResponse.json | 126 ++++++----- .../schemas/TransactionVerifyRequest.json | 63 +++--- .../schemas/TransactionVerifyResponse.json | 81 ++++--- 26 files changed, 1085 insertions(+), 776 deletions(-) create mode 100644 Pipfile create mode 100644 Pipfile.lock diff --git a/Pipfile b/Pipfile new file mode 100644 index 0000000..0be475b --- /dev/null +++ b/Pipfile @@ -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" diff --git a/Pipfile.lock b/Pipfile.lock new file mode 100644 index 0000000..7e5ea78 --- /dev/null +++ b/Pipfile.lock @@ -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": {} +} diff --git a/app/__init__.py b/app/__init__.py index e7b7836..7d6c4f2 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -13,25 +13,20 @@ def create_app(): # Load configuration app.config.from_object(Config) - - CORS(app) + CORS(app) # Swagger Doc SWAGGER_URL = app.config.get("SWAGGER_URL") API_URL = app.config.get("API_URL") - - # Register blueprints - app.register_blueprint(api) + # Register blueprints with /api prefix for the main API routes + app.register_blueprint(api, url_prefix='/api') swagger_ui_blueprint = get_swaggerui_blueprint(SWAGGER_URL, API_URL) app.register_blueprint(swagger_ui_blueprint, url_prefix=SWAGGER_URL) - + # Error Handlers register_error_handlers(app) - - - return app diff --git a/app/api/routes/routes.py b/app/api/routes/routes.py index d797500..1669c4d 100644 --- a/app/api/routes/routes.py +++ b/app/api/routes/routes.py @@ -40,14 +40,17 @@ def serve_paths(filename): return send_from_directory(swagger_dir, filename) # RACCheck Endpoint -@api.route('/RACCheck', methods=['POST']) +@api.route('/rac-check', methods=['POST']) @require_api_key @require_app_id def rac_check(): - data = request.get_json() - # logger.info(f"RACCheck request received: {data}") - response = RACCheckService.process_request(data) - return response + try: + data = request.get_json() + response = RACCheckService.process_request(data) + 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']) @@ -60,45 +63,61 @@ def complete_rac_check(): return response # Disbursement Endpoint -@api.route('/Disbursement', methods=['POST']) +@api.route('/DisburseLoan', methods=['POST']) @require_api_key @require_app_id def disbursement(): - - data = request.get_json() - # logger.info(f"Disbursement request received: {data}") - response = DisbursementService.process_request(data) - return response + try: + data = request.get_json() + # logger.info(f"Disbursement request received: {data}") + response = DisbursementService.process_request(data) + return response + except Exception as e: + logger.exception("Unhandled exception in /Disbursement route") + return jsonify({"message": "Unhandled server error"}), 500 # CollectLoan Endpoint @api.route('/CollectLoan', methods=['POST']) @require_api_key @require_app_id def collect_loan(): - data = request.get_json() - # logger.info(f"CollectLoan request received: {data}") - response = CollectLoanService.process_request(data) - return response + try: + data = request.get_json() + # logger.info(f"CollectLoan request received: {data}") + 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 @api.route('/TransactionVerify', methods=['POST']) @require_api_key @require_app_id def transaction_verify(): - data = request.get_json() - # logger.info(f"TransactionVerify request received: {data}") - response = TransactionVerifyService.process_request(data) - return response + try: + data = request.get_json() + # logger.info(f"TransactionVerify request received: {data}") + 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 -@api.route('/PenalCharge', methods=['POST']) +@api.route('/CollectPenalFee', methods=['POST']) @require_api_key @require_app_id def penal_charge(): - data = request.get_json() - # logger.info(f"PenalCharge request received: {data}") - response = PenalChargeService.process_request(data) - return response + try: + data = request.get_json() + # logger.info(f"PenalCharge request received: {data}") + 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 @api.route('/RevokeEnableConsent', methods=['POST']) diff --git a/app/api/schemas/collect_loan.py b/app/api/schemas/collect_loan.py index fb5bc76..e3235a7 100644 --- a/app/api/schemas/collect_loan.py +++ b/app/api/schemas/collect_loan.py @@ -1,16 +1,30 @@ from marshmallow import Schema, fields -# Collect Loan Schema class CollectLoanSchema(Schema): - transactionId = fields.Str(required=True) - fbnTransactionId = fields.Str(required=True) - debtId = fields.Str(required=True) - customerId = fields.Str(required=True) - accountId = fields.Str(required=True) - productId = fields.Str(required=True) - collectAmount = fields.Float(required=True) - penalCharge = fields.Float(required=False) # Optional - collectionMethod = fields.Int(required=True) - lienAmount = fields.Float(required=True) - countryId = fields.Str(required=True) - comment = fields.Str(required=False) # Optional \ No newline at end of file + channel = fields.Str(allow_none=True) + transactionId = fields.Str(allow_none=True) + fbnTransactionId = fields.Str(allow_none=True) + debtId = fields.Str(allow_none=True) + accountId = fields.Str(allow_none=True) + customerId = fields.Str(allow_none=True) + productId = fields.Str(allow_none=True) + collectAmount = fields.Float(required=True) + penalCharge = fields.Float(required=True) + collectionMethod = fields.Str(allow_none=True) + lienAmount = fields.Float(required=True) + 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) diff --git a/app/api/schemas/disbursement.py b/app/api/schemas/disbursement.py index 16f7aa1..b7c1afd 100644 --- a/app/api/schemas/disbursement.py +++ b/app/api/schemas/disbursement.py @@ -1,17 +1,35 @@ from marshmallow import Schema, fields -# Disbursement Schema class DisbursementSchema(Schema): - requestId = fields.Str(required=True) - debtId = fields.Str(required=True) - transactionId = fields.Str(required=True) - customerId = fields.Str(required=True) - accountId = fields.Str(required=True) - productId = fields.Str(required=True) + transactionId = fields.Str(required=False, allow_none=True) + fbnTransactionId = fields.Str(required=False, allow_none=True) + debtId = fields.Str(required=False, allow_none=True) + customerId = fields.Str(required=False, allow_none=True) + accountId = fields.Str(required=False, allow_none=True) + productId = fields.Str(required=False, allow_none=True) provideAmount = fields.Float(required=True) - collectAmountInterest = fields.Float(required=False) # Optional + collectAmountInterest = fields.Float(required=True) collectAmountMgtFee = fields.Float(required=True) collectAmountInsurance = fields.Float(required=True) collectAmountVAT = fields.Float(required=True) - countryId = fields.Str(required=True) - comment = fields.Str(required=False) # Optional \ No newline at end of file + countryId = fields.Str(required=False, allow_none=True) + 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) + + \ No newline at end of file diff --git a/app/api/schemas/penal_charge.py b/app/api/schemas/penal_charge.py index 40d6d0a..5b49171 100644 --- a/app/api/schemas/penal_charge.py +++ b/app/api/schemas/penal_charge.py @@ -1,14 +1,25 @@ from marshmallow import Schema, fields - -# Penal Charge Schema +# This file contains the schema for penal charge operations class PenalChargeSchema(Schema): - transactionId = fields.Str(required=True) - fbnTransactionId = fields.Str(required=True) - debtId = fields.Str(required=True) - customerId = fields.Str(required=True) - accountId = fields.Str(required=True) - penalCharge = fields.Decimal(required=True) - lienAmount = fields.Decimal(required=True) - countryId = fields.Str(required=True) - comment = fields.Str(required=False) + channel = fields.Str(allow_none=True) + transactionId = fields.Str(allow_none=True) + fbnTransactionId = fields.Str(allow_none=True) + debtId = fields.Str(allow_none=True) + accountId = fields.Str(allow_none=True) + penalCharge = fields.Float(required=True) + customerId = fields.Str(allow_none=True) + lienAmount = fields.Float(required=True) + 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) + + \ No newline at end of file diff --git a/app/api/schemas/rac_check.py b/app/api/schemas/rac_check.py index 3b858d2..9f60795 100644 --- a/app/api/schemas/rac_check.py +++ b/app/api/schemas/rac_check.py @@ -1,18 +1,15 @@ from marshmallow import Schema, fields class RACItemSchema(Schema): - salaryAccount = fields.Bool(required=True) - bvn = fields.Str(required=True) - crc = fields.Bool(required=True) - crms = fields.Bool(required=True) - accountStatus = fields.Str(required=True) - lien = fields.Bool(required=True) + hasSalaryAccount = fields.Bool(required=True) + bvnValidated = fields.Bool(required=True) + creditBureauCheck = fields.Bool(required=True) + crmsCheck = fields.Bool(required=True) + accountStatus = fields.Bool(required=True) + hasLien = fields.Bool(required=True) noBouncedCheck = fields.Bool(required=True) - existingLoan = fields.Bool(required=True) - whitelist = fields.Bool(required=True) - noPastDueSalaryLoan = fields.Bool(required=True) - noPastDueOtherLoans = fields.Bool(required=True) - + isWhitelisted = fields.Bool(required=True) + hasPastDueLoan = fields.Bool(required=True) # RAC Check Schema class RACCheckSchema(Schema): @@ -20,4 +17,12 @@ class RACCheckSchema(Schema): fbnTransactionId = fields.Str(required=True) customerId = fields.Str(required=True) accountId = fields.Str(required=True) - RAC_Array = fields.List(fields.Nested(RACItemSchema), required=True) \ No newline at end of file + 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) \ No newline at end of file diff --git a/app/api/schemas/transaction_verify.py b/app/api/schemas/transaction_verify.py index 221e2b6..53d614e 100644 --- a/app/api/schemas/transaction_verify.py +++ b/app/api/schemas/transaction_verify.py @@ -1,12 +1,21 @@ from marshmallow import Schema, fields - -# Transaction Verify Schema class TransactionVerifySchema(Schema): - counter = fields.Str(required=True) - transactionId = fields.Str(required=True) - requestID = fields.Str(required=True) - customerId = fields.Str(required=True) - accountId = fields.Str(required=True) - countryId = fields.Str(required=True) # Static value “01” - transactionType = fields.Str(required=True) \ No newline at end of file + channel = fields.Str(allow_none=True) + accountId = fields.Str(allow_none=True) + customerId = fields.Str(allow_none=True) + transactionId = fields.Str(allow_none=True) + transactionType = fields.Str(allow_none=True) + countryId = fields.Str(allow_none=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) \ No newline at end of file diff --git a/app/api/services/collect_loan.py b/app/api/services/collect_loan.py index 1c99a4c..a15f729 100644 --- a/app/api/services/collect_loan.py +++ b/app/api/services/collect_loan.py @@ -2,7 +2,7 @@ from flask import request, jsonify from marshmallow import ValidationError from app.utils.logger import logger 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: @staticmethod @@ -14,7 +14,7 @@ class CollectLoanService: data (dict): The request data. Returns: - dict: A standardized response. + tuple: JSON response and status code. """ try: logger.info("Processing CollectLoan request") @@ -25,35 +25,33 @@ class CollectLoanService: # Simulated processing logic response_data = { - "transactionId": "T002", - "debtId": "273194670", - "customerId": "CN621868", - "accountId": "2017821799", - "productId": "101", - "collectAmount": 60000.00, - "penalCharge": 0, - "lienAmount": 20000, - "countryId": "01", - "comment": "Testing CollectionLoanRequest", - "resultCode": "00", - "resultDescription": "Loan Collection Successful" + "transactionId": validated_data.get("transactionId", "T002"), + "debtId": validated_data.get("debtId", "273194670"), + "customerId": validated_data.get("customerId", "CN621868"), + "accountId": validated_data.get("accountId", "2017821799"), + "productId": validated_data.get("productId", "101"), + "amountCollected": validated_data.get("collectAmount", 60000.00), + "countryId": validated_data.get("countryId", "01"), + "comment": validated_data.get("comment", "Testing CollectionLoanRequest"), + "responseCode": "00", + "responseDescr": "Loan Collection Successful", + "fullDescription": "Loan collection completed successfully", + "responseMessage": "Loan collection completed successfully" } + # Validate and serialize the response data + response_schema = CollectLoanResponseSchema() + result = response_schema.dump(response_data) - # return ResponseHelper.success( - # data=response_data, - # message="Loan collection completed successfully" - # ) - - return response_data + return jsonify(result), 200 except ValidationError as err: logger.error(f"Validation Error: {err.messages}") return jsonify({ - "message": "Validation exception" + "message": "Validation exception", + "errors": err.messages }) , 422 - except Exception as e: logger.error(f"An error occurred: {str(e)}", exc_info=True) return jsonify({ diff --git a/app/api/services/disbursement.py b/app/api/services/disbursement.py index c94c910..9000119 100644 --- a/app/api/services/disbursement.py +++ b/app/api/services/disbursement.py @@ -1,8 +1,7 @@ from flask import request, jsonify from marshmallow import ValidationError from app.utils.logger import logger -from app.api.helpers.response_helper import ResponseHelper -from app.api.schemas.disbursement import DisbursementSchema +from app.api.schemas.disbursement import DisbursementSchema, DisburseLoanResponseSchema class DisbursementService: @staticmethod @@ -14,7 +13,7 @@ class DisbursementService: data (dict): The request data. Returns: - dict: A standardized response. + tuple: JSON response and HTTP status code. """ try: logger.info("Processing Disbursement request") @@ -23,40 +22,40 @@ class DisbursementService: schema = DisbursementSchema() 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 = { - "transactionId": "T001", - "TransactionId": "Tr201712RK9232P115", - "debtId": "273194670", - "customerId": "CN621868", - "accountId": "2017821799", - "productId": "101", - "provideAmount": 100000.0, - "collectAmountInterest": 5000, - "collectAmountMgtFee": 1000, - "collectAmountInsurance": 1000, - "collectAmountVAT": 75, - "countryId": "01", - "resultCode": "00", - "resultDescription": "Loan Request Completed Successfully!" + "transactionId": validated_data.get("transactionId"), + "fbnTransactionId": "Tr201712RK9232P115", # Example or generated value + "debtId": validated_data.get("debtId"), + "customerId": validated_data.get("customerId"), + "accountId": validated_data.get("accountId"), + "productId": validated_data.get("productId"), + "provideAmount": validated_data.get("provideAmount"), + "collectAmountInterest": validated_data.get("collectAmountInterest"), + "collectAmountMgtFee": validated_data.get("collectAmountMgtFee"), + "collectAmountInsurance": validated_data.get("collectAmountInsurance"), + "collectAmountVAT": validated_data.get("collectAmountVAT"), + "countryId": validated_data.get("countryId"), + "responseCode": "00", # success code example + "responseMessage": "Loan Request Completed Successfully!" } + # Serialize response + response_schema = DisburseLoanResponseSchema() + result = response_schema.dump(response_data) - # return ResponseHelper.success( - # data=response_data, - # message="Disbursement completed successfully" - # ) - - return response_data + return jsonify(result), 200 except ValidationError as err: logger.error(f"Validation Error: {err.messages}") return jsonify({ - "message": "Validation exception" - }) , 422 + "message": "Validation exception", + "errors": err.messages + }), 422 except Exception as e: logger.error(f"An error occurred: {str(e)}", exc_info=True) return jsonify({ "message": "Internal Server Error" - }) , 500 + }), 500 diff --git a/app/api/services/penal_charge.py b/app/api/services/penal_charge.py index 8a4924c..2a2dec6 100644 --- a/app/api/services/penal_charge.py +++ b/app/api/services/penal_charge.py @@ -2,7 +2,7 @@ from flask import request, jsonify from marshmallow import ValidationError from app.utils.logger import logger 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: @@ -22,30 +22,33 @@ class PenalChargeService: # Validate input data using PenalChargeSchema schema = PenalChargeSchema() - validated_data = schema.load(data) # Raises ValidationError if invalid + validated_data = schema.load(data) # Simulated processing logic response_data = { - "resultCode": "00", - "resultDescription": "Penal charge debited successfully" + "customerId": validated_data.get("customerId"), + "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( - # data=response_data, - # message="Penal charge applied successfully" - # ) - - return response_data + return result except ValidationError as err: logger.error(f"Validation Error: {err.messages}") return jsonify({ - "message": "Validation exception" - }) , 422 + "message": "Validation exception", + "errors": err.messages + }), 422 except Exception as e: logger.error(f"An error occurred: {str(e)}", exc_info=True) return jsonify({ "message": "Internal Server Error" - }) , 500 + }), 500 diff --git a/app/api/services/rac_check.py b/app/api/services/rac_check.py index cdc6295..df4c7eb 100644 --- a/app/api/services/rac_check.py +++ b/app/api/services/rac_check.py @@ -2,7 +2,7 @@ from flask import request, jsonify from marshmallow import ValidationError from app.utils.logger import logger 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: @staticmethod @@ -14,50 +14,49 @@ class RACCheckService: data (dict): The request data. Returns: - dict: A standardized response. + tuple: JSON response and status code. """ try: logger.info("Processing RACCheck request") - # Validate input data using RACCheckSchema + # Validate input data schema = RACCheckSchema() - validated_data = schema.load(data) # Raises ValidationError if invalid + validated_data = schema.load(data) - # Simulated processing logic - response_data = { - "resultCode": "00", - "RACResponse": { - "SalaryAccount": "1", - "BVN": "1", - "BVNAttachedToAccount": "1", - "CRMS": "1", - "CRC": "1", - "AccountStatus": "1", - "Lien": "1", - "NoBouncedCheck": "1", - "Whitelist": "1", - "NoPastDueSalaryLoan": "1", - "NoPastDueOtherLoan": "1" - }, - "resultDescription": "RAC Check Successful" + # Simulated RAC check logic — create racResponse manually or via logic + rac_response = { + "hasSalaryAccount": True, + "bvnValidated": True, + "creditBureauCheck": False, + "crmsCheck": True, + "accountStatus": True, + "hasLien": False, + "noBouncedCheck": True, + "isWhitelisted": True, + "hasPastDueLoan": False } + full_response = { + "transactionId": validated_data["transactionId"], + "customerId": validated_data["customerId"], + "accountId": validated_data["accountId"], + "racResponse": rac_response + } - # return ResponseHelper.success( - # data=response_data, - # message="RAC check completed successfully" - # ) + response_schema = RACCheckResponseSchema() + result = response_schema.dump(full_response) - return response_data + return jsonify(result), 200 except ValidationError as err: logger.error(f"Validation Error: {err.messages}") return jsonify({ - "message": "Validation exception" - }) , 422 + "message": "Validation exception", + "errors": err.messages + }), 422 except Exception as e: logger.error(f"An error occurred: {str(e)}", exc_info=True) return jsonify({ "message": "Internal Server Error" - }) , 500 + }), 500 diff --git a/app/api/services/transaction_verify.py b/app/api/services/transaction_verify.py index e55e2de..b0e4c40 100644 --- a/app/api/services/transaction_verify.py +++ b/app/api/services/transaction_verify.py @@ -2,7 +2,10 @@ from flask import request, jsonify from marshmallow import ValidationError from app.utils.logger import logger 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: @@ -26,32 +29,32 @@ class TransactionVerifyService: # Simulated processing logic response_data = { - "type": "TransactionCheckResponse", - "nativeId": "FBN20191031104405CN621868", - "customerId": "CN621868", - "accountId": "2017821799", + "responseCode": "00", + "responseDescr": "Success", + "fullDescription": "Collect Status retrieved successfully.", + "customerId": validated_data.get("customerId"), + "accountId": validated_data.get("accountId"), "providedAmount": 0.0, "collectedAmount": 7.50, - "resultCode": "00", - "resultDescription": "Collect Status retrieved successfully." + "transactionId": validated_data.get("transactionId"), + "transactionType": validated_data.get("transactionType") } + # Validate and serialize response with TransactionVerifyResponseSchema + response_schema = TransactionVerifyResponseSchema() + serialized_response = response_schema.dump(response_data) - # return ResponseHelper.success( - # data=response_data, - # message="Transaction verification completed successfully" - # ) - - return response_data + return jsonify(serialized_response), 200 except ValidationError as err: logger.error(f"Validation Error: {err.messages}") return jsonify({ - "message": "Validation exception" - }) , 422 + "message": "Validation exception", + "errors": err.messages + }), 422 except Exception as e: logger.error(f"An error occurred: {str(e)}", exc_info=True) return jsonify({ "message": "Internal Server Error" - }) , 500 + }), 500 diff --git a/app/config.py b/app/config.py index ad0fb13..3587b8f 100644 --- a/app/config.py +++ b/app/config.py @@ -1,10 +1,11 @@ import os +from dotenv import load_dotenv class Config: """Base configuration for Flask app""" - - SWAGGER_URL = os.getenv("SWAGGER_URL", "/documentation") - API_URL = os.getenv("API_URL", "/swagger.json") + load_dotenv() + SWAGGER_URL = os.getenv("SWAGGER_URL") + API_URL = '/api/swagger.json' DEBUG = True 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") DEBUG = True + def configure(): + load_dotenv() \ No newline at end of file diff --git a/app/swagger/digifi_swagger.json b/app/swagger/digifi_swagger.json index 888841b..df5f106 100644 --- a/app/swagger/digifi_swagger.json +++ b/app/swagger/digifi_swagger.json @@ -16,6 +16,9 @@ "servers": [ { "url": "http://localhost:6337" + }, + { + "url": "http://localhost:5000" }, { "url": "http://10.10.11.17:6337" @@ -107,35 +110,32 @@ } ], "paths": { - "/RACCheck": { - "$ref": "./paths/RACCheck.json" + "/api/rac-check": { + "$ref": "swagger/paths/RACCheck.json" }, - "/CompleteRACcheck": { - "$ref": "./paths/CompleteRACcheck.json" + "/api/DisburseLoan": { + "$ref": "swagger/paths/Disbursement.json" }, - "/Disbursement": { - "$ref": "./paths/Disbursement.json" + "/api/CollectLoan": { + "$ref": "swagger/paths/CollectLoan.json" }, - "/CollectLoan": { - "$ref": "./paths/CollectLoan.json" + "/api/TransactionVerify": { + "$ref": "swagger/paths/TransactionVerify.json" }, - "/TransactionVerify": { - "$ref": "./paths/TransactionVerify.json" + "/api/CollectPenalFee": { + "$ref": "swagger/paths/PenalCharge.json" }, - "/PenalCharge": { - "$ref": "./paths/PenalCharge.json" + "/api/RevokeEnableConsent": { + "$ref": "swagger/paths/RevokeEnableConsent.json" }, - "/RevokeEnableConsent": { - "$ref": "./paths/RevokeEnableConsent.json" + "/api/TokenValidation": { + "$ref": "swagger/paths/TokenValidation.json" }, - "/TokenValidation": { - "$ref": "./paths/TokenValidation.json" + "/api/LienCheck": { + "$ref": "swagger/paths/LienCheck.json" }, - "/LienCheck": { - "$ref": "./paths/LienCheck.json" - }, - "/NewTransactionCheck": { - "$ref": "./paths/NewTransactionCheck.json" + "/api/NewTransactionCheck": { + "$ref": "swagger/paths/NewTransactionCheck.json" } }, "components": { diff --git a/app/swagger/schemas/CollectLoanRequest.json b/app/swagger/schemas/CollectLoanRequest.json index 14b67bf..4e7195e 100644 --- a/app/swagger/schemas/CollectLoanRequest.json +++ b/app/swagger/schemas/CollectLoanRequest.json @@ -1,70 +1,67 @@ { - "type": "object", - "properties": { - "transactionId": { - "type": "string", - "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" - } + "type": "object", + "properties": { + "transactionId": { + "type": "string", + "example": "T002" }, - "required": [ - "transactionId", - "fbnTransactionId", - "debtId", - "customerId", - "accountId", - "productId", - "collectAmount", - "penalCharge", - "collectionMethod", - "lienAmount", - "countryId", - "comment" - ] -} \ No newline at end of file + "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": "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 +} diff --git a/app/swagger/schemas/CollectLoanResponse.json b/app/swagger/schemas/CollectLoanResponse.json index 523a49f..0dd2cd8 100644 --- a/app/swagger/schemas/CollectLoanResponse.json +++ b/app/swagger/schemas/CollectLoanResponse.json @@ -1,70 +1,69 @@ { - "type": "object", - "properties": { - "transactionId": { - "type": "string", - "example": "T002" - }, - "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" - } + "type": "object", + "properties": { + "responseCode": { + "type": "string", + "nullable": true, + "example": "00" }, - "required": [ - "transactionId", - "debtId", - "customerId", - "accountId", - "productId", - "collectAmount", - "penalCharge", - "lienAmount", - "countryId", - "comment", - "resultCode", - "resultDescription" - ] -} \ No newline at end of file + "responseDescr": { + "type": "string", + "nullable": true, + "example": "Success" + }, + "fullDescription": { + "type": "string", + "nullable": true, + "example": "Loan Collection Successful" + }, + "transactionId": { + "type": "string", + "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 +} diff --git a/app/swagger/schemas/DisbursementRequest.json b/app/swagger/schemas/DisbursementRequest.json index 0c7000b..dd41d8f 100644 --- a/app/swagger/schemas/DisbursementRequest.json +++ b/app/swagger/schemas/DisbursementRequest.json @@ -1,77 +1,78 @@ { - "type": "object", - "properties": { - "requestId": { - "type": "string", - "example": "7876786" - }, - "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" - } + "type": "object", + "properties": { + "transactionId": { + "type": "string", + "example": "T001", + "nullable": true }, - "required": [ - "requestId", - "transactionId", - "debtId", - "customerId", - "accountId", - "productId", - "provideAmount", - "collectAmountInterest", - "collectAmountMgtFee", - "collectAmountInsurance", - "collectAmountVAT", - "countryId", - "comment" - ] -} \ No newline at end of file + "fbnTransactionId": { + "type": "string", + "example": "Tr201712RK9232P115", + "nullable": true + }, + "debtId": { + "type": "string", + "example": "273194670", + "nullable": true + }, + "customerId": { + "type": "string", + "example": "CN621868", + "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 +} diff --git a/app/swagger/schemas/DisbursementResponse.json b/app/swagger/schemas/DisbursementResponse.json index ac12c6e..322f11e 100644 --- a/app/swagger/schemas/DisbursementResponse.json +++ b/app/swagger/schemas/DisbursementResponse.json @@ -1,82 +1,82 @@ { - "type": "object", - "properties": { - "transactionId": { - "type": "string", - "example": "T001" - }, - "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!" - } + "type": "object", + "properties": { + "transactionId": { + "type": "string", + "example": "T001", + "nullable": true }, - "required": [ - "transactionId", - "TransactionId", - "debtId", - "customerId", - "accountId", - "productId", - "provideAmount", - "collectAmountInterest", - "collectAmountMgtFee", - "collectAmountInsurance", - "collectAmountVAT", - "countryId", - "resultCode", - "resultDescription" - ] -} \ No newline at end of file + "fbnTransactionId": { + "type": "string", + "example": "Tr201712RK9232P115", + "nullable": true + }, + "debtId": { + "type": "string", + "example": "273194670", + "nullable": true + }, + "customerId": { + "type": "string", + "example": "CN621868", + "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 + }, + "responseCode": { + "type": "string", + "example": "00", + "nullable": true + }, + "responseMessage": { + "type": "string", + "example": "Loan Request Completed Successfully!", + "nullable": true + } + }, + "required": [ + "provideAmount", + "collectAmountInterest", + "collectAmountMgtFee", + "collectAmountInsurance", + "collectAmountVAT" + ] +} diff --git a/app/swagger/schemas/PenalChargeRequest.json b/app/swagger/schemas/PenalChargeRequest.json index 64af9c8..d199301 100644 --- a/app/swagger/schemas/PenalChargeRequest.json +++ b/app/swagger/schemas/PenalChargeRequest.json @@ -1,41 +1,59 @@ { - "type": "object", - "properties": { - "transactionId": { - "type": "string", - "example": "T004" - }, - "fbnTransactionId": { - "type": "string", - "example": "Tr201712RK9232P115" - }, - "debtId": { - "type": "string", - "example": "273194670" - }, - "customerId": { - "type": "string", - "example": "CN621868" - }, - "accountId": { - "type": "string", - "example": "2017821799" - }, - "penalCharge": { - "type": "number", - "example": 1.2 - }, - "lienAmount": { - "type": "number", - "example": 101.2 - }, - "countryId": { - "type": "string", - "example": "01" - }, - "comment": { - "type": "string", - "example": "Testing PenalChargeRequest" - } + "type": "object", + "properties": { + "channel": { + "type": "string", + "nullable": true + }, + "transactionId": { + "type": "string", + "nullable": true, + "example": "T004" + }, + "fbnTransactionId": { + "type": "string", + "nullable": true, + "example": "Tr201712RK9232P115" + }, + "debtId": { + "type": "string", + "nullable": true, + "example": "273194670" + }, + "customerId": { + "type": "string", + "nullable": true, + "example": "CN621868" + }, + "accountId": { + "type": "string", + "nullable": true, + "example": "2017821799" + }, + "penalCharge": { + "type": "number", + "format": "double", + "example": 1.2 + }, + "lienAmount": { + "type": "number", + "format": "double", + "example": 101.2 + }, + "countryId": { + "type": "string", + "nullable": true, + "example": "01" + }, + "comment": { + "type": "string", + "nullable": true, + "example": "Testing PenalChargeRequest" } -} \ No newline at end of file + }, + "required": [ + "penalCharge", + "lienAmount" + ], + "additionalProperties": false +} diff --git a/app/swagger/schemas/PenalChargeResponse.json b/app/swagger/schemas/PenalChargeResponse.json index 0cc2482..136bc78 100644 --- a/app/swagger/schemas/PenalChargeResponse.json +++ b/app/swagger/schemas/PenalChargeResponse.json @@ -1,13 +1,37 @@ { - "type": "object", - "properties": { - "resultCode": { - "type": "string", - "example": "00" - }, - "resultDescription": { - "type": "string", - "example": "Penal charge debited successfully" - } + "type": "object", + "properties": { + "customerId": { + "type": "string", + "nullable": true, + "example": "CN621868" + }, + "transactionId": { + "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" } -} \ No newline at end of file + }, + "required": ["amountCollected"], + "additionalProperties": false +} diff --git a/app/swagger/schemas/RACCheckRequest.json b/app/swagger/schemas/RACCheckRequest.json index 2cf59d5..82be495 100644 --- a/app/swagger/schemas/RACCheckRequest.json +++ b/app/swagger/schemas/RACCheckRequest.json @@ -1,91 +1,40 @@ { - "type": "object", - "properties": { - "transactionId": { - "type": "string", - "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 - } - ] - } + "type": "object", + "properties": { + "transactionId": { + "type": "string", + "example": "T001" }, - "xml": { - "name": "RACCheckRequest" + "fbnTransactionId": { + "type": "string", + "example": "Tr201712RK9232P115" + }, + "customerId": { + "type": "string", + "example": "CN621868" + }, + "accountId": { + "type": "string", + "example": "2017821799" + }, + "channel": { + "type": "string", + "example": "USSD" + }, + "countryCode": { + "type": "string", + "example": "NG" } -} \ No newline at end of file + }, + "required": [ + "transactionId", + "fbnTransactionId", + "customerId", + "accountId", + "channel", + "countryCode" + ], + "xml": { + "name": "RACCheckRequest" + } +} diff --git a/app/swagger/schemas/RACCheckResponse.json b/app/swagger/schemas/RACCheckResponse.json index 110b555..9e7e291 100644 --- a/app/swagger/schemas/RACCheckResponse.json +++ b/app/swagger/schemas/RACCheckResponse.json @@ -1,65 +1,67 @@ { - "type": "object", - "properties": { - "resultCode": { - "type": "string", - "example": "00" - }, - "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" - } + "type": "object", + "properties": { + "transactionId": { + "type": "string", + "example": "T001" }, - "xml": { - "name": "RACCheckResponse" + "customerId": { + "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 + } + } } -} \ No newline at end of file + }, + "required": [ + "transactionId", + "customerId", + "accountId", + "racResponse" + ], + "xml": { + "name": "RACCheckResponse" + } +} diff --git a/app/swagger/schemas/TransactionVerifyRequest.json b/app/swagger/schemas/TransactionVerifyRequest.json index fce9a28..ca058bb 100644 --- a/app/swagger/schemas/TransactionVerifyRequest.json +++ b/app/swagger/schemas/TransactionVerifyRequest.json @@ -1,33 +1,34 @@ { - "type": "object", - "properties": { - "counter": { - "type": "string", - "example": "2" - }, - "transactionId": { - "type": "string", - "example": "T002" - }, - "requestID": { - "type": "string", - "example": "R02802" - }, - "customerId": { - "type": "string", - "example": "CN621868" - }, - "accountId": { - "type": "string", - "example": "2017821799" - }, - "countryId": { - "type": "string", - "example": "01" - }, - "transactionType": { - "type": "string", - "example": "Disbursement" - } + "type": "object", + "properties": { + "channel": { + "type": "string", + "example": "MOBILE" + }, + "transactionId": { + "type": "string", + "example": "T002" + }, + "requestId": { + "type": "string", + "example": "R02802" + }, + "customerId": { + "type": "string", + "example": "CN621868" + }, + "accountId": { + "type": "string", + "example": "2017821799" + }, + "countryId": { + "type": "string", + "example": "01" + }, + "transactionType": { + "type": "string", + "example": "Disbursement" } -} \ No newline at end of file + }, + "additionalProperties": false +} diff --git a/app/swagger/schemas/TransactionVerifyResponse.json b/app/swagger/schemas/TransactionVerifyResponse.json index 8bff555..d1b17db 100644 --- a/app/swagger/schemas/TransactionVerifyResponse.json +++ b/app/swagger/schemas/TransactionVerifyResponse.json @@ -1,37 +1,48 @@ { - "type": "object", - "properties": { - "$type": { - "type": "string", - "example": "TransactionCheckResponse" - }, - "nativeId": { - "type": "string", - "example": "FBN20191031104405CN621868" - }, - "customerId": { - "type": "string", - "example": "CN621868" - }, - "accountId": { - "type": "string", - "example": "2017821799" - }, - "providedAmount": { - "type": "number", - "example": 0.0 - }, - "collectedAmount": { - "type": "number", - "example": 7.50 - }, - "resultCode": { - "type": "string", - "example": "00" - }, - "resultDescription": { - "type": "string", - "example": "Collect Status retrieved successfully." - } + "type": "object", + "properties": { + "responseCode": { + "type": "string", + "example": "00" + }, + "responseDescr": { + "type": "string", + "example": "Collect Status retrieved successfully." + }, + "fullDescription": { + "type": "string", + "example": "Disbursement was verified and collection completed." + }, + "customerId": { + "type": "string", + "example": "CN621868" + }, + "accountId": { + "type": "string", + "example": "2017821799" + }, + "providedAmount": { + "type": "number", + "format": "double", + "example": 0.0 + }, + "collectedAmount": { + "type": "number", + "format": "double", + "example": 7.50 + }, + "transactionId": { + "type": "string", + "example": "T002" + }, + "transactionType": { + "type": "string", + "example": "Disbursement" } -} \ No newline at end of file + }, + "required": [ + "providedAmount", + "collectedAmount" + ], + "additionalProperties": false +}