Coverage for src/integrify/epoint/client.py: 100%

35 statements  

« prev     ^ index     » next       coverage.py v7.6.10, created at 2025-02-10 00:57 +0000

1from typing import TYPE_CHECKING, Any, Optional 

2from typing import SupportsFloat as Numeric 

3 

4from integrify.api import APIClient 

5from integrify.epoint import env 

6from integrify.epoint.handlers import ( 

7 GetTransactionStatusPayloadHandler, 

8 PayAndSaveCardPayloadHandler, 

9 PaymentPayloadHandler, 

10 PayoutPayloadHandler, 

11 PayWithSavedCardPayloadHandler, 

12 RefundPayloadHandler, 

13 SaveCardPayloadHandler, 

14 SplitPayAndSaveCardPayloadHandler, 

15 SplitPayPayloadHandler, 

16 SplitPayWithSavedCardPayloadHandler, 

17) 

18from integrify.epoint.schemas.response import ( 

19 BaseResponseSchema, 

20 MinimalResponseSchema, 

21 RedirectUrlResponseSchema, 

22 RedirectUrlWithCardIdResponseSchema, 

23 SplitPayWithSavedCardResponseSchema, 

24 TransactionStatusResponseSchema, 

25) 

26from integrify.schemas import APIResponse 

27 

28__all__ = ['EPointClientClass'] 

29 

30 

31class EPointClientClass(APIClient): 

32 """EPoint sorğular üçün baza class""" 

33 

34 def __init__(self, sync: bool = True): 

35 super().__init__('EPoint', env.API.BASE_URL, None, sync) 

36 

37 self.add_url('pay', env.API.PAY) 

38 self.add_handler('pay', PaymentPayloadHandler) 

39 

40 self.add_url('get_transaction_status', env.API.GET_STATUS) 

41 self.add_handler('get_transaction_status', GetTransactionStatusPayloadHandler) 

42 

43 self.add_url('save_card', env.API.SAVE_CARD) 

44 self.add_handler('save_card', SaveCardPayloadHandler) 

45 

46 self.add_url('pay_with_saved_card', env.API.PAY_WITH_SAVED_CARD) 

47 self.add_handler('pay_with_saved_card', PayWithSavedCardPayloadHandler) 

48 

49 self.add_url('pay_and_save_card', env.API.PAY_AND_SAVE_CARD) 

50 self.add_handler('pay_and_save_card', PayAndSaveCardPayloadHandler) 

51 

52 self.add_url('payout', env.API.PAYOUT) 

53 self.add_handler('payout', PayoutPayloadHandler) 

54 

55 self.add_url('refund', env.API.REFUND) 

56 self.add_handler('refund', RefundPayloadHandler) 

57 

58 self.add_url('split_pay', env.API.SPLIT_PAY) 

59 self.add_handler('split_pay', SplitPayPayloadHandler) 

60 

61 self.add_url('split_pay_with_saved_card', env.API.SPLIT_PAY_WITH_SAVED_CARD) 

62 self.add_handler('split_pay_with_saved_card', SplitPayWithSavedCardPayloadHandler) 

63 

64 self.add_url('split_pay_and_save_card', env.API.SPLIT_PAY_AND_SAVE_CARD) 

65 self.add_handler('split_pay_and_save_card', SplitPayAndSaveCardPayloadHandler) 

66 

67 def add_url( 

68 self, 

69 route_name: str, 

70 url: str, 

71 verb: str = 'POST', 

72 base_url: Optional[str] = None, 

73 ): 

74 return super().add_url(route_name, url, verb, base_url) 

75 

76 if TYPE_CHECKING: 

77 

78 def pay( 

79 self, 

80 amount: Numeric, 

81 currency: str, 

82 order_id: str, 

83 description: Optional[str] = None, 

84 **extra: Any, 

85 ) -> APIResponse[RedirectUrlResponseSchema]: 

86 """Ödəniş sorğusu 

87 

88 **Endpoint:** */api/1/request* 

89 

90 Example: 

91 ```python 

92 from integrify.epoint import EPointRequest 

93 

94 EPointRequest.pay(amount=100, currency='AZN', order_id='12345678', description='Ödəniş') 

95 ``` 

96 

97 **Cavab formatı**: [`RedirectUrlResponseSchema`][integrify.epoint.schemas.response.RedirectUrlResponseSchema] 

98 

99 Bu sorğunu göndərdikdə, cavab olaraq `redirect_url` gəlir. Müştəri həmin URLə daxil 

100 olub, kart məlumatlarını daxil edib, uğurlu ödəniş etdikdən sonra, backend callback 

101 APIsinə (EPoint dashboard-ında qeyd etdiyiniz) sorğu daxil olur, və eyni `order_id` 

102 ilə [`DecodedCallbackDataSchema`][integrify.epoint.schemas.callback.DecodedCallbackDataSchema] 

103 formatında məlumat gəlir. 

104 

105 Args: 

106 amount: Ödəniş miqdarı. Numerik dəyər. 

107 currency: Ödəniş məzənnəsi. Mümkün dəyərlər: AZN 

108 order_id: Unikal ID. Maksimal uzunluq: 255 simvol. 

109 description: Ödənişin təsviri. Maksimal uzunluq: 1000 simvol. Məcburi arqument deyil. 

110 **extra: Başqa ötürmək istədiyiniz əlavə dəyərlər. Bu dəyərlər callback sorğuda sizə 

111 geri göndərilir. 

112 """ # noqa: E501 

113 

114 def get_transaction_status( 

115 self, 

116 transaction_id: str, 

117 ) -> APIResponse[TransactionStatusResponseSchema]: 

118 """ 

119 Transaksiya statusunu öyrənmək üçün sorğu 

120 

121 **Endpoint:** */api/1/get-status* 

122 

123 Example: 

124 ```python 

125 from integrify.epoint import EPointRequest 

126 

127 EPointRequest.get_transaction_status(transaction_id='texxxxxx') 

128 ``` 

129 

130 Cavab formatı: [`TransactionStatusResponseSchema`][integrify.epoint.schemas.response.TransactionStatusResponseSchema] 

131 

132 Args: 

133 transaction_id: EPoint tərəfindən verilmiş tranzaksiya IDsi. 

134 Adətən `te` prefiksi ilə olur. 

135 """ # noqa: E501 

136 

137 def save_card(self) -> APIResponse[RedirectUrlWithCardIdResponseSchema]: 

138 """Ödəniş olmadan kartı yadda saxlamaq sorğusu 

139 

140 **Endpoint:** */api/1/card-registration* 

141 

142 Example: 

143 ```python 

144 from integrify.epoint import EPointRequest 

145 

146 EPointRequest.save_card() 

147 ``` 

148 

149 Cavab formatı: [`RedirectUrlWithCardIdResponseSchema`][integrify.epoint.schemas.response.RedirectUrlWithCardIdResponseSchema] 

150 

151 Bu sorğunu göndərdikdə, cavab olaraq `redirect_url` və `card_id` gəlir. 

152 Müştəri həmin URLə daxil olub, kart məlumatlarını uğurlu qeyd etdikdən sonra, 

153 backend callback APIsinə (EPoint dashboard-ında qeyd etdiyiniz) sorğu daxil olur, 

154 və eyni `card_id` ilə [`DecodedCallbackDataSchema`][integrify.epoint.schemas.callback.DecodedCallbackDataSchema] 

155 formatında məlumat gəlir. 

156 """ # noqa: E501 

157 

158 def pay_with_saved_card( 

159 self, 

160 amount: Numeric, 

161 currency: str, 

162 order_id: str, 

163 card_id: str, 

164 ) -> APIResponse[BaseResponseSchema]: 

165 """Yadda saxlanılmış kartla ödəniş sorğusu 

166 

167 **Endpoint:** */api/1/execute-pay* 

168 

169 Example: 

170 ```python 

171 from integrify.epoint import EPointRequest 

172 

173 EPointRequest.pay_with_saved_card(amount=100, currency='AZN', order_id='12345678', card_id='cexxxxxx') 

174 ``` 

175 

176 Cavab formatı: [`BaseResponseSchema`][integrify.epoint.schemas.response.BaseResponseSchema] 

177 

178 Bu sorğunu göndərdikdə, cavab olaraq `BaseResponseSchema` formatında 

179 cavab gəlir, və ödənişin statusu birbaşa qayıdır: heç bir callback sorğusu gəlmir. 

180 

181 Args: 

182 amount: Ödəniş miqdarı. Numerik dəyər. 

183 currency: Ödəniş məzənnəsi. Mümkün dəyərlər: AZN 

184 order_id: Unikal ID. Maksimal uzunluq: 255 simvol. 

185 card_id: Saxlanılmış kartın id-si. Adətən `ce` prefiksi ilə başlayır. 

186 """ # noqa: E501 

187 

188 def pay_and_save_card( 

189 self, 

190 amount: Numeric, 

191 currency: str, 

192 order_id: str, 

193 description: Optional[str] = None, 

194 ) -> APIResponse[RedirectUrlWithCardIdResponseSchema]: 

195 """Ödəniş və kartı yadda saxlama sorğusu 

196 

197 **Endpoint:** */api/1/card-registration-with-pay* 

198 

199 Example: 

200 ```python 

201 from integrify.epoint import EPointRequest 

202 

203 EPointRequest.pay_and_save_card(amount=100, currency='AZN', order_id='12345678', description='Ödəniş') 

204 ``` 

205 

206 Cavab formatı: [`RedirectUrlWithCardIdResponseSchema`][integrify.epoint.schemas.response.RedirectUrlWithCardIdResponseSchema] 

207 

208 Bu sorğunu göndərdikdə, cavab olaraq `redirect_url` və `card_id` gəlir. Müştəri həmin URLə 

209 daxil olub, kart məlumatlarını daxil edib, uğurlu ödəniş etdikdən sonra, backend callback 

210 APIsinə (EPoint dashboard-ında qeyd etdiyiniz) sorğu daxil olur, və eyni `order_id` və 

211 `card_id` ilə [`DecodedCallbackDataSchema`][integrify.epoint.schemas.callback.DecodedCallbackDataSchema] 

212 formatında məlumat gəlir. 

213 

214 Args: 

215 amount: Ödəniş miqdarı. Numerik dəyər. 

216 currency: Ödəniş məzənnəsi. Mümkün dəyərlər: AZN 

217 order_id: Unikal ID. Maksimal uzunluq: 255 simvol. 

218 description: Ödənişin təsviri. Maksimal uzunluq: 1000 simvol. Məcburi arqument deyil. 

219 """ # noqa: E501 

220 

221 def payout( 

222 self, 

223 amount: Numeric, 

224 currency: str, 

225 order_id: str, 

226 card_id: str, 

227 description: Optional[str] = None, 

228 ) -> APIResponse[BaseResponseSchema]: 

229 """Hesabınızda olan pulu karta nağdlaşdırmaq sorğusu 

230 

231 **Endpoint:** */api/1/refund-request* 

232 

233 Example: 

234 ```python 

235 from integrify.epoint import EPointRequest 

236 

237 EPointRequest.payout(amount=100, currency='AZN', order_id='12345678', card_id='cexxxxxx', description='Ödəniş') 

238 ``` 

239 

240 Cavab sorğu formatı: [`BaseResponseSchema`][integrify.epoint.schemas.response.BaseResponseSchema] 

241 

242 Bu sorğunu göndərdikdə, əməliyyat Epoint xidməti tərəfindən işləndikdən və bankdan ödəniş 

243 statusu alındıqdan sonra cavab `BaseResponseSchema` formatında qayıdacaqdır 

244 

245 Args: 

246 amount: Nağdlaşdırmaq miqdarı. Numerik dəyər. 

247 currency: Nağdlaşdırma məzənnəsi. Mümkün dəyərlər: AZN 

248 order_id: Unikal ID. Maksimal uzunluq: 255 simvol. 

249 card_id: Saxlanılmış kartın id-si. Adətən `ce` prefiksi ilə başlayır. 

250 description: Nağdlaşdırmanın təsviri. Maksimal uzunluq: 1000 simvol. Məcburi arqument deyil. 

251 """ # noqa: E501 

252 

253 def refund( 

254 self, 

255 transaction_id: str, 

256 currency: str, 

257 amount: Optional[Numeric] = None, 

258 ) -> APIResponse[MinimalResponseSchema]: 

259 """Keçmiş ödənişi tam və ya yarımçıq geri qaytarma sorğusu 

260 

261 **Endpoint:** */api/1/reverse* 

262 

263 Example: 

264 ```python 

265 from integrify.epoint import EPointRequest 

266 

267 # Full refund 

268 EPointRequest.refund(transaction_id='texxxxxx', currency='AZN') 

269 

270 # Partial refund 

271 EPointRequest.refund(transaction_id='texxxxxx', currency='AZN', amount=50) 

272 ``` 

273 

274 Cavab formatı: [`MinimalResponseSchema`][integrify.epoint.schemas.response.MinimalResponseSchema] 

275 

276 Bu sorğunu göndərdikdə, cavab olaraq `status` və `message` gəlir. 

277 Heç bir callback sorğusu göndərilmir. 

278 

279 Args: 

280 transaction_id: EPoint tərəfindən verilmiş tranzaksiya IDsi. 

281 Adətən `te` prefiksi ilə olur. 

282 currency: Ödəniş məzənnəsi. Mümkün dəyərlər: AZN 

283 amount: Ödəniş məbləği. Məbləğin göndərilməsi yarımçıq geri-qaytarma hesab olunur, 

284 əks halda tam geri-qaytarma baş verəcəkdir. 

285 """ # noqa: E501 

286 

287 def split_pay( 

288 self, 

289 amount: Numeric, 

290 currency: str, 

291 order_id: str, 

292 split_user_id: str, 

293 split_amount: Numeric, 

294 description: Optional[str] = None, 

295 **extra: Any, 

296 ) -> APIResponse[RedirectUrlResponseSchema]: 

297 """Ödənişi başqa EPoint istifadəçisi ilə bölüb ödəmə sorğusu 

298 

299 **Endpoint:** */api/1/split-request* 

300 

301 Example: 

302 ```python 

303 from integrify.epoint import EPointRequest 

304 

305 EPointRequest.split_pay(amount=100, currency='AZN', order_id='123456789', split_user_id='epoint_user_id', split_amount=50, description='split payment') 

306 ``` 

307 

308 Cavab formatı: [`RedirectUrlResponseSchema`][integrify.epoint.schemas.response.RedirectUrlResponseSchema] 

309 

310 Args: 

311 amount: Ödəniş miqdarı. Numerik dəyər. 

312 currency: Ödəniş məzənnəsi. Mümkün dəyərlər: AZN 

313 order_id: Unikal ID. Maksimal uzunluq: 255 simvol. 

314 split_user_id: Ödənişi böləcəyini **EPoint** user-ini IDsi 

315 split_amount: Bölünən miqdar. Numerik dəyər 

316 description: Ödənişin təsviri. Maksimal uzunluq: 1000 simvol. Məcburi arqument deyil. 

317 **extra: Başqa ötürmək istədiyiniz əlavə dəyərlər. Bu dəyərlər callback sorğuda sizə 

318 geri göndərilir. 

319 """ # noqa: E501 

320 

321 def split_pay_with_saved_card( 

322 self, 

323 amount: Numeric, 

324 currency: str, 

325 order_id: str, 

326 card_id: str, 

327 split_user_id: str, 

328 split_amount: Numeric, 

329 description: Optional[str] = None, 

330 ) -> APIResponse[SplitPayWithSavedCardResponseSchema]: 

331 """Saxlanılmış kartla ödənişi başqa EPoint istifadəçisi ilə bölüb ödəmə sorğusu 

332 

333 **Endpoint:** */api/1/split-execute-pay* 

334 

335 Example: 

336 ```python 

337 from integrify.epoint import EPointRequest 

338 

339 EPointRequest.split_pay_with_saved_card(amount=100, currency='AZN', order_id='123456789', card_id='cexxxxxx', split_user_id='epoint_user_id', split_amount=50, description='split payment') 

340 ``` 

341 

342 Cavab formatı: [`SplitPayWithSavedCardResponseSchema`][integrify.epoint.schemas.response.SplitPayWithSavedCardResponseSchema] 

343 

344 Args: 

345 amount: Ödəniş miqdarı. Numerik dəyər. 

346 currency: Ödəniş məzənnəsi. Mümkün dəyərlər: AZN 

347 order_id: Unikal ID. Maksimal uzunluq: 255 simvol. 

348 card_id: Saxlanılmış kartın id-si. Adətən `ce` prefiksi ilə başlayır. 

349 split_user_id: Ödənişi böləcəyini **EPoint** user-ini IDsi 

350 split_amount: Bölünən miqdar. Numerik dəyər 

351 description: Ödənişin təsviri. Maksimal uzunluq: 1000 simvol. Məcburi arqument deyil. 

352 """ # noqa: E501 

353 

354 def split_pay_and_save_card( 

355 self, 

356 amount: Numeric, 

357 currency: str, 

358 order_id: str, 

359 split_user_id: str, 

360 split_amount: Numeric, 

361 description: Optional[str] = None, 

362 ) -> APIResponse[RedirectUrlWithCardIdResponseSchema]: 

363 """Ödənişi başqa EPoint istifadəçisi ilə bölüb ödəmə və kartı saxlama sorğusu 

364 

365 **Endpoint:** */api/1/split-card-registration-with-pay* 

366 

367 Example: 

368 ```python 

369 from integrify.epoint import EPointRequest 

370 

371 EPointRequest.split_pay_and_save_card(amount=100, currency='AZN', order_id='123456789', split_user_id='epoint_user_id', split_amount=50, description='split payment') 

372 ``` 

373 

374 Cavab formatı: [`RedirectUrlWithCardIdResponseSchema`][integrify.epoint.schemas.response.RedirectUrlWithCardIdResponseSchema] 

375 

376 Args: 

377 amount: Ödəniş miqdarı. Numerik dəyər. 

378 currency: Ödəniş məzənnəsi. Mümkün dəyərlər: AZN 

379 order_id: Unikal ID. Maksimal uzunluq: 255 simvol. 

380 split_user_id: Ödənişi böləcəyini **EPoint** user-ini IDsi 

381 split_amount: Bölünən miqdar. Numerik dəyər 

382 description: Ödənişin təsviri. Maksimal uzunluq: 1000 simvol. Məcburi arqument deyil. 

383 """ # noqa: E501 

384 

385 

386EPointRequest = EPointClientClass(sync=True) 

387EPointAsyncRequest = EPointClientClass(sync=False)