Skip to content

Commit 5c205bb

Browse files
added functions for transfer retries
1 parent 2fee567 commit 5c205bb

9 files changed

+180
-65
lines changed

README.md

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1621,6 +1621,10 @@ This is used to initiate and manage payouts
16211621

16221622
* ```.getBalance```
16231623

1624+
*```.retryTransfer```
1625+
1626+
*```fetchRetries```
1627+
16241628
<br>
16251629

16261630
### ```.initiate(transferDetails)```
@@ -1817,8 +1821,45 @@ This call returns a dictionary. A sample response is:
18171821
```
18181822

18191823

1824+
### ```.retryTransfer(transfer_id)```
1825+
1826+
This allows you to retry a previously failed transfer attempt. You are expected to pass the id for the failed transfer into this call (ids can be gotten in data object from the initial transfer response)
1827+
1828+
A sample fetch call is:
1829+
1830+
```py
1831+
res2 = rave.retryTransfer.Balance("169680")
1832+
```
1833+
1834+
#### Returns
1835+
1836+
This call returns a dictionary. A sample response is:
1837+
1838+
```py
1839+
{'error': False, 'returnedData': {'status': 'success', 'message': 'Transfer retry attempt queued.', 'data': {'id': 169681, 'account_number': '0690000044', 'bank_code': '044', 'fullname': 'Mercedes Daniel', 'date_created': '2021-02-19T15:56:57.000Z', 'currency': 'NGN', 'amount': 500, 'fee': 10.75, 'status': 'NEW', 'reference': 'SampleTransfer4_PMCK_ST_FDU_1_RETRY_1', 'meta': None, 'narration': 'Test_Transfer_for_new_features', 'complete_message': '', 'requires_approval': 0, 'is_approved': 1, 'bank_name': 'ACCESS BANK NIGERIA'}}}
1840+
```
1841+
18201842
<br>
18211843

1844+
### ```.fetchRetries(transfer_id)```
1845+
1846+
This allows you to get all retry attempts for all previously failed transfer attempts.
1847+
1848+
A sample fetch call is:
1849+
1850+
```py
1851+
res2 = rave.fetchRetries.Balance("169680")
1852+
```
1853+
1854+
#### Returns
1855+
1856+
This call returns a dictionary. A sample response is:
1857+
1858+
```py
1859+
{'error': False, 'returnedData': {'status': 'success', 'message': 'Transfer retry attempts retrieved.', 'data': [{'id': 169681, 'account_number': '0690000044', 'bank_code': '044', 'bank_name': 'ACCESS BANK NIGERIA', 'fullname': 'Mercedes Daniel', 'currency': 'NGN', 'debit_currency': None, 'amount': 500, 'fee': 10.75, 'status': 'FAILED', 'reference': 'SampleTransfer4_PMCK_ST_FDU_1_RETRY_1', 'narration': 'Test_Transfer_for_new_features', 'complete_message': 'DISBURSE FAILED: Transfer failed. Please contact support', 'meta': None, 'requires_approval': 0, 'is_approved': 1, 'date_created': '2021-02-19T15:56:57.000Z'}]}}
1860+
```
1861+
1862+
18221863
### Complete transfer flow
18231864

18241865
```py

rave_python/rave_base.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,9 @@ def __init__(self, publicKey=None, secretKey=None, production=False, usingEnv=Tr
6868
"fetch": "v2/gpx/transfers",
6969
"fee": "v2/gpx/transfers/fee",
7070
"balance": "v2/gpx/balance",
71-
"accountVerification": "flwv3-pug/getpaidx/api/resolve_account"
71+
"accountVerification": "flwv3-pug/getpaidx/api/resolve_account",
72+
"retry": "v2/gpx/transfers/retry",
73+
"inter_wallet": "v2/gpx/transfers/wallet"
7274
},
7375
"recipient":{
7476
"create": "v2/gpx/transfers/beneficiaries/create",

rave_python/rave_bills.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ def create(self, details):
5757
tracking_payload = {
5858
"publicKey": self._getPublicKey(),
5959
"language": "Python v2",
60-
"version": "1.2.9",
60+
"version": "1.2.10",
6161
"title": "Create-Bills-error",
6262
"message": responseTime
6363
}
@@ -68,7 +68,7 @@ def create(self, details):
6868
tracking_payload = {
6969
"publicKey": self._getPublicKey(),
7070
"language": "Python v2",
71-
"version": "1.2.9",
71+
"version": "1.2.10",
7272
"title": "Create-Bills",
7373
"message": responseTime
7474
}

rave_python/rave_payment.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -218,12 +218,12 @@ def charge(self, feature_name, paymentDetails, requiredParameters, endpoint, sho
218218
if response.ok:
219219
tracking_endpoint = self._trackingMap
220220
responseTime = response.elapsed.total_seconds()
221-
tracking_payload = {"publicKey": self._getPublicKey(),"language": "Python v2", "version": "1.2.9", "title": feature_name, "message": responseTime}
221+
tracking_payload = {"publicKey": self._getPublicKey(),"language": "Python v2", "version": "1.2.10", "title": feature_name, "message": responseTime}
222222
tracking_response = requests.post(tracking_endpoint, data=json.dumps(tracking_payload))
223223
else:
224224
tracking_endpoint = self._trackingMap
225225
responseTime = response.elapsed.total_seconds()
226-
tracking_payload = {"publicKey": self._getPublicKey(),"language": "Python v2", "version": "1.2.9", "title": feature_name + "-error", "message": responseTime}
226+
tracking_payload = {"publicKey": self._getPublicKey(),"language": "Python v2", "version": "1.2.10", "title": feature_name + "-error", "message": responseTime}
227227
tracking_response = requests.post(tracking_endpoint, data=json.dumps(tracking_payload))
228228

229229
if shouldReturnRequest:
@@ -265,12 +265,12 @@ def validate(self, feature_name, flwRef, otp, endpoint=None):
265265
if response.ok:
266266
tracking_endpoint = self._trackingMap
267267
responseTime = response.elapsed.total_seconds()
268-
tracking_payload = {"publicKey": self._getPublicKey(),"language": "Python v2", "version": "1.2.9", "title": feature_name, "message": responseTime}
268+
tracking_payload = {"publicKey": self._getPublicKey(),"language": "Python v2", "version": "1.2.10", "title": feature_name, "message": responseTime}
269269
tracking_response = requests.post(tracking_endpoint, data=json.dumps(tracking_payload))
270270
else:
271271
tracking_endpoint = self._trackingMap
272272
responseTime = response.elapsed.total_seconds()
273-
tracking_payload = {"publicKey": self._getPublicKey(),"language": "Python v2", "version": "1.2.9", "title": feature_name + "-error", "message": responseTime}
273+
tracking_payload = {"publicKey": self._getPublicKey(),"language": "Python v2", "version": "1.2.10", "title": feature_name + "-error", "message": responseTime}
274274
tracking_response = requests.post(tracking_endpoint, data=json.dumps(tracking_payload))
275275

276276
return self._handleValidateResponse(response, flwRef)
@@ -300,12 +300,12 @@ def verify(self, feature_name, txRef, endpoint=None):
300300
if response.ok:
301301
tracking_endpoint = self._trackingMap
302302
responseTime = response.elapsed.total_seconds()
303-
tracking_payload = {"publicKey": self._getPublicKey(),"language": "Python v2", "version": "1.2.9", "title": feature_name, "message": responseTime}
303+
tracking_payload = {"publicKey": self._getPublicKey(),"language": "Python v2", "version": "1.2.10", "title": feature_name, "message": responseTime}
304304
tracking_response = requests.post(tracking_endpoint, data=json.dumps(tracking_payload))
305305
else:
306306
tracking_endpoint = self._trackingMap
307307
responseTime = response.elapsed.total_seconds()
308-
tracking_payload = {"publicKey": self._getPublicKey(),"language": "Python v2", "version": "1.2.9", "title": feature_name + "-error", "message": responseTime}
308+
tracking_payload = {"publicKey": self._getPublicKey(),"language": "Python v2", "version": "1.2.10", "title": feature_name + "-error", "message": responseTime}
309309
tracking_response = requests.post(tracking_endpoint, data=json.dumps(tracking_payload))
310310

311311
return self._handleVerifyResponse(response, txRef)
@@ -332,12 +332,12 @@ def refund(self, feature_name, flwRef, amount, ):
332332
if response.ok:
333333
tracking_endpoint = self._trackingMap
334334
responseTime = response.elapsed.total_seconds()
335-
tracking_payload = {"publicKey": self._getPublicKey(),"language": "Python v2", "version": "1.2.9", "title": feature_name, "message": responseTime}
335+
tracking_payload = {"publicKey": self._getPublicKey(),"language": "Python v2", "version": "1.2.10", "title": feature_name, "message": responseTime}
336336
tracking_response = requests.post(tracking_endpoint, data=json.dumps(tracking_payload))
337337
else:
338338
tracking_endpoint = self._trackingMap
339339
responseTime = response.elapsed.total_seconds()
340-
tracking_payload = {"publicKey": self._getPublicKey(),"language": "Python v2", "version": "1.2.9", "title": feature_name + "-error", "message": responseTime}
340+
tracking_payload = {"publicKey": self._getPublicKey(),"language": "Python v2", "version": "1.2.10", "title": feature_name + "-error", "message": responseTime}
341341
tracking_response = requests.post(tracking_endpoint, data=json.dumps(tracking_payload))
342342

343343
try:

rave_python/rave_transfer.py

Lines changed: 117 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,74 @@ def _handleBulkResponse(self, response, bulkDetails):
4343
return {"error": False, "status": responseJson["status"], "message":responseJson["message"], "id": responseJson["data"].get("id", None), "data": responseJson["data"]}
4444
else:
4545
raise InitiateTransferError({"error": True, "data": responseJson["data"]})
46+
47+
# This makes and handles all requests pertaining to the status of your transfer or account
48+
def _handleTransferStatusRequests(self, feature_name, endpoint, isPostRequest=False, data=None):
49+
50+
# Request headers
51+
headers = {
52+
'content-type': 'application/json',
53+
}
54+
55+
# Checks if it is a post request
56+
if isPostRequest:
57+
response = requests.post(endpoint, headers=headers, data=json.dumps(data))
58+
else:
59+
response = requests.get(endpoint, headers=headers)
60+
61+
# Checks if it can be parsed to json
62+
try:
63+
responseJson = response.json()
64+
except:
65+
raise ServerError({"error": True, "errMsg": response.text })
66+
67+
# Checks if it returns a 2xx code
68+
if response.ok:
69+
tracking_endpoint = self._trackingMap
70+
responseTime = response.elapsed.total_seconds()
71+
tracking_payload = {"publicKey": self._getPublicKey(),"language": "Python v2", "version": "1.2.10", "title": feature_name,"message": responseTime}
72+
tracking_response = requests.post(tracking_endpoint, data=json.dumps(tracking_payload))
73+
return {"error": False, "returnedData": responseJson}
74+
else:
75+
tracking_endpoint = self._trackingMap
76+
responseTime = response.elapsed.total_seconds()
77+
tracking_payload = {"publicKey": self._getPublicKey(),"language": "Python v2", "version": "1.2.10", "title": feature_name + "-error","message": responseTime}
78+
raise TransferFetchError({"error": True, "returnedData": responseJson })
79+
80+
def _handleTransferRetriesRequests(self, feature_name, endpoint, isPostRequest=False, data=None):
81+
82+
# Request headers
83+
headers = {
84+
'content-type': 'application/json',
85+
}
86+
87+
# Checks if it is a post request
88+
if isPostRequest:
89+
response = requests.post(endpoint, headers=headers, data=json.dumps(data))
90+
else:
91+
response = requests.get(endpoint, headers=headers)
92+
93+
# Checks if it can be parsed to json
94+
try:
95+
responseJson = response.json()
96+
errorMessage = responseJson["message"]
97+
except:
98+
raise ServerError({"error": True, "errMsg": response.text })
99+
100+
# Checks if it returns a 2xx code
101+
if response.ok:
102+
tracking_endpoint = self._trackingMap
103+
responseTime = response.elapsed.total_seconds()
104+
tracking_payload = {"publicKey": self._getPublicKey(),"language": "Python v2", "version": "1.2.10", "title": feature_name,"message": responseTime}
105+
tracking_response = requests.post(tracking_endpoint, data=json.dumps(tracking_payload))
106+
return {"error": False, "returnedData": responseJson}
107+
else:
108+
tracking_endpoint = self._trackingMap
109+
responseTime = response.elapsed.total_seconds()
110+
tracking_payload = {"publicKey": self._getPublicKey(),"language": "Python v2", "version": "1.2.10", "title": feature_name + "-error","message": responseTime}
111+
return {"error": True, "returnedData": errorMessage }
112+
46113

47-
48114
def initiate(self, transferDetails):
49115

50116

@@ -74,12 +140,12 @@ def initiate(self, transferDetails):
74140
#feature logging
75141
tracking_endpoint = self._trackingMap
76142
responseTime = response.elapsed.total_seconds()
77-
tracking_payload = {"publicKey": self._getPublicKey(),"language": "Python v2", "version": "1.2.9", "title": "Initiate-Transfer-error","message": responseTime}
143+
tracking_payload = {"publicKey": self._getPublicKey(),"language": "Python v2", "version": "1.2.10", "title": "Initiate-Transfer-error","message": responseTime}
78144
tracking_response = requests.post(tracking_endpoint, data=json.dumps(tracking_payload))
79145
else:
80146
tracking_endpoint = self._trackingMap
81147
responseTime = response.elapsed.total_seconds()
82-
tracking_payload = {"publicKey": self._getPublicKey(),"language": "Python v2", "version": "1.2.9", "title": "Initiate-Transfer","message": responseTime}
148+
tracking_payload = {"publicKey": self._getPublicKey(),"language": "Python v2", "version": "1.2.10", "title": "Initiate-Transfer","message": responseTime}
83149
tracking_response = requests.post(tracking_endpoint, data=json.dumps(tracking_payload))
84150
return self._handleInitiateResponse(response, transferDetails)
85151

@@ -89,12 +155,7 @@ def bulk(self, bulkDetails):
89155

90156
# feature logic
91157
bulkDetails = copy.copy(bulkDetails)
92-
93-
# Collating request headers
94-
headers = {
95-
'content-type': 'application/json',
96-
}
97-
158+
98159
bulkDetails.update({"seckey": self._getSecretKey()})
99160
requiredParameters = ["title", "bulk_data"]
100161
checkIfParametersAreComplete(requiredParameters, bulkDetails)
@@ -111,50 +172,16 @@ def bulk(self, bulkDetails):
111172
#feature logging
112173
tracking_endpoint = self._trackingMap
113174
responseTime = response.elapsed.total_seconds()
114-
tracking_payload = {"publicKey": self._getPublicKey(),"language": "Python v2", "version": "1.2.9", "title": "Initiate-Bulk-error","message": responseTime}
175+
tracking_payload = {"publicKey": self._getPublicKey(),"language": "Python v2", "version": "1.2.10", "title": "Initiate-Bulk-error","message": responseTime}
115176
tracking_response = requests.post(tracking_endpoint, data=json.dumps(tracking_payload))
116177
else:
117178
tracking_endpoint = self._trackingMap
118179
responseTime = response.elapsed.total_seconds()
119-
tracking_payload = {"publicKey": self._getPublicKey(),"language": "Python v2", "version": "1.2.9", "title": "Initiate-Bulk","message": responseTime}
180+
tracking_payload = {"publicKey": self._getPublicKey(),"language": "Python v2", "version": "1.2.10", "title": "Initiate-Bulk","message": responseTime}
120181
tracking_response = requests.post(tracking_endpoint, data=json.dumps(tracking_payload))
121182

122183
return self._handleBulkResponse(response, bulkDetails)
123184

124-
125-
# This makes and handles all requests pertaining to the status of your transfer or account
126-
def _handleTransferStatusRequests(self, endpoint, feature_name, isPostRequest=False, data=None):
127-
128-
# Request headers
129-
headers = {
130-
'content-type': 'application/json',
131-
}
132-
133-
# Checks if it is a post request
134-
if isPostRequest:
135-
response = requests.post(endpoint, headers=headers, data=json.dumps(data))
136-
else:
137-
response = requests.get(endpoint, headers=headers)
138-
139-
# Checks if it can be parsed to json
140-
try:
141-
responseJson = response.json()
142-
except:
143-
raise ServerError({"error": True, "errMsg": response.text })
144-
145-
# Checks if it returns a 2xx code
146-
if response.ok:
147-
tracking_endpoint = self._trackingMap
148-
responseTime = response.elapsed.total_seconds()
149-
tracking_payload = {"publicKey": self._getPublicKey(),"language": "Python v2", "version": "1.2.9", "title": feature_name,"message": responseTime}
150-
tracking_response = requests.post(tracking_endpoint, data=json.dumps(tracking_payload))
151-
return {"error": False, "returnedData": responseJson}
152-
else:
153-
tracking_endpoint = self._trackingMap
154-
responseTime = response.elapsed.total_seconds()
155-
tracking_payload = {"publicKey": self._getPublicKey(),"language": "Python v2", "version": "1.2.9", "title": feature_name + "-error","message": responseTime}
156-
raise TransferFetchError({"error": True, "returnedData": responseJson })
157-
158185
# Not elegant but supports python 2 and 3
159186
def fetch(self, reference=None):
160187

@@ -190,6 +217,51 @@ def getBalance(self, currency):
190217
}
191218

192219
return self._handleTransferStatusRequests(label, endpoint, data=data, isPostRequest=True)
220+
221+
def retryTransfer(self, transfer_id):
222+
223+
#feature logic
224+
label = "retry_failed_transfer"
225+
endpoint = self._baseUrl + self._endpointMap["transfer"]["retry"]
226+
data = {
227+
"seckey": self._getSecretKey(),
228+
"id": transfer_id
229+
}
230+
return self._handleTransferRetriesRequests(label, endpoint, data=data, isPostRequest=True)
231+
232+
def fetchRetries(self, transfer_id):
233+
label = "fetch_transfer_retries"
234+
endpoint = self._baseUrl + self._endpointMap["transfer"]["fetch"] + "/" + str(transfer_id) + "/retries?seckey=" + self._getSecretKey()
235+
return self._handleTransferRetriesRequests(label, endpoint)
236+
237+
# def walletTransfer(self, transferDetails):
238+
# data = {
239+
# "seckey": self._getSecretKey(),
240+
# "currency": transferDetails["currency"],
241+
# "amount": transferDetails["amount"],
242+
# "merchant_id": transferDetails["merchant_id"]
243+
# }
244+
245+
# headers = {
246+
# 'content-type': 'application/json',
247+
# }
248+
249+
250+
# endpoint = self._baseUrl + self._endpointMap["transfer"]["inter_wallet"]
251+
# response = requests.post(endpoint, headers=headers, data=json.dumps(data))
252+
253+
# if response.ok == False:
254+
# #feature logging
255+
# tracking_endpoint = self._trackingMap
256+
# responseTime = response.elapsed.total_seconds()
257+
# tracking_payload = {"publicKey": self._getPublicKey(),"language": "Python v2", "version": "1.2.10", "title": "interwallet_transfers-error","message": responseTime}
258+
# tracking_response = requests.post(tracking_endpoint, data=json.dumps(tracking_payload))
259+
# else:
260+
# tracking_endpoint = self._trackingMap
261+
# responseTime = response.elapsed.total_seconds()
262+
# tracking_payload = {"publicKey": self._getPublicKey(),"language": "Python v2", "version": "1.2.10", "title": "interwallet_transfers","message": responseTime}
263+
# tracking_response = requests.post(tracking_endpoint, data=json.dumps(tracking_payload))
264+
# return self._handleInitiateInterWalletResponse(response, data)
193265

194266

195267

0 commit comments

Comments
 (0)