diff --git a/app/api/services/loan.py b/app/api/services/loan.py index 609924f..71c2f8f 100644 --- a/app/api/services/loan.py +++ b/app/api/services/loan.py @@ -81,8 +81,9 @@ class LoanService(BaseService): return response_data + except Exception as e: logger.error(f"An error occurred: {str(e)}", exc_info=True) return jsonify({ - "message": "Internal Server Error" - }), 500 \ No newline at end of file + "message": f"Internal Server Error: {str(e)}" + }), 500 diff --git a/app/swagger/paths/CustomerConsent.json b/app/swagger/paths/CustomerConsent.json new file mode 100644 index 0000000..f246704 --- /dev/null +++ b/app/swagger/paths/CustomerConsent.json @@ -0,0 +1,56 @@ +{ + "post": { + "tags": [ + "CustomerConsent" + ], + "summary": "Customer Consent Request", + "description": "Customer Consent Request", + "operationId": "CustomerConsent", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "../schemas/CustomerConsentRequest.json" + } + }, + "application/xml": { + "schema": { + "$ref": "../schemas/CustomerConsentRequest.json" + } + }, + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "../schemas/CustomerConsentRequest.json" + } + } + } + }, + "responses": { + "200": { + "description": "Successful", + "content": { + "application/json": { + "schema": { + "$ref": "../schemas/CustomerConsentResponse.json" + } + }, + "application/xml": { + "schema": { + "$ref": "../schemas/CustomerConsentResponse.json" + } + } + } + }, + "400": { + "description": "Invalid request" + }, + "422": { + "description": "Validation exception" + }, + "500": { + "description": "Internal server error" + } + } + } + } \ No newline at end of file diff --git a/app/swagger/paths/EligibilityCheck.json b/app/swagger/paths/EligibilityCheck.json new file mode 100644 index 0000000..f2142b1 --- /dev/null +++ b/app/swagger/paths/EligibilityCheck.json @@ -0,0 +1,57 @@ +{ + "post": { + "tags": [ + "EligibilityCheck" + ], + "summary": "Start the process - initiate steps to eligibility RAC Checks ", + "description": "Initiate Eligibility Check Request", + "operationId": "startEligibilityCheck", + "requestBody": { + "description": "Post JSON to conduct eligibility tests", + "content": { + "application/json": { + "schema": { + "$ref": "../schemas/EligibilityCheckRequest.json" + } + }, + "application/xml": { + "schema": { + "$ref": "../schemas/EligibilityCheckRequest.json" + } + }, + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "../schemas/EligibilityCheckRequest.json" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "../schemas/EligibilityCheckResponse.json" + } + }, + "application/xml": { + "schema": { + "$ref": "../schemas/EligibilityCheckResponse.json" + } + } + } + }, + "400": { + "description": "Invalid request" + }, + "422": { + "description": "Validation exception" + }, + "500": { + "description": "Internal server error" + } + } + } +} \ No newline at end of file diff --git a/app/swagger/paths/LoanStatus.json b/app/swagger/paths/LoanStatus.json new file mode 100644 index 0000000..59d165b --- /dev/null +++ b/app/swagger/paths/LoanStatus.json @@ -0,0 +1,57 @@ +{ + "post": { + "tags": [ + "LoanStatus" + ], + "summary": "Loan Information Request ", + "description": "Loan Information Request", + "operationId": "LoanStatus", + "requestBody": { + "description": "Post JSON to conduct eligibility tests", + "content": { + "application/json": { + "schema": { + "$ref": "../schemas/LoanStatusRequest.json" + } + }, + "application/xml": { + "schema": { + "$ref": "../schemas/LoanStatusRequest.json" + } + }, + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "../schemas/LoanStatusRequest.json" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "../schemas/LoanStatusResponse.json" + } + }, + "application/xml": { + "schema": { + "$ref": "../schemas/LoanStatusResponse.json" + } + } + } + }, + "400": { + "description": "Invalid request" + }, + "422": { + "description": "Validation exception" + }, + "500": { + "description": "Internal server error" + } + } + } + } \ No newline at end of file diff --git a/app/swagger/paths/NotificationCallback.json b/app/swagger/paths/NotificationCallback.json new file mode 100644 index 0000000..26af904 --- /dev/null +++ b/app/swagger/paths/NotificationCallback.json @@ -0,0 +1,57 @@ +{ + "post": { + "tags": [ + "NotificationCallback" + ], + "summary": "Loan Information Request ", + "description": "Loan Information Request", + "operationId": "NotificationCallback", + "requestBody": { + "description": "Post JSON to conduct eligibility tests", + "content": { + "application/json": { + "schema": { + "$ref": "../schemas/NotificationCallbackRequest.json" + } + }, + "application/xml": { + "schema": { + "$ref": "../schemas/NotificationCallbackRequest.json" + } + }, + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "../schemas/NotificationCallbackRequest.json" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "../schemas/NotificationCallbackResponse.json" + } + }, + "application/xml": { + "schema": { + "$ref": "../schemas/NotificationCallbackResponse.json" + } + } + } + }, + "400": { + "description": "Invalid request" + }, + "422": { + "description": "Validation exception" + }, + "500": { + "description": "Internal server error" + } + } + } + } \ No newline at end of file diff --git a/app/swagger/paths/ProvideLoan.json b/app/swagger/paths/ProvideLoan.json new file mode 100644 index 0000000..e875312 --- /dev/null +++ b/app/swagger/paths/ProvideLoan.json @@ -0,0 +1,57 @@ +{ + "post": { + "tags": [ + "ProvideLoan" + ], + "summary": "Provide Loan Request ", + "description": "Provide Loan Request", + "operationId": "ProvideLoan", + "requestBody": { + "description": "Post JSON to conduct eligibility tests", + "content": { + "application/json": { + "schema": { + "$ref": "../schemas/ProvideLoanRequest.json" + } + }, + "application/xml": { + "schema": { + "$ref": "../schemas/ProvideLoanRequest.json" + } + }, + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "../schemas/ProvideLoanRequest.json" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "../schemas/ProvideLoanResponse.json" + } + }, + "application/xml": { + "schema": { + "$ref": "../schemas/ProvideLoanResponse.json" + } + } + } + }, + "400": { + "description": "Invalid request" + }, + "422": { + "description": "Validation exception" + }, + "500": { + "description": "Internal server error" + } + } + } + } \ No newline at end of file diff --git a/app/swagger/paths/Repayment.json b/app/swagger/paths/Repayment.json new file mode 100644 index 0000000..e88d18c --- /dev/null +++ b/app/swagger/paths/Repayment.json @@ -0,0 +1,56 @@ +{ + "post": { + "tags": [ + "Repayment" + ], + "summary": "Repayment Request", + "description": "Repayment Request", + "operationId": "Repayment", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "../schemas/RepaymentRequest.json" + } + }, + "application/xml": { + "schema": { + "$ref": "../schemas/RepaymentRequest.json" + } + }, + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "../schemas/RepaymentRequest.json" + } + } + } + }, + "responses": { + "200": { + "description": "Repayment Successful", + "content": { + "application/json": { + "schema": { + "$ref": "../schemas/RepaymentResponse.json" + } + }, + "application/xml": { + "schema": { + "$ref": "../schemas/RepaymentResponse.json" + } + } + } + }, + "400": { + "description": "Invalid request" + }, + "422": { + "description": "Validation exception" + }, + "500": { + "description": "Internal server error" + } + } + } +} \ No newline at end of file diff --git a/app/swagger/paths/SelectOffer.json b/app/swagger/paths/SelectOffer.json new file mode 100644 index 0000000..06c20bd --- /dev/null +++ b/app/swagger/paths/SelectOffer.json @@ -0,0 +1,57 @@ +{ + "post": { + "tags": [ + "SelectOffer" + ], + "summary": "This method is used the send the offer the customer selected to Simbrella ", + "description": "This method is used the send the offer the customer selected to Simbrella", + "operationId": "SelectOffer", + "requestBody": { + "description": "Post JSON to conduct eligibility tests", + "content": { + "application/json": { + "schema": { + "$ref": "../schemas/SelectOfferRequest.json" + } + }, + "application/xml": { + "schema": { + "$ref": "../schemas/SelectOfferRequest.json" + } + }, + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "../schemas/SelectOfferRequest.json" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "../schemas/SelectOfferResponse.json" + } + }, + "application/xml": { + "schema": { + "$ref": "../schemas/SelectOfferResponse.json" + } + } + } + }, + "400": { + "description": "Invalid request" + }, + "422": { + "description": "Validation exception" + }, + "500": { + "description": "Internal server error" + } + } + } +} \ No newline at end of file diff --git a/app/swagger/schemas/CustomerConsentRequest.json b/app/swagger/schemas/CustomerConsentRequest.json new file mode 100644 index 0000000..a86c53a --- /dev/null +++ b/app/swagger/schemas/CustomerConsentRequest.json @@ -0,0 +1,37 @@ +{ + "type": "object", + "properties": { + "type": { + "type": "string", + "example": "CustomerConsentRequest" + }, + "transactionId": { + "type": "string", + "example": "20171209232177" + }, + "customerId": { + "type": "string", + "example": "CN621868" + }, + "accountId": { + "type": "string", + "example": "ACN8263457" + }, + "requestTime": { + "type": "string", + "format": "date-time", + "example": "2019-10-18 14:26:21.063" + }, + "consentType": { + "type": "string", + "example": "Revoke" + }, + "channel": { + "type": "string", + "example": "USSD" + } + }, + "xml": { + "name": "CustomerConsentRequest" + } +} \ No newline at end of file diff --git a/app/swagger/schemas/CustomerConsentResponse.json b/app/swagger/schemas/CustomerConsentResponse.json new file mode 100644 index 0000000..fb46f6a --- /dev/null +++ b/app/swagger/schemas/CustomerConsentResponse.json @@ -0,0 +1,16 @@ +{ + "type": "object", + "properties": { + "resultCode": { + "type": "string", + "example": "00" + }, + "resultDescription": { + "type": "string", + "example": "Request is received" + } + }, + "xml": { + "name": "CustomerConsentResponse" + } +} \ No newline at end of file diff --git a/app/swagger/schemas/EligibilityCheckRequest.json b/app/swagger/schemas/EligibilityCheckRequest.json new file mode 100644 index 0000000..8bb14de --- /dev/null +++ b/app/swagger/schemas/EligibilityCheckRequest.json @@ -0,0 +1,32 @@ +{ + "type": "object", + "properties": { + "transactionId": { + "type": "string", + "example": "Tr201712RK9232P115" + }, + "countryCode": { + "type": "string", + "example": "NGR" + }, + "customerId": { + "type": "string", + "example": "CN621868" + }, + "msisdn": { + "type": "string", + "example": "8093451342" + }, + "channel": { + "type": "string", + "example": "100" + }, + "accountId": { + "type": "string", + "example": "ACN8263457" + } + }, + "xml": { + "name": "EligibilityCheckRequest" + } +} \ No newline at end of file diff --git a/app/swagger/schemas/EligibilityCheckResponse.json b/app/swagger/schemas/EligibilityCheckResponse.json new file mode 100644 index 0000000..1f91239 --- /dev/null +++ b/app/swagger/schemas/EligibilityCheckResponse.json @@ -0,0 +1,82 @@ +{ + "type": "object", + "properties": { + "customerId": { + "type": "string", + "example": "CN621868" + }, + "transactionId": { + "type": "string", + "example": "TX12345" + }, + "countryCode": { + "type": "string", + "example": "NG" + }, + "msisdn": { + "type": "string", + "example": "3451342" + }, + "eligibleOffers": { + "type": "array", + "items": { + "type": "object", + "properties": { + "offerId": { + "type": "string", + "example": "Offer1" + }, + "productId": { + "type": "string", + "example": "Product1" + }, + "minAamount": { + "type": "number", + "format": "decimal", + "example": 100.00 + }, + "maxAamount": { + "type": "number", + "format": "decimal", + "example": 1000.00 + }, + "tenor": { + "type": "integer", + "example": 12 + } + } + }, + "example": [ + { + "offerId": "Offer1", + "productId": "Product1", + "minAamount": 100.00, + "maxAamount": 1000.00, + "tenor": 12 + }, + { + "offerId": "Offer2", + "productId": "Product2", + "minAamount": 200.00, + "maxAamount": 2000.00, + "tenor": 24 + } + ] + }, + "resultDescription": { + "type": "string", + "example": "Successful" + }, + "resultCode": { + "type": "string", + "example": "00" + }, + "accountId": { + "type": "string", + "example": "ACN8263457" + } + }, + "xml": { + "name": "EligibilityCheckResponse" + } +} \ No newline at end of file diff --git a/app/swagger/schemas/LoanStatusRequest.json b/app/swagger/schemas/LoanStatusRequest.json new file mode 100644 index 0000000..0252f26 --- /dev/null +++ b/app/swagger/schemas/LoanStatusRequest.json @@ -0,0 +1,24 @@ +{ + "type": "object", + "properties": { + "transactionId": { + "type": "string", + "example": "Tr201712RK9232P115" + }, + "customerId": { + "type": "string", + "example": "CN621868" + }, + "msisdn": { + "type": "string", + "example": "3451342" + }, + "channel": { + "type": "string", + "example": "USSD" + } + }, + "xml": { + "name": "LoanStatusRequest" + } +} \ No newline at end of file diff --git a/app/swagger/schemas/LoanStatusResponse.json b/app/swagger/schemas/LoanStatusResponse.json new file mode 100644 index 0000000..6e9e877 --- /dev/null +++ b/app/swagger/schemas/LoanStatusResponse.json @@ -0,0 +1,70 @@ +{ + "type": "object", + "properties": { + "customerId": { + "type": "string", + "example": "CN621868" + }, + "transactionId": { + "type": "string", + "example": "Tr201712RK9232P115" + }, + "loans": { + "type": "array", + "items": { + "type": "object", + "properties": { + "debtId": { + "type": "string", + "example": "123456789" + }, + "loanDate": { + "type": "string", + "format": "date-time", + "example": "2019-10-18 14:26:21.063" + }, + "dueDate": { + "type": "string", + "format": "date-time", + "example": "2019-11-20 14:26:21.063" + }, + "currentLoanAmount": { + "type": "integer", + "example": 8500 + }, + "initialLoanAmount": { + "type": "integer", + "example": 10000 + }, + "defaultPenaltyFee": { + "type": "integer", + "example": 0 + }, + "continuousFee": { + "type": "integer", + "example": 0 + }, + "productId": { + "type": "string", + "example": "101" + } + } + } + }, + "totalDebtAmount": { + "type": "integer", + "example": 8500 + }, + "resultCode": { + "type": "string", + "example": "00" + }, + "resultDescription": { + "type": "string", + "example": "Successful" + } + }, + "xml": { + "name": "LoanStatusResponse" + } +} \ No newline at end of file diff --git a/app/swagger/schemas/NotificationCallbackRequest.json b/app/swagger/schemas/NotificationCallbackRequest.json new file mode 100644 index 0000000..d5457fb --- /dev/null +++ b/app/swagger/schemas/NotificationCallbackRequest.json @@ -0,0 +1,50 @@ +{ + "type": "object", + "properties": { + "fbnTransactionId": { + "type": "string", + "example": "123456789" + }, + "transactionId": { + "type": "string", + "example": "123456789" + }, + "customerId": { + "type": "string", + "example": "CN621868" + }, + "accountId": { + "type": "string", + "example": "ACN8263457" + }, + "debtId": { + "type": "string", + "example": "987654321" + }, + "transactionType": { + "type": "string", + "example": "Disbursement" + }, + "amountProvided": { + "type": "number", + "format": "float", + "example": 1000.00 + }, + "amountCollected": { + "type": "number", + "format": "float", + "example": 0.00 + }, + "responseCode": { + "type": "string", + "example": "00" + }, + "responseDescription": { + "type": "string", + "example": "Successful" + } + }, + "xml": { + "name": "NotificationCallbackRequest" + } +} \ No newline at end of file diff --git a/app/swagger/schemas/NotificationCallbackResponse.json b/app/swagger/schemas/NotificationCallbackResponse.json new file mode 100644 index 0000000..c4a6a78 --- /dev/null +++ b/app/swagger/schemas/NotificationCallbackResponse.json @@ -0,0 +1,16 @@ +{ + "type": "object", + "properties": { + "resultCode": { + "type": "string", + "example": "00" + }, + "resultDescription": { + "type": "string", + "example": "Successful" + } + }, + "xml": { + "name": "NotificationCallbackResponse" + } +} \ No newline at end of file diff --git a/app/swagger/schemas/ProvideLoanRequest.json b/app/swagger/schemas/ProvideLoanRequest.json new file mode 100644 index 0000000..721d8b9 --- /dev/null +++ b/app/swagger/schemas/ProvideLoanRequest.json @@ -0,0 +1,45 @@ +{ + "type": "object", + "properties": { + "requestId": { + "type": "string", + "example": "202111170001371256908" + }, + "transactionId": { + "type": "string", + "example": "Tr201712RK9232P115" + }, + "customerId": { + "type": "string", + "example": "CN621868" + }, + "accountId": { + "type": "string", + "example": "ACN8263457" + }, + "msisdn": { + "type": "string", + "example": "3451342" + }, + "requestedAmount": { + "type": "number", + "format": "decimal", + "example": 900 + }, + "collectionType": { + "type": "integer", + "example": 1 + }, + "offerId": { + "type": "integer", + "example": 1127 + }, + "channel": { + "type": "string", + "example": "100" + } + }, + "xml": { + "name": "ProvideLoanRequest" + } +} \ No newline at end of file diff --git a/app/swagger/schemas/ProvideLoanResponse.json b/app/swagger/schemas/ProvideLoanResponse.json new file mode 100644 index 0000000..d7ddb3c --- /dev/null +++ b/app/swagger/schemas/ProvideLoanResponse.json @@ -0,0 +1,36 @@ +{ + "type": "object", + "properties": { + "requestId": { + "type": "string", + "example": "202111170001371256908" + }, + "transactionId": { + "type": "string", + "example": "Tr201712RK9232P115" + }, + "customerId": { + "type": "string", + "example": "CN621868" + }, + "accountId": { + "type": "string", + "example": "ACN8263457" + }, + "msisdn": { + "type": "string", + "example": "3451342" + }, + "resultCode": { + "type": "string", + "example": "00" + }, + "resultDescription": { + "type": "string", + "example": "Successful" + } + }, + "xml": { + "name": "ProvideLoanResponse" + } +} \ No newline at end of file diff --git a/app/swagger/schemas/RepaymentRequest.json b/app/swagger/schemas/RepaymentRequest.json new file mode 100644 index 0000000..c31d585 --- /dev/null +++ b/app/swagger/schemas/RepaymentRequest.json @@ -0,0 +1,32 @@ +{ + "type": "object", + "properties": { + "msisdn": { + "type": "string", + "example": "3451342" + }, + "debtId": { + "type": "string", + "example": "10" + }, + "productId": { + "type": "string", + "example": "101" + }, + "transactionId": { + "type": "string", + "example": "20171209232115" + }, + "customerId": { + "type": "string", + "example": "CID0000025585" + }, + "channel": { + "type": "string", + "example": "USSD" + } + }, + "xml": { + "name": "RepaymentRequest" + } +} \ No newline at end of file diff --git a/app/swagger/schemas/RepaymentResponse.json b/app/swagger/schemas/RepaymentResponse.json new file mode 100644 index 0000000..06e4666 --- /dev/null +++ b/app/swagger/schemas/RepaymentResponse.json @@ -0,0 +1,28 @@ +{ + "type": "object", + "properties": { + "customerId": { + "type": "string", + "example": "CN621868" + }, + "productId": { + "type": "string", + "example": "101" + }, + "debtId": { + "type": "string", + "example": "273194670" + }, + "resultCode": { + "type": "string", + "example": "00" + }, + "resultDescription": { + "type": "string", + "example": "Successful" + } + }, + "xml": { + "name": "RepaymentResponse" + } +} \ No newline at end of file diff --git a/app/swagger/schemas/SelectOfferRequest.json b/app/swagger/schemas/SelectOfferRequest.json new file mode 100644 index 0000000..a874ed3 --- /dev/null +++ b/app/swagger/schemas/SelectOfferRequest.json @@ -0,0 +1,41 @@ +{ + "type": "object", + "properties": { + "requestId": { + "type": "string", + "example": "202111170001371256908" + }, + "transactionId": { + "type": "string", + "example": "1231231321232" + }, + "customerId": { + "type": "string", + "example": "CN621868" + }, + "msisdn": { + "type": "string", + "example": "123456789" + }, + "requestedAmount": { + "type": "number", + "format": "double", + "example": 10000.55 + }, + "accountId": { + "type": "string", + "example": "ACN8263457" + }, + "productId": { + "type": "string", + "example": "101" + }, + "channel": { + "type": "string", + "example": "" + } + }, + "xml": { + "name": "SelectOffersRequest" + } +} \ No newline at end of file diff --git a/app/swagger/schemas/SelectOfferResponse.json b/app/swagger/schemas/SelectOfferResponse.json new file mode 100644 index 0000000..1d0ebdf --- /dev/null +++ b/app/swagger/schemas/SelectOfferResponse.json @@ -0,0 +1,112 @@ +{ + "type": "object", + "properties": { + "requestId": { + "type": "string", + "example": "202111170001371256908" + }, + "transactionId": { + "type": "string", + "example": "1231231321232" + }, + "customerId": { + "type": "string", + "example": "1256907" + }, + "accountId": { + "type": "string", + "example": "5948306019" + }, + "loan": { + "type": "array", + "items": { + "type": "object", + "properties": { + "offerId": { + "type": "string", + "example": "14451" + }, + "productId": { + "type": "string", + "example": "2030" + }, + "amount": { + "type": "number", + "format": "float", + "example": 10000.0 + }, + "upfrontPayment": { + "type": "number", + "format": "float", + "example": 1000.0 + }, + "interestRate": { + "type": "number", + "format": "float", + "example": 3.0 + }, + "ManagementRate": { + "type": "number", + "format": "float", + "example": 1.0 + }, + "ManagementFee": { + "type": "number", + "format": "float", + "example": 1.0 + }, + "InsuranceRate": { + "type": "number", + "format": "float", + "example": 1.0 + }, + "InsuranceFee": { + "type": "number", + "format": "float", + "example": 100.0 + }, + "VATRate": { + "type": "number", + "format": "float", + "example": 7.5 + }, + "VATamount": { + "type": "number", + "format": "float", + "example": 100.0 + }, + "recommendedRepaymentDates": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "2022-11-30" + ] + }, + "installmentAmount": { + "type": "number", + "format": "float", + "example": 11000.0 + }, + "totalRepaymentAmount": { + "type": "number", + "format": "float", + "example": 11000.0 + } + } + } + }, + "resultCode": { + "type": "string", + "example": "00" + }, + "resultDescription": { + "type": "string", + "example": "Successful" + } + }, + "xml": { + "name": "SelectOffersResponse" + } +} \ No newline at end of file