Compare commits
11 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 2a12215931 | |||
| 2f3b589420 | |||
| f0679b8c1e | |||
| c8e21be48c | |||
| f1e9e39fe5 | |||
| b412313fc5 | |||
| cba6eac501 | |||
| 443c6262b7 | |||
| 2ba97cee4a | |||
| 8c714cb45c | |||
| c93e1a8bdd |
@@ -12,6 +12,7 @@ DATABASE_PASSWORD=FirstAdvance!
|
||||
DATABASE_HOST=dev-data.simbrellang.net
|
||||
DATABASE_PORT=10532
|
||||
DATABASE_NAME=firstadvancedev
|
||||
#SQLALCHEMY_DATABASE_URI_FULL="oracle+oracledb://FIRSTADVSTG:Pchanged_56789@10.2.110.30:1521/?service_name=firstadv"
|
||||
|
||||
# DATABASE_HOST=10.20.30.60
|
||||
# DATABASE_USER=firstadvance
|
||||
|
||||
@@ -1,2 +1,3 @@
|
||||
from .simbrella import SimbrellaIntegration
|
||||
from .kafka import KafkaIntegration
|
||||
from .kafka import KafkaIntegration
|
||||
from .events_service import EventServiceIntegration
|
||||
@@ -0,0 +1,49 @@
|
||||
import httpx
|
||||
from app.utils.logger import logger
|
||||
from app.config import settings
|
||||
|
||||
|
||||
class EventServiceIntegration:
|
||||
BASE_URL = settings.SIMBRELLA_BASE_URL
|
||||
ENDPOINT_DIRECT_LOAN = settings.ENDPOINT_DIRECT_LOAN
|
||||
ENDPOINT_DIRECT_REPAYMENT = settings.ENDPOINT_DIRECT_REPAYMENT
|
||||
|
||||
@staticmethod
|
||||
def direct_loan(transaction_id: str):
|
||||
"""
|
||||
Calls the Direct Loan endpoint
|
||||
"""
|
||||
url = f"{EventServiceIntegration.BASE_URL}{EventServiceIntegration.ENDPOINT_DIRECT_LOAN}"
|
||||
payload = {"transactionId": str(transaction_id)}
|
||||
|
||||
headers = {
|
||||
"Content-Type": "application/json"
|
||||
}
|
||||
|
||||
try:
|
||||
response = httpx.post(url, json=payload, headers=headers, timeout=10.0)
|
||||
logger.info(f"Loan Response: {response.text}")
|
||||
return response
|
||||
except Exception as e:
|
||||
logger.error(f"Direct Loan API call failed: {str(e)}", exc_info=True)
|
||||
raise
|
||||
|
||||
@staticmethod
|
||||
def direct_repayment(transaction_id: str):
|
||||
"""
|
||||
Calls the Direct Repayment endpoint
|
||||
"""
|
||||
url = f"{EventServiceIntegration.BASE_URL}{EventServiceIntegration.ENDPOINT_DIRECT_REPAYMENT}"
|
||||
payload = {"transactionId": str(transaction_id)}
|
||||
|
||||
headers = {
|
||||
"Content-Type": "application/json",
|
||||
}
|
||||
|
||||
try:
|
||||
response = httpx.post(url, json=payload, headers=headers, timeout=10.0)
|
||||
logger.info(f"Repayment Response: {response.text}")
|
||||
return response
|
||||
except Exception as e:
|
||||
logger.error(f"Direct Repayment API call failed: {str(e)}", exc_info=True)
|
||||
raise
|
||||
@@ -13,6 +13,7 @@ from app.api.enums import LoanStatus
|
||||
from app.extensions import db
|
||||
from datetime import datetime, timezone
|
||||
from dateutil.relativedelta import relativedelta
|
||||
from app.api.integrations import EventServiceIntegration
|
||||
from app.models import LoanRepaymentSchedule
|
||||
from app.api.services.offer_analysis import OfferAnalysis
|
||||
from app.api.helpers.response_helper import ResponseHelper
|
||||
@@ -172,11 +173,15 @@ class ProvideLoanService(BaseService):
|
||||
"accountId": account_id,
|
||||
"msisdn": customer.msisdn
|
||||
}
|
||||
|
||||
|
||||
event_thread = Thread(target=ProvideLoanService.trigger_loan_disbursement, args=(transaction_id,))
|
||||
event_thread.start()
|
||||
|
||||
# KafkaIntegration.send_loan_request(loan_data = response_data, request_id = request_id)
|
||||
# Call Kafka in a background thread
|
||||
thread = Thread(target=ProvideLoanService.async_send_to_kafka, args=(response_data, request_id, "PROCESS_PAYMENT"))
|
||||
thread.start()
|
||||
kafka_thread = Thread(target=ProvideLoanService.async_send_to_kafka, args=(response_data, request_id, "PROCESS_PAYMENT"))
|
||||
kafka_thread.start()
|
||||
|
||||
db.session.commit()
|
||||
return ResponseHelper.success(data=response_data)
|
||||
@@ -195,4 +200,11 @@ class ProvideLoanService(BaseService):
|
||||
except Exception as e:
|
||||
logger.error(f"An error occurred: {str(e)}", exc_info=True)
|
||||
db.session.rollback()
|
||||
return ResponseHelper.internal_server_error()
|
||||
return ResponseHelper.internal_server_error()
|
||||
|
||||
@classmethod
|
||||
def trigger_loan_disbursement(cls, transaction_id: str):
|
||||
response = EventServiceIntegration.direct_loan(transaction_id=transaction_id)
|
||||
return response
|
||||
|
||||
|
||||
|
||||
@@ -11,6 +11,7 @@ from app.api.services.base_service import BaseService
|
||||
from app.api.enums import TransactionType
|
||||
from threading import Thread
|
||||
from app.extensions import db
|
||||
from app.api.integrations import EventServiceIntegration
|
||||
|
||||
class RepaymentService(BaseService):
|
||||
TRANSACTION_TYPE = TransactionType.REPAYMENT
|
||||
@@ -79,9 +80,12 @@ class RepaymentService(BaseService):
|
||||
"debtId": loan_id
|
||||
}
|
||||
|
||||
event_thread = Thread(target=RepaymentService.trigger_loan_repayment, args=(transaction_id,))
|
||||
event_thread.start()
|
||||
|
||||
# Call Kafka in a background thread
|
||||
thread = Thread(target=RepaymentService.async_send_to_kafka, args=(response_data, request_id, "LOAN_REPAYMENT"))
|
||||
thread.start()
|
||||
kafka_thread = Thread(target=RepaymentService.async_send_to_kafka, args=(response_data, request_id, "LOAN_REPAYMENT"))
|
||||
kafka_thread.start()
|
||||
|
||||
db.session.commit()
|
||||
return ResponseHelper.success(data=response_data)
|
||||
@@ -101,3 +105,10 @@ class RepaymentService(BaseService):
|
||||
logger.error(f"An error occurred: {str(e)}", exc_info=True)
|
||||
db.session.rollback()
|
||||
return ResponseHelper.internal_server_error()
|
||||
|
||||
|
||||
@classmethod
|
||||
def trigger_loan_repayment(cls, transaction_id: str):
|
||||
response = EventServiceIntegration.direct_repayment(transaction_id=transaction_id)
|
||||
return response
|
||||
|
||||
+8
-1
@@ -24,7 +24,10 @@ class Config:
|
||||
# Database Connection
|
||||
# SQLALCHEMY_DATABASE_URI = f"postgresql+psycopg2://{DATABASE_USER}:{DATABASE_PASSWORD}@{DATABASE_HOST}:{DATABASE_PORT}/{DATABASE_NAME}"
|
||||
|
||||
SQLALCHEMY_DATABASE_URI = (f"oracle+oracledb://{DATABASE_USER}:{DATABASE_PASSWORD}@{DNS}")
|
||||
SQLALCHEMY_DATABASE_URI_INTERNAL = (f"oracle+oracledb://{DATABASE_USER}:{DATABASE_PASSWORD}@{DNS}")
|
||||
SQLALCHEMY_DATABASE_URI = os.getenv("SQLALCHEMY_DATABASE_URI_FULL", SQLALCHEMY_DATABASE_URI_INTERNAL)
|
||||
|
||||
#SQLALCHEMY_DATABASE_URI_FULL = 'oracle+oracledb://FIRSTADVSTG:Pchanged_56789@10.2.110.30:1521/?service_name=firstadv'
|
||||
|
||||
SQLALCHEMY_TRACK_MODIFICATIONS = False
|
||||
|
||||
@@ -43,6 +46,10 @@ class Config:
|
||||
VALID_API_KEY = os.getenv("SIMBRELLA_API_KEY", "test-api-key-12345")
|
||||
SIMBRELLA_BASE_URL = os.getenv("SIMBRELLA_BASE_URL", "http://127.0.0.1:6337")
|
||||
SIMBRELLA_ENDPOINT_RAC_CHECKS = os.getenv("SIMBRELLA_ENDPOINT_RAC_CHECKS","api/rac-check")
|
||||
EVENTS_SERVICE_BASE_URL = os.getenv("EVENTS_SERVICE_BASE_URL","https://event-core.simbrellang.net")
|
||||
ENDPOINT_DIRECT_LOAN = os.getenv("ENDPOINT_DIRECT_LOAN","/autocall/direct/loan")
|
||||
ENDPOINT_DIRECT_REPAYMENT = os.getenv("ENDPOINT_DIRECT_REPAYMENT","/autocall/direct/repayment")
|
||||
|
||||
|
||||
RAC_RESULT_accountStatus = os.environ.get("RAC_RESULT_accountStatus", "true")
|
||||
RAC_RESULT_bvnValidated = os.environ.get("RAC_RESULT_bvnValidated", "true")
|
||||
|
||||
@@ -17,6 +17,11 @@ class LoanRepaymentSchedule(db.Model):
|
||||
total_repayment_amount = db.Column(db.Float, default=0.0)
|
||||
paid = db.Column(db.Boolean, default=False)
|
||||
paid_at = db.Column(db.DateTime, nullable=True)
|
||||
due_process_date = db.Column(db.DateTime, nullable=True)
|
||||
due_process_count = db.Column(db.Integer, default=0)
|
||||
paid_status = db.Column(db.String(20), nullable=True)
|
||||
repay_description = db.Column(db.String(255), nullable=True)
|
||||
partial_balance = db.Column(db.Float, default=0.0)
|
||||
|
||||
created_at = db.Column(db.DateTime(timezone=True), server_default=func.now())
|
||||
updated_at = db.Column(db.DateTime(timezone=True), server_default=func.now(), onupdate=func.now())
|
||||
|
||||
@@ -20,12 +20,15 @@
|
||||
{
|
||||
"url": "http://api.dev.simbrellang.net:4500"
|
||||
},
|
||||
{
|
||||
{
|
||||
"url": "https://api.dev.simbrellang.net"
|
||||
},
|
||||
{
|
||||
"url": "http://10.2.249.133:4500"
|
||||
}
|
||||
],
|
||||
"tags": [
|
||||
{
|
||||
{
|
||||
"name": "Authorize",
|
||||
"description": "This feature will be used for authorizing customers.",
|
||||
"externalDocs": {
|
||||
@@ -131,18 +134,6 @@
|
||||
"RepaymentResponse": {
|
||||
"$ref": "swagger/schemas/RepaymentResponse.json"
|
||||
},
|
||||
"CustomerConsentRequest": {
|
||||
"$ref": "swagger/schemas/CustomerConsentRequest.json"
|
||||
},
|
||||
"CustomerConsentResponse": {
|
||||
"$ref": "swagger/schemas/CustomerConsentResponse.json"
|
||||
},
|
||||
"NotificationCallbackRequest": {
|
||||
"$ref": "swagger/schemas/NotificationCallbackRequest.json"
|
||||
},
|
||||
"NotificationCallbackResponse": {
|
||||
"$ref": "swagger/schemas/NotificationCallbackResponse.json"
|
||||
},
|
||||
"ApiResponse": {
|
||||
"$ref": "swagger/schemas/ApiResponse.json"
|
||||
},
|
||||
|
||||
@@ -1,56 +0,0 @@
|
||||
{
|
||||
"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"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,57 +0,0 @@
|
||||
{
|
||||
"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"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,37 +0,0 @@
|
||||
{
|
||||
"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"
|
||||
}
|
||||
}
|
||||
@@ -1,16 +0,0 @@
|
||||
{
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"resultCode": {
|
||||
"type": "string",
|
||||
"example": "00"
|
||||
},
|
||||
"resultDescription": {
|
||||
"type": "string",
|
||||
"example": "Request is received"
|
||||
}
|
||||
},
|
||||
"xml": {
|
||||
"name": "CustomerConsentResponse"
|
||||
}
|
||||
}
|
||||
@@ -3,7 +3,7 @@
|
||||
"properties": {
|
||||
"transactionId": {
|
||||
"type": "string",
|
||||
"example": "Tr201712RK9232P115"
|
||||
"example": "TRX201712RK9232P115"
|
||||
},
|
||||
"countryCode": {
|
||||
"type": "string",
|
||||
@@ -11,19 +11,19 @@
|
||||
},
|
||||
"customerId": {
|
||||
"type": "string",
|
||||
"example": "CN621868"
|
||||
},
|
||||
"msisdn": {
|
||||
"type": "string",
|
||||
"example": "8093451342"
|
||||
},
|
||||
"channel": {
|
||||
"type": "string",
|
||||
"example": "100"
|
||||
"example": "5268548"
|
||||
},
|
||||
"accountId": {
|
||||
"type": "string",
|
||||
"example": "ACN8263457"
|
||||
"example": "4348094226"
|
||||
},
|
||||
"msisdn": {
|
||||
"type": "string",
|
||||
"example": "2348093451342"
|
||||
},
|
||||
"channel": {
|
||||
"type": "string",
|
||||
"example": "USSD"
|
||||
}
|
||||
},
|
||||
"xml": {
|
||||
|
||||
@@ -3,19 +3,19 @@
|
||||
"properties": {
|
||||
"customerId": {
|
||||
"type": "string",
|
||||
"example": "CN621868"
|
||||
"example": "5268548"
|
||||
},
|
||||
"transactionId": {
|
||||
"type": "string",
|
||||
"example": "TX12345"
|
||||
"example": "TRX201712RK9232P115"
|
||||
},
|
||||
"countryCode": {
|
||||
"type": "string",
|
||||
"example": "NG"
|
||||
"example": "NGR"
|
||||
},
|
||||
"msisdn": {
|
||||
"type": "string",
|
||||
"example": "3451342"
|
||||
"example": "2348093451342"
|
||||
},
|
||||
"eligibleOffers": {
|
||||
"type": "array",
|
||||
@@ -24,42 +24,42 @@
|
||||
"properties": {
|
||||
"offerId": {
|
||||
"type": "string",
|
||||
"example": "Offer1"
|
||||
"example": "SAL90000204"
|
||||
},
|
||||
"productId": {
|
||||
"type": "string",
|
||||
"example": "Product1"
|
||||
"example": "3MPC"
|
||||
},
|
||||
"minAamount": {
|
||||
"type": "number",
|
||||
"format": "decimal",
|
||||
"example": 100.00
|
||||
"example": 20000.00
|
||||
},
|
||||
"maxAamount": {
|
||||
"type": "number",
|
||||
"format": "decimal",
|
||||
"example": 1000.00
|
||||
"example": 31257.00
|
||||
},
|
||||
"tenor": {
|
||||
"type": "integer",
|
||||
"example": 12
|
||||
"example": 90
|
||||
}
|
||||
}
|
||||
},
|
||||
"example": [
|
||||
{
|
||||
"offerId": "Offer1",
|
||||
"productId": "Product1",
|
||||
"minAamount": 100.00,
|
||||
"maxAamount": 1000.00,
|
||||
"tenor": 12
|
||||
{
|
||||
"max_amount": "31257.00",
|
||||
"min_amount": 20000.0,
|
||||
"offerId": "SAL90000204",
|
||||
"product_id": "3MPC",
|
||||
"tenor": 90
|
||||
},
|
||||
{
|
||||
"offerId": "Offer2",
|
||||
"productId": "Product2",
|
||||
"minAamount": 200.00,
|
||||
"maxAamount": 2000.00,
|
||||
"tenor": 24
|
||||
"max_amount": "20838.00",
|
||||
"min_amount": 5000.0,
|
||||
"offerId": "SAL30000205",
|
||||
"product_id": "AMPC",
|
||||
"tenor": 30
|
||||
}
|
||||
]
|
||||
},
|
||||
|
||||
@@ -3,15 +3,15 @@
|
||||
"properties": {
|
||||
"transactionId": {
|
||||
"type": "string",
|
||||
"example": "Tr201712RK9232P115"
|
||||
"example": "TRCVIC73089465966"
|
||||
},
|
||||
"customerId": {
|
||||
"type": "string",
|
||||
"example": "CN621868"
|
||||
"example": "ZX48440946"
|
||||
},
|
||||
"msisdn": {
|
||||
"type": "string",
|
||||
"example": "3451342"
|
||||
"example": "2348093451342"
|
||||
},
|
||||
"channel": {
|
||||
"type": "string",
|
||||
@@ -19,7 +19,7 @@
|
||||
},
|
||||
"accountId": {
|
||||
"type": "string",
|
||||
"example": "ACN8263457"
|
||||
"example": "361005323"
|
||||
}
|
||||
},
|
||||
"xml": {
|
||||
|
||||
@@ -1,83 +1,110 @@
|
||||
{
|
||||
"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"
|
||||
},
|
||||
"installment": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"amount": {
|
||||
"type": "number",
|
||||
"format": "float",
|
||||
"example": 10000.0
|
||||
},
|
||||
"repaymentDate": {
|
||||
"type": "string",
|
||||
"example": "2025-04-24 10:31:"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"resultCode": {
|
||||
"type": "string",
|
||||
"example": "00"
|
||||
},
|
||||
"resultDescription": {
|
||||
"type": "string",
|
||||
"example": "Successful"
|
||||
}
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"customerId": {
|
||||
"type": "string",
|
||||
"example": "ZX48440946"
|
||||
},
|
||||
"xml": {
|
||||
"name": "LoanStatusResponse"
|
||||
"transactionId": {
|
||||
"type": "string",
|
||||
"example": "TRCVIC49381378037"
|
||||
},
|
||||
"accountId": {
|
||||
"type": "string",
|
||||
"example": "361005323"
|
||||
},
|
||||
"loans": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"debtId": {
|
||||
"type": "integer",
|
||||
"example": 80
|
||||
},
|
||||
"loanDate": {
|
||||
"type": "string",
|
||||
"format": "date-time",
|
||||
"example": "2025-09-12T11:58:58"
|
||||
},
|
||||
"dueDate": {
|
||||
"type": "string",
|
||||
"format": "date-time",
|
||||
"example": "2025-12-11T11:58:58"
|
||||
},
|
||||
"currentLoanAmount": {
|
||||
"type": "number",
|
||||
"format": "float",
|
||||
"example": 30000.0
|
||||
},
|
||||
"initialLoanAmount": {
|
||||
"type": "number",
|
||||
"format": "float",
|
||||
"example": 30000.0
|
||||
},
|
||||
"defaultPenaltyFee": {
|
||||
"type": "number",
|
||||
"format": "float",
|
||||
"example": 0.0
|
||||
},
|
||||
"continuousFee": {
|
||||
"type": "number",
|
||||
"format": "float",
|
||||
"example": 0.0
|
||||
},
|
||||
"productId": {
|
||||
"type": "string",
|
||||
"example": "3MPC"
|
||||
},
|
||||
"installmentAmount": {
|
||||
"type": "number",
|
||||
"format": "float",
|
||||
"example": 10900.0
|
||||
},
|
||||
"repaymentAmount": {
|
||||
"type": "number",
|
||||
"format": "float",
|
||||
"example": 32700.0
|
||||
},
|
||||
"loanRef": {
|
||||
"type": "string",
|
||||
"example": "TRCVIC73089465966USSD3MPC"
|
||||
},
|
||||
"status": {
|
||||
"type": "string",
|
||||
"example": "active"
|
||||
},
|
||||
"tenor": {
|
||||
"type": "integer",
|
||||
"example": 90
|
||||
},
|
||||
"transactionId": {
|
||||
"type": "string",
|
||||
"example": "TRCVIC73089465966"
|
||||
},
|
||||
"upfrontFee": {
|
||||
"type": "number",
|
||||
"format": "float",
|
||||
"example": 622.5
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"resultCode": {
|
||||
"type": "string",
|
||||
"example": "00"
|
||||
},
|
||||
"resultDescription": {
|
||||
"type": "string",
|
||||
"example": "Successful"
|
||||
},
|
||||
"totalDebtAmount": {
|
||||
"type": "number",
|
||||
"format": "float",
|
||||
"example": 30000.0
|
||||
}
|
||||
}
|
||||
},
|
||||
"xml": {
|
||||
"name": "LoanStatusResponse"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,50 +0,0 @@
|
||||
{
|
||||
"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"
|
||||
}
|
||||
}
|
||||
@@ -1,16 +0,0 @@
|
||||
{
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"resultCode": {
|
||||
"type": "string",
|
||||
"example": "00"
|
||||
},
|
||||
"resultDescription": {
|
||||
"type": "string",
|
||||
"example": "Successful"
|
||||
}
|
||||
},
|
||||
"xml": {
|
||||
"name": "NotificationCallbackResponse"
|
||||
}
|
||||
}
|
||||
@@ -3,40 +3,40 @@
|
||||
"properties": {
|
||||
"requestId": {
|
||||
"type": "string",
|
||||
"example": "202111170001371256908"
|
||||
"example": "RQID11170001371256908"
|
||||
},
|
||||
"transactionId": {
|
||||
"type": "string",
|
||||
"example": "Tr201712RK9232P115"
|
||||
"example": "TRCVIC73089465966"
|
||||
},
|
||||
"customerId": {
|
||||
"type": "string",
|
||||
"example": "CN621868"
|
||||
"example": "ZX48440946"
|
||||
},
|
||||
"accountId": {
|
||||
"type": "string",
|
||||
"example": "ACN8263457"
|
||||
"example": "361005323"
|
||||
},
|
||||
"msisdn": {
|
||||
"type": "string",
|
||||
"example": "3451342"
|
||||
"example": "2348093451342"
|
||||
},
|
||||
"requestedAmount": {
|
||||
"type": "number",
|
||||
"format": "decimal",
|
||||
"example": 900
|
||||
"example": 20000
|
||||
},
|
||||
"collectionType": {
|
||||
"type": "integer",
|
||||
"example": 1
|
||||
"example": 0
|
||||
},
|
||||
"offerId": {
|
||||
"type": "integer",
|
||||
"example": 1127
|
||||
"example": "SAL900004543304"
|
||||
},
|
||||
"channel": {
|
||||
"type": "string",
|
||||
"example": "100"
|
||||
"example": "USSD"
|
||||
}
|
||||
},
|
||||
"xml": {
|
||||
|
||||
@@ -1,40 +1,40 @@
|
||||
{
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"requestId": {
|
||||
"type": "string",
|
||||
"example": "202111170001371256908"
|
||||
},
|
||||
"transactionId": {
|
||||
"type": "string",
|
||||
"example": "Tr201712RK9232P115"
|
||||
},
|
||||
"loanRef": {
|
||||
"type": "string",
|
||||
"example": "1620029887USSDAMPC"
|
||||
},
|
||||
"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"
|
||||
}
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"requestId": {
|
||||
"type": "string",
|
||||
"example": "81757678335583"
|
||||
},
|
||||
"xml": {
|
||||
"name": "ProvideLoanResponse"
|
||||
"transactionId": {
|
||||
"type": "string",
|
||||
"example": "TRCVIC73089465966"
|
||||
},
|
||||
"loanRef": {
|
||||
"type": "string",
|
||||
"example": "TRCVIC73089465966USSD3MPC"
|
||||
},
|
||||
"customerId": {
|
||||
"type": "string",
|
||||
"example": "ZX48440946"
|
||||
},
|
||||
"accountId": {
|
||||
"type": "string",
|
||||
"example": "361005323"
|
||||
},
|
||||
"msisdn": {
|
||||
"type": "string",
|
||||
"example": "98016510058"
|
||||
},
|
||||
"resultCode": {
|
||||
"type": "string",
|
||||
"example": "00"
|
||||
},
|
||||
"resultDescription": {
|
||||
"type": "string",
|
||||
"example": "Successful"
|
||||
}
|
||||
}
|
||||
},
|
||||
"xml": {
|
||||
"name": "ProvideLoanResponse"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,27 +3,27 @@
|
||||
"properties": {
|
||||
"msisdn": {
|
||||
"type": "string",
|
||||
"example": "3451342"
|
||||
"example": "2348093451342"
|
||||
},
|
||||
"debtId": {
|
||||
"type": "string",
|
||||
"example": "10"
|
||||
"type": "number",
|
||||
"example": 80
|
||||
},
|
||||
"transactionId": {
|
||||
"type": "string",
|
||||
"example": "20171209232115"
|
||||
"example": "TRCVIC73089465966"
|
||||
},
|
||||
"customerId": {
|
||||
"type": "string",
|
||||
"example": "CID0000025585"
|
||||
"example": "ZX48440946"
|
||||
},
|
||||
"loanRef": {
|
||||
"type": "string",
|
||||
"example": "Trx5847365252USSD3MPC"
|
||||
"example": "TRCVIC73089465966USSD3MPC"
|
||||
},
|
||||
"accountId": {
|
||||
"type": "string",
|
||||
"example": "ACN8263457"
|
||||
"example": "361005323"
|
||||
}
|
||||
},
|
||||
"xml": {
|
||||
|
||||
@@ -1,28 +1,48 @@
|
||||
{
|
||||
"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"
|
||||
}
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"Id": {
|
||||
"type": "integer",
|
||||
"example": 195
|
||||
},
|
||||
"xml": {
|
||||
"name": "RepaymentResponse"
|
||||
"customerId": {
|
||||
"type": "string",
|
||||
"example": "ZX48440946"
|
||||
},
|
||||
"debtId": {
|
||||
"type": "string",
|
||||
"example": "80"
|
||||
},
|
||||
"initiated_by": {
|
||||
"type": "string",
|
||||
"example": "USER_INITIATED"
|
||||
},
|
||||
"loanRef": {
|
||||
"type": "string",
|
||||
"example": "TRCVIC73089465966USSD3MPC"
|
||||
},
|
||||
"productId": {
|
||||
"type": "string",
|
||||
"example": "3MPC"
|
||||
},
|
||||
"repayment_id": {
|
||||
"type": "integer",
|
||||
"example": 195
|
||||
},
|
||||
"transactionId": {
|
||||
"type": "string",
|
||||
"example": "TRCVIC73089465966"
|
||||
},
|
||||
"resultCode": {
|
||||
"type": "string",
|
||||
"example": "00"
|
||||
},
|
||||
"resultDescription": {
|
||||
"type": "string",
|
||||
"example": "Successful"
|
||||
}
|
||||
}
|
||||
},
|
||||
"xml": {
|
||||
"name": "RepaymentResponse"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,40 +3,40 @@
|
||||
"properties": {
|
||||
"requestId": {
|
||||
"type": "string",
|
||||
"example": "202111170001371256908"
|
||||
"example": "RQID11170001371256908"
|
||||
},
|
||||
"transactionId": {
|
||||
"type": "string",
|
||||
"example": "1231231321232"
|
||||
"example": "TRX1231231321232"
|
||||
},
|
||||
"customerId": {
|
||||
"type": "string",
|
||||
"example": "CN621868"
|
||||
},
|
||||
"msisdn": {
|
||||
"type": "string",
|
||||
"example": "123456789"
|
||||
},
|
||||
"requestedAmount": {
|
||||
"type": "number",
|
||||
"format": "double",
|
||||
"example": 10000.55
|
||||
"example": "CN6215268548868"
|
||||
},
|
||||
"accountId": {
|
||||
"type": "string",
|
||||
"example": "ACN8263457"
|
||||
"example": "4348094226"
|
||||
},
|
||||
"msisdn": {
|
||||
"type": "string",
|
||||
"example": "2348093451342"
|
||||
},
|
||||
"requestedAmount": {
|
||||
"type": "number",
|
||||
"example": 20000
|
||||
},
|
||||
|
||||
"productId": {
|
||||
"type": "string",
|
||||
"example": "3MPC"
|
||||
},
|
||||
"offerId": {
|
||||
"type": "string",
|
||||
"example": "101"
|
||||
"example": "SAL900004543304"
|
||||
},
|
||||
"channel": {
|
||||
"type": "string",
|
||||
"example": ""
|
||||
"example": "USSD"
|
||||
}
|
||||
},
|
||||
"xml": {
|
||||
|
||||
@@ -1,121 +1,129 @@
|
||||
{
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"requestId": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"requestId": {
|
||||
"type": "string",
|
||||
"example": "81757678225025"
|
||||
},
|
||||
"transactionId": {
|
||||
"type": "string",
|
||||
"example": "TRCVIC73089465966"
|
||||
},
|
||||
"customerId": {
|
||||
"type": "string",
|
||||
"example": "ZX48440946"
|
||||
},
|
||||
"accountId": {
|
||||
"type": "string",
|
||||
"example": "361005323"
|
||||
},
|
||||
"loan": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"offerId": {
|
||||
"type": "string",
|
||||
"example": "202111170001371256908"
|
||||
},
|
||||
"transactionId": {
|
||||
"example": "SAL90000204"
|
||||
},
|
||||
"productId": {
|
||||
"type": "string",
|
||||
"example": "1231231321232"
|
||||
},
|
||||
"customerId": {
|
||||
"type": "string",
|
||||
"example": "1256907"
|
||||
},
|
||||
"accountId": {
|
||||
"type": "string",
|
||||
"example": "5948306019"
|
||||
},
|
||||
"loan": {
|
||||
"example": "3MPC"
|
||||
},
|
||||
"amount": {
|
||||
"type": "number",
|
||||
"format": "float",
|
||||
"example": 30000.0
|
||||
},
|
||||
"upfrontPayment": {
|
||||
"type": "number",
|
||||
"format": "float",
|
||||
"example": 622.5
|
||||
},
|
||||
"interestRate": {
|
||||
"type": "number",
|
||||
"format": "float",
|
||||
"example": 3.0
|
||||
},
|
||||
"interestFee": {
|
||||
"type": "number",
|
||||
"format": "float",
|
||||
"example": 2700.0
|
||||
},
|
||||
"managementRate": {
|
||||
"type": "number",
|
||||
"format": "float",
|
||||
"example": 1.0
|
||||
},
|
||||
"managementFee": {
|
||||
"type": "number",
|
||||
"format": "float",
|
||||
"example": 300.0
|
||||
},
|
||||
"insuranceRate": {
|
||||
"type": "number",
|
||||
"format": "float",
|
||||
"example": 1.0
|
||||
},
|
||||
"insuranceFee": {
|
||||
"type": "number",
|
||||
"format": "float",
|
||||
"example": 300.0
|
||||
},
|
||||
"VATRate": {
|
||||
"type": "number",
|
||||
"format": "float",
|
||||
"example": 7.5
|
||||
},
|
||||
"VATAmount": {
|
||||
"type": "number",
|
||||
"format": "float",
|
||||
"example": 22.5
|
||||
},
|
||||
"recommendedRepaymentDates": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"offerId": {
|
||||
"type": "string",
|
||||
"example": "14451"
|
||||
},
|
||||
"productId": {
|
||||
"type": "string",
|
||||
"example": "3MPC"
|
||||
},
|
||||
"amount": {
|
||||
"type": "number",
|
||||
"format": "float",
|
||||
"example": 10000.0
|
||||
},
|
||||
"dueDate": {
|
||||
"type": "string",
|
||||
"example": "2025-04-24 10:31:"
|
||||
},
|
||||
"upfrontPayment": {
|
||||
"type": "number",
|
||||
"format": "float",
|
||||
"example": 1000.0
|
||||
},
|
||||
"interestRate": {
|
||||
"type": "number",
|
||||
"format": "float",
|
||||
"example": 3.0
|
||||
},
|
||||
"interestFee": {
|
||||
"type": "number",
|
||||
"format": "float",
|
||||
"example": 3000.00
|
||||
},
|
||||
"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
|
||||
},
|
||||
"installmentRepaymentDates": {
|
||||
"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"
|
||||
"type": "string"
|
||||
},
|
||||
"example": [
|
||||
"2025-10-12",
|
||||
"2025-11-12",
|
||||
"2025-12-12"
|
||||
]
|
||||
},
|
||||
"installmentAmount": {
|
||||
"type": "number",
|
||||
"format": "float",
|
||||
"example": 10900.0
|
||||
},
|
||||
"repaymentAmount": {
|
||||
"type": "number",
|
||||
"format": "float",
|
||||
"example": 32700.0
|
||||
},
|
||||
"totalRepaymentAmount": {
|
||||
"type": "number",
|
||||
"format": "float",
|
||||
"example": 33322.5
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"xml": {
|
||||
"name": "SelectOffersResponse"
|
||||
"outstandingDebtAmount": {
|
||||
"type": "number",
|
||||
"format": "float",
|
||||
"example": 0
|
||||
},
|
||||
"resultCode": {
|
||||
"type": "string",
|
||||
"example": "00"
|
||||
},
|
||||
"resultDescription": {
|
||||
"type": "string",
|
||||
"example": "Successful"
|
||||
}
|
||||
}
|
||||
},
|
||||
"xml": {
|
||||
"name": "SelectOffersResponse"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,45 @@
|
||||
"""empty message
|
||||
|
||||
Revision ID: 30b45df851fa
|
||||
Revises: d59bfb9ead82
|
||||
Create Date: 2025-08-26 13:48:27.458593
|
||||
|
||||
"""
|
||||
from alembic import op
|
||||
import sqlalchemy as sa
|
||||
|
||||
|
||||
# revision identifiers, used by Alembic.
|
||||
revision = '30b45df851fa'
|
||||
down_revision = 'd59bfb9ead82'
|
||||
branch_labels = None
|
||||
depends_on = None
|
||||
|
||||
|
||||
def upgrade():
|
||||
# ### commands auto generated by Alembic - please adjust! ###
|
||||
op.add_column(
|
||||
'loan_repayment_schedules',
|
||||
sa.Column('paid_status', sa.String(length=20), nullable=True),
|
||||
)
|
||||
|
||||
op.add_column(
|
||||
'loan_repayment_schedules',
|
||||
sa.Column('repay_description', sa.String(length=255), nullable=True),
|
||||
)
|
||||
|
||||
|
||||
op.add_column(
|
||||
'loan_repayment_schedules',
|
||||
sa.Column('partial_balance', sa.Float(), nullable=True),
|
||||
)
|
||||
# ### end Alembic commands ###
|
||||
|
||||
|
||||
def downgrade():
|
||||
# ### commands auto generated by Alembic - please adjust! ###
|
||||
op.drop_column('loan_repayment_schedules', 'partial_balance')
|
||||
op.drop_column('loan_repayment_schedules', 'repay_description')
|
||||
op.drop_column('loan_repayment_schedules', 'paid_status')
|
||||
|
||||
# ### end Alembic commands ###
|
||||
@@ -0,0 +1,38 @@
|
||||
"""empty message
|
||||
|
||||
Revision ID: d59bfb9ead82
|
||||
Revises: 05b5494ad406
|
||||
Create Date: 2025-08-21 14:22:19.220158
|
||||
|
||||
"""
|
||||
from alembic import op
|
||||
import sqlalchemy as sa
|
||||
|
||||
|
||||
# revision identifiers, used by Alembic.
|
||||
revision = 'd59bfb9ead82'
|
||||
down_revision = '05b5494ad406'
|
||||
branch_labels = None
|
||||
depends_on = None
|
||||
|
||||
|
||||
def upgrade():
|
||||
# ### commands auto generated by Alembic - please adjust! ###
|
||||
|
||||
op.add_column(
|
||||
'loan_repayment_schedules',
|
||||
sa.Column('due_process_date', sa.DateTime(), nullable=True)
|
||||
)
|
||||
|
||||
# Add due_process_count column
|
||||
op.add_column(
|
||||
'loan_repayment_schedules',
|
||||
sa.Column('due_process_count', sa.Integer(), nullable=True)
|
||||
)
|
||||
|
||||
|
||||
def downgrade():
|
||||
# ### commands auto generated by Alembic - please adjust! ###
|
||||
op.drop_column('loan_repayment_schedules', 'due_process_date')
|
||||
op.drop_column('loan_repayment_schedules', 'due_process_count')
|
||||
# ### end Alembic commands ###
|
||||
Reference in New Issue
Block a user