Coverage for src/integrify/kapital/client.py: 86%

43 statements  

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

1from typing import TYPE_CHECKING, Optional 

2from typing import SupportsFloat as Numeric 

3 

4from integrify.api import APIClient, APIResponse 

5from integrify.kapital import env 

6from integrify.kapital.handlers import ( 

7 ClearingOrderPayloadHandler, 

8 CreateOrderPayloadHandler, 

9 DetailedOrderInformationPayloadHandler, 

10 FullReverseOrderPayloadHandler, 

11 LinkCardTokenPayloadHandler, 

12 OrderInformationPayloadHandler, 

13 OrderWithSavedCardPayloadHandler, 

14 PartialReverseOrderPayloadHandler, 

15 PayAndSaveCardPayloadHandler, 

16 ProcessPaymentWithSavedCardPayloadHandler, 

17 RefundOrderPayloadHandler, 

18 SaveCardPayloadHandler, 

19) 

20from integrify.kapital.schemas.response import ( 

21 BaseResponseSchema, 

22 ClearingOrderResponseSchema, 

23 CreateOrderResponseSchema, 

24 DetailedOrderInformationResponseSchema, 

25 FullReverseOrderResponseSchema, 

26 LinkCardTokenResponseSchema, 

27 OrderInformationResponseSchema, 

28 PartialReverseOrderResponseSchema, 

29 ProcessPaymentWithSavedCardResponseSchema, 

30 RefundOrderResponseSchema, 

31) 

32 

33__all__ = ['KapitalClientClass'] 

34 

35 

36class KapitalClientClass(APIClient): 

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

38 super().__init__('Kapital', env.API.BASE_URL, sync=sync) 

39 

40 self.add_url('create_order', env.API.ORDER, verb='POST') 

41 self.add_handler('create_order', CreateOrderPayloadHandler) 

42 

43 self.add_url('get_order_information', env.API.GET_ORDER, verb='GET') 

44 self.add_handler('get_order_information', OrderInformationPayloadHandler) 

45 

46 self.add_url('get_detailed_order_info', env.API.GET_DETAILED_ORDER, verb='GET') 

47 self.add_handler('get_detailed_order_info', DetailedOrderInformationPayloadHandler) 

48 

49 self.add_url('refund_order', env.API.ORDER_EXECUTION, verb='POST') 

50 self.add_handler('refund_order', RefundOrderPayloadHandler) 

51 

52 self.add_url('save_card', env.API.ORDER, verb='POST') 

53 self.add_handler('save_card', SaveCardPayloadHandler) 

54 

55 self.add_url('pay_and_save_card', env.API.ORDER, verb='POST') 

56 self.add_handler('pay_and_save_card', PayAndSaveCardPayloadHandler) 

57 

58 self.add_url('full_reverse_order', env.API.ORDER_EXECUTION, verb='POST') 

59 self.add_handler('full_reverse_order', FullReverseOrderPayloadHandler) 

60 

61 self.add_url('clearing_order', env.API.ORDER_EXECUTION, verb='POST') 

62 self.add_handler('clearing_order', ClearingOrderPayloadHandler) 

63 

64 self.add_url('partial_reverse_order', env.API.ORDER_EXECUTION, verb='POST') 

65 self.add_handler('partial_reverse_order', PartialReverseOrderPayloadHandler) 

66 

67 self.add_url('order_with_saved_card', env.API.ORDER, verb='POST') 

68 self.add_handler( 

69 'order_with_saved_card', 

70 OrderWithSavedCardPayloadHandler, 

71 ) 

72 

73 self.add_url('link_card_token', env.API.ORDER_LINK_CARD_TOKEN, verb='POST') 

74 self.add_handler('link_card_token', LinkCardTokenPayloadHandler) 

75 

76 self.add_url( 

77 'process_payment_with_saved_card', 

78 env.API.PROCESS_PAYMENT_WITH_SAVED_CARD, 

79 verb='POST', 

80 ) 

81 self.add_handler( 

82 'process_payment_with_saved_card', 

83 ProcessPaymentWithSavedCardPayloadHandler, 

84 ) 

85 

86 def pay_with_saved_card( 

87 self, 

88 token: int, 

89 amount: Numeric, 

90 currency: str, 

91 description: Optional[str] = None, 

92 ) -> APIResponse[BaseResponseSchema[ProcessPaymentWithSavedCardResponseSchema]]: 

93 """ 

94 Yadda saxlanmış kartdan ödəniş etmək üçün sorğu 

95 

96 **Endpoint** /api/order 

97 

98 Example: 

99 ```python 

100 from integrify.kapital import KapitalRequest 

101 

102 KapitalRequest.pay_with_saved_card(123456, 1.0, "AZN", "Test payment") 

103 ``` 

104 

105 **Cavab formatı: [`BaseResponseSchema[ProcessPaymentWithSavedCardResponseSchema]`][integrify.kapital.schemas.response.BaseResponseSchema]** 

106 

107 Bu sorğunu göndərdikdə, cavab olaraq ödənişin təsdiq edilməsi haqda məlumat əldə edə bilərsiniz. 

108 

109 Args: 

110 token: Kart tokeni. 

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

112 currency: Ödənişin məzənnəsi. Mümkün dəyərlər: `["AZN", "USD"]`. 

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

114 """ # noqa: E501 

115 order_response = self.order_with_saved_card( # pylint: disable=assignment-from-no-return 

116 amount=amount, 

117 currency=currency, 

118 description=description, 

119 ) 

120 

121 assert order_response.body and order_response.body.data 

122 

123 order_id = order_response.body.data.id 

124 password = order_response.body.data.password 

125 

126 self.link_card_token( 

127 token=token, 

128 order_id=order_id, 

129 password=password, 

130 ) 

131 

132 return self.process_payment_with_saved_card( 

133 amount=amount, 

134 order_id=order_id, 

135 password=password, 

136 ) 

137 

138 if TYPE_CHECKING: 

139 

140 def create_order( 

141 self, 

142 amount: Numeric, 

143 currency: str, 

144 description: Optional[str] = None, 

145 ) -> APIResponse[BaseResponseSchema[CreateOrderResponseSchema]]: 

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

147 

148 **Endpoint** /api/order 

149 

150 Example: 

151 ```python 

152 from integrify.kapital import KapitalRequest 

153 

154 KapitalRequest.create_order( 

155 amount=10.0, 

156 currency="AZN", 

157 description="Test payment", 

158 ) 

159 ``` 

160 

161 **Cavab formatı: [`BaseResponseSchema[CreateOrderResponseSchema]`][integrify.kapital.schemas.response.BaseResponseSchema]** 

162 

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

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

165 APIsinə "{callback_url}/?ID={id}&STATUS={status}" formatında sorğusu göndərilir. Ödənişin 

166 detallarını get_detailed_order_info() funksiyandan istifadə edərək əldə edə bilərsiz. 

167 

168 Args: 

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

170 currency: Ödənişin məzənnəsi. Mümkün dəyərlər: `["AZN", "USD"]`. 

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

172 """ # noqa: E501 

173 

174 def get_order_information( 

175 self, order_id: int 

176 ) -> APIResponse[BaseResponseSchema[OrderInformationResponseSchema]]: 

177 """Ödəniş haqda qısa məlumat əldə etmək üçün sorğu 

178 

179 **Endpoint** /api/order/{order_id} 

180 

181 Example: 

182 ```python 

183 from integrify.kapital import KapitalRequest 

184 

185 KapitalRequest.get_order_information(order_id=123456) 

186 ``` 

187 

188 **Cavab formatı: [`BaseResponseSchema[OrderInformationResponseSchema]`][integrify.kapital.schemas.response.BaseResponseSchema]** 

189 

190 Bu sorğunu göndərdikdə, cavab olaraq ödəniş haqda qısa məlumat əldə edə bilərsiniz. 

191 

192 Args: 

193 order_id: Ödənişin ID-si. 

194 """ # noqa: E501 

195 

196 def get_detailed_order_info( 

197 self, order_id: int 

198 ) -> APIResponse[BaseResponseSchema[DetailedOrderInformationResponseSchema]]: 

199 """Ödəniş haqda detallı məlumat əldə etmək üçün sorğu 

200 

201 **Endpoint** /api/order/{order_id}?&tranDetailLevel=2&tokenDetailLevel=2&orderDetailLevel=2 

202 

203 Example: 

204 ```python 

205 from integrify.kapital import KapitalRequest 

206 

207 KapitalRequest.get_detailed_order_info(order_id=123456) 

208 ``` 

209 

210 **Cavab formatı: [`BaseResponseSchema[DetailedOrderInformationResponseSchema]`][integrify.kapital.schemas.response.BaseResponseSchema]** 

211 

212 Bu sorğunu göndərdikdə, cavab olaraq ödənişin detallı məlumat əldə edə bilərsiniz. 

213 

214 Args: 

215 order_id: Ödənişin ID-si. 

216 """ # noqa: E501 

217 

218 def refund_order( 

219 self, 

220 order_id: int, 

221 amount: Numeric, 

222 ) -> APIResponse[BaseResponseSchema[RefundOrderResponseSchema]]: 

223 """Geri ödəniş sorğusu 

224 

225 **Endpoint** /api/order/{order_id}/exec-tran 

226 

227 Example: 

228 ```python 

229 from integrify.kapital import KapitalRequest 

230 

231 KapitalRequest.refund_order( 

232 order_id=123456, 

233 amount=10.0, 

234 ) 

235 ``` 

236 

237 **Cavab formatı: [`BaseResponseSchema[RefundOrderResponseSchema]`][integrify.kapital.schemas.response.BaseResponseSchema]** 

238 

239 Bu sorğu ilə əvvəlki ödənişi geri ödəmək üçün istifadə edə bilərsiniz. 

240 Cavab olaraq ödənişin detallarını əldə edə bilərsiniz. 

241 

242 Args: 

243 order_id: Ödənişin ID-si. 

244 amount: Geri ödəniş miqdarı. Numerik dəyər. 

245 """ # noqa: E501 

246 

247 def save_card( 

248 self, 

249 amount: Numeric, 

250 currency: str, 

251 description: Optional[str] = None, 

252 ) -> APIResponse[BaseResponseSchema[CreateOrderResponseSchema]]: 

253 """Kartı saxlamaq üçün ödəniş sorğusu 

254 

255 **Endpoint** /api/order 

256 

257 Example: 

258 ```python 

259 from integrify.kapital import KapitalRequest 

260 

261 KapitalRequest.save_card( 

262 amount=1.0, 

263 currency="AZN", 

264 description="Test payment", 

265 ) 

266 ``` 

267 

268 **Cavab formatı: [`BaseResponseSchema[CreateOrderResponseSchema]`][integrify.kapital.schemas.response.BaseResponseSchema]** 

269 

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

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

272 APIsinə "{callback_url}/?ID={id}&STATUS={status}" formatında sorğusu göndərilir. Ödənişin 

273 detallarını get_detailed_order_info() funksiyandan istifadə edərək əldə edə bilərsiz. 

274 Həmin detallarda storedTokens key-i altındaki tokenləri saxlayaraq, sonrakı ödənişlərdə bu tokenləri 

275 istifadə edə bilərsiniz. 

276 

277 `response.body.data.stored_tokens[0].id` ilə tokeni əldə edə bilərsiniz. 

278 """ # noqa: E501 

279 

280 def pay_and_save_card( 

281 self, 

282 amount: Numeric, 

283 currency: str, 

284 description: Optional[str] = None, 

285 ) -> APIResponse[BaseResponseSchema[CreateOrderResponseSchema]]: 

286 """Kartı saxlamaq və ödəniş etmək üçün ödəniş sorğusu 

287 

288 **Endpoint** /api/order 

289 

290 Example: 

291 ```python 

292 from integrify.kapital import KapitalRequest 

293 

294 KapitalRequest.pay_and_save_card( 

295 amount=1.0, 

296 currency="AZN", 

297 description="Test payment", 

298 ) 

299 ``` 

300 

301 **Cavab formatı: [`BaseResponseSchema[CreateOrderResponseSchema]`][integrify.kapital.schemas.response.BaseResponseSchema]** 

302 

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

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

305 APIsinə "{callback_url}/?ID={id}&STATUS={status}" formatında sorğusu göndərilir. Ödənişin 

306 detallarını get_detailed_order_info() funksiyandan istifadə edərək əldə edə bilərsiz. 

307 Həmin detallarda storedTokens key-i altındaki tokenləri saxlayaraq, sonrakı ödənişlərdə bu tokenləri 

308 istifadə edə bilərsiniz. 

309 

310 `response.body.data.stored_tokens[0].id` ilə tokeni əldə edə bilərsiniz. 

311 """ # noqa: E501 

312 

313 def full_reverse_order( 

314 self, 

315 order_id: int, 

316 ) -> APIResponse[BaseResponseSchema[FullReverseOrderResponseSchema]]: 

317 """Ödənişi ləğv etmək üçün sorğu 

318 

319 **Endpoint** /api/order/{order_id}/exec-tran 

320 

321 Example: 

322 ```python 

323 from integrify.kapital import KapitalRequest 

324 

325 KapitalRequest.full_reverse_order(order_id=123456) 

326 ``` 

327 

328 **Cavab formatı: [`BaseResponseSchema[FullReverseOrderResponseSchema]`][integrify.kapital.schemas.response.BaseResponseSchema]** 

329 

330 Bu sorğunu göndərdikdə, cavab olaraq ödənişin ləğv edilməsi haqda məlumat əldə edə bilərsiniz. 

331 Bu funksiyani save_card() funksiyası ilə yaradılan ödənişlər üçün istifadə edə bilərsiniz. 

332 Kartın token-i saxladıqdan sonra həmin ödənişi qaytarmaq üçün istifade etmək olar. 

333 

334 Args: 

335 order_id: Ödənişin ID-si. 

336 """ # noqa: E501 

337 

338 def clearing_order( 

339 self, 

340 order_id: int, 

341 amount: Numeric, 

342 ) -> APIResponse[BaseResponseSchema[ClearingOrderResponseSchema]]: 

343 """Ödənişin təsdiq edilməsi üçün sorğu 

344 

345 **Endpoint** /api/order/{order_id}/exec-tran 

346 

347 Example: 

348 ```python 

349 from integrify.kapital import KapitalRequest 

350 

351 KapitalRequest.clearing_order(order_id=123456) 

352 ``` 

353 

354 **Cavab formatı: [`BaseResponseSchema[ClearingOrderResponseSchema]`][integrify.kapital.schemas.response.BaseResponseSchema]** 

355 

356 Bu sorğunu göndərdikdə, cavab olaraq ödənişin təsdiq edilməsi haqda məlumat əldə edə bilərsiniz. 

357 Bu funksiyani save_card() funksiyası ilə yaradılan ödənişlər üçün istifadə edə bilərsiniz. 

358 Preauthorization əməliyyatının ikinci mərhələsi üçün. 

359 

360 Args: 

361 order_id: Ödənişin ID-si. 

362 """ # noqa: E501 

363 

364 def partial_reverse_order( 

365 self, 

366 order_id: int, 

367 amount: Numeric, 

368 ) -> APIResponse[BaseResponseSchema[PartialReverseOrderResponseSchema]]: 

369 """Ödənişin hissəsini ləğv etmək üçün sorğu 

370 

371 **Endpoint** /api/order/{order_id}/exec-tran 

372 

373 Example: 

374 ```python 

375 from integrify.kapital import KapitalRequest 

376 

377 KapitalRequest.partial_reverse_order(order_id=123456, amount=5.0) 

378 ``` 

379 

380 **Cavab formatı: [`BaseResponseSchema[PartialReverseOrderResponseSchema]`][integrify.kapital.schemas.response.BaseResponseSchema]** 

381 

382 Bu sorğunu göndərdikdə, cavab olaraq ödənişin ləğv edilməsi haqda məlumat əldə edə bilərsiniz. 

383 Bu funksiyani clearing_order() funksiyası ilə təsdiq edilmiş ödənişlər üçün istifadə edə bilərsiniz. 

384 İlkin məbləğdən az olan vəsaitləri qaytarmaq üçün istifadə olunur. Bir dəfə istifadə etmək olar. 

385 

386 Args: 

387 order_id: Ödənişin ID-si. 

388 amount: Ləğv olunacaq miqdar. Numerik dəyər. 

389 """ # noqa: E501 

390 

391 def order_with_saved_card( 

392 self, 

393 amount: Numeric, 

394 currency: str, 

395 description: Optional[str] = None, 

396 ) -> APIResponse[BaseResponseSchema[CreateOrderResponseSchema]]: 

397 """ 

398 Bu funksiya sadece KapitalClientClass daxilinde istifade olunur! 

399 

400 **Endpoint** /api/order 

401 

402 Bu funksiya pay_with_saved_card() funksiyasında istifadə olunur. 

403 Əsas məqsədi order_id və password dəyərlərini əldə etməkdir. 

404 

405 Args: 

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

407 currency: Ödənişin məzənnəsi. Mümkün dəyərlər: `["AZN", "USD"]`. 

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

409 """ # noqa: E501 

410 

411 def link_card_token( 

412 self, 

413 token: int, 

414 order_id: int, 

415 password: str, 

416 ) -> APIResponse[BaseResponseSchema[LinkCardTokenResponseSchema]]: 

417 """ 

418 Bu funksiya sadece KapitalClientClass daxilinde istifade olunur! 

419 

420 **Endpoint** /api/order/{order_id}/set-src-token?password={password} 

421 

422 Bu funksiya pay_with_saved_card() funksiyasında istifadə olunur. 

423 Əsas məqsədi token-i həmin order üçün set etməkdir. 

424 

425 Args: 

426 token: Kart tokeni. 

427 order_id: Ödənişin ID-si. 

428 password: Ödənişin passwordu. 

429 """ # noqa: E501 

430 

431 def process_payment_with_saved_card( 

432 self, 

433 amount: Numeric, 

434 order_id: int, 

435 password: str, 

436 ) -> APIResponse[BaseResponseSchema[ProcessPaymentWithSavedCardResponseSchema]]: 

437 """ 

438 Bu funksiya sadece KapitalClientClass daxilinde istifade olunur! 

439 

440 **Endpoint** /api/order/{order_id}/exec-tran?password={password} 

441 

442 Bu funksiya pay_with_saved_card() funksiyasında istifadə olunur. 

443 Əsas məqsədi ödənişi təsdiq etməkdir. 

444 

445 Args: 

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

447 order_id: Ödənişin ID-si. 

448 password: Ödənişin password 

449 """ # noqa: E501 

450 

451 

452KapitalRequest = KapitalClientClass(sync=True) 

453KapitalAsyncRequest = KapitalClientClass(sync=False)