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

39 statements  

« prev     ^ index     » next       coverage.py v7.10.3, created at 2026-02-02 01:50 +0000

1from importlib.metadata import version 

2from typing import TYPE_CHECKING, Any, Optional 

3from typing import SupportsFloat as Numeric 

4 

5from packaging.version import parse 

6 

7from integrify.api import APIClient 

8from integrify.epoint import env 

9from integrify.epoint.handlers import ( 

10 GetTransactionStatusPayloadHandler, 

11 PayAndSaveCardPayloadHandler, 

12 PaymentPayloadHandler, 

13 PayoutPayloadHandler, 

14 PayWithSavedCardPayloadHandler, 

15 RefundPayloadHandler, 

16 SaveCardPayloadHandler, 

17 SplitPayAndSaveCardPayloadHandler, 

18 SplitPayPayloadHandler, 

19 SplitPayWithSavedCardPayloadHandler, 

20) 

21from integrify.epoint.schemas.response import ( 

22 BaseResponseSchema, 

23 MinimalResponseSchema, 

24 RedirectUrlResponseSchema, 

25 RedirectUrlWithCardIdResponseSchema, 

26 SplitPayWithSavedCardResponseSchema, 

27 TransactionStatusResponseSchema, 

28) 

29from integrify.schemas import APIResponse 

30 

31# pylint: disable=no-name-in-module 

32 

33if parse(version('integrify-core')) >= parse('1.1.0'): 33 ↛ 34line 33 didn't jump to line 34 because the condition on line 33 was never true

34 from integrify.utils import UNSET, Unset # type: ignore 

35else: 

36 from integrify.utils import _UNSET as UNSET # type: ignore 

37 from integrify.utils import Unsettable as Unset # type: ignore 

38# pylint: enable=no-name-in-module 

39 

40__all__ = ['EPointAsyncRequest', 'EPointClientClass', 'EPointRequest'] 

41 

42 

43class EPointClientClass(APIClient): 

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

45 

46 def __init__( 

47 self, 

48 name='EPoint', 

49 base_url: Optional[str] = env.API.BASE_URL, 

50 default_handler=None, 

51 sync: bool = True, 

52 dry: bool = False, 

53 ): 

54 super().__init__(name, base_url, default_handler, sync, dry) 

55 

56 self.add_url('pay', env.API.PAY, verb='POST') 

57 self.add_handler('pay', PaymentPayloadHandler) 

58 

59 self.add_url('get_transaction_status', env.API.GET_STATUS, verb='POST') 

60 self.add_handler('get_transaction_status', GetTransactionStatusPayloadHandler) 

61 

62 self.add_url('save_card', env.API.SAVE_CARD, verb='POST') 

63 self.add_handler('save_card', SaveCardPayloadHandler) 

64 

65 self.add_url('pay_with_saved_card', env.API.PAY_WITH_SAVED_CARD, verb='POST') 

66 self.add_handler('pay_with_saved_card', PayWithSavedCardPayloadHandler) 

67 

68 self.add_url('pay_and_save_card', env.API.PAY_AND_SAVE_CARD, verb='POST') 

69 self.add_handler('pay_and_save_card', PayAndSaveCardPayloadHandler) 

70 

71 self.add_url('payout', env.API.PAYOUT, verb='POST') 

72 self.add_handler('payout', PayoutPayloadHandler) 

73 

74 self.add_url('refund', env.API.REFUND, verb='POST') 

75 self.add_handler('refund', RefundPayloadHandler) 

76 

77 self.add_url('split_pay', env.API.SPLIT_PAY, verb='POST') 

78 self.add_handler('split_pay', SplitPayPayloadHandler) 

79 

80 self.add_url('split_pay_with_saved_card', env.API.SPLIT_PAY_WITH_SAVED_CARD, verb='POST') 

81 self.add_handler('split_pay_with_saved_card', SplitPayWithSavedCardPayloadHandler) 

82 

83 self.add_url('split_pay_and_save_card', env.API.SPLIT_PAY_AND_SAVE_CARD, verb='POST') 

84 self.add_handler('split_pay_and_save_card', SplitPayAndSaveCardPayloadHandler) 

85 

86 if TYPE_CHECKING: 

87 

88 def pay( 

89 self, 

90 amount: Numeric, 

91 currency: str, 

92 order_id: str, 

93 description: Unset[str] = UNSET, 

94 **extra: Any, 

95 ) -> APIResponse[RedirectUrlResponseSchema]: 

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

97 

98 **Endpoint:** */api/1/request* 

99 

100 Example: 

101 ```python 

102 from integrify.epoint import EPointRequest 

103 

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

105 ``` 

106 

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

108 

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

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

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

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

113 formatında məlumat gəlir. 

114 

115 Args: 

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

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

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

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

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

121 geri göndərilir. 

122 """ # noqa: E501 

123 

124 def get_transaction_status( 

125 self, 

126 transaction_id: str, 

127 ) -> APIResponse[TransactionStatusResponseSchema]: 

128 """ 

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

130 

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

132 

133 Example: 

134 ```python 

135 from integrify.epoint import EPointRequest 

136 

137 EPointRequest.get_transaction_status(transaction_id='texxxxxx') 

138 ``` 

139 

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

141 

142 Args: 

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

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

145 """ # noqa: E501 

146 

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

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

149 

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

151 

152 Example: 

153 ```python 

154 from integrify.epoint import EPointRequest 

155 

156 EPointRequest.save_card() 

157 ``` 

158 

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

160 

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

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

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

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

165 formatında məlumat gəlir. 

166 """ # noqa: E501 

167 

168 def pay_with_saved_card( 

169 self, 

170 amount: Numeric, 

171 currency: str, 

172 order_id: str, 

173 card_id: str, 

174 ) -> APIResponse[BaseResponseSchema]: 

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

176 

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

178 

179 Example: 

180 ```python 

181 from integrify.epoint import EPointRequest 

182 

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

184 ``` 

185 

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

187 

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

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

190 

191 Args: 

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

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

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

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

196 """ # noqa: E501 

197 

198 def pay_and_save_card( 

199 self, 

200 amount: Numeric, 

201 currency: str, 

202 order_id: str, 

203 description: str, 

204 ) -> APIResponse[RedirectUrlWithCardIdResponseSchema]: 

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

206 

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

208 

209 Example: 

210 ```python 

211 from integrify.epoint import EPointRequest 

212 

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

214 ``` 

215 

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

217 

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

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

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

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

222 formatında məlumat gəlir. 

223 

224 Args: 

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

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

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

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

229 """ # noqa: E501 

230 

231 def payout( 

232 self, 

233 amount: Numeric, 

234 currency: str, 

235 order_id: str, 

236 card_id: str, 

237 description: Unset[str] = UNSET, 

238 ) -> APIResponse[BaseResponseSchema]: 

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

240 

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

242 

243 Example: 

244 ```python 

245 from integrify.epoint import EPointRequest 

246 

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

248 ``` 

249 

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

251 

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

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

254 

255 Args: 

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

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

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

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

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

261 """ # noqa: E501 

262 

263 def refund( 

264 self, 

265 transaction_id: str, 

266 currency: str, 

267 amount: Unset[Numeric] = UNSET, 

268 ) -> APIResponse[MinimalResponseSchema]: 

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

270 

271 **Endpoint:** */api/1/reverse* 

272 

273 Example: 

274 ```python 

275 from integrify.epoint import EPointRequest 

276 

277 # Full refund 

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

279 

280 # Partial refund 

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

282 ``` 

283 

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

285 

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

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

288 

289 Args: 

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

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

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

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

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

295 """ # noqa: E501 

296 

297 def split_pay( 

298 self, 

299 amount: Numeric, 

300 currency: str, 

301 order_id: str, 

302 split_user_id: str, 

303 split_amount: Numeric, 

304 description: Unset[str] = UNSET, 

305 **extra: Any, 

306 ) -> APIResponse[RedirectUrlResponseSchema]: 

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

308 

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

310 

311 Example: 

312 ```python 

313 from integrify.epoint import EPointRequest 

314 

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

316 ``` 

317 

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

319 

320 Args: 

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

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

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

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

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

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

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

328 geri göndərilir. 

329 """ # noqa: E501 

330 

331 def split_pay_with_saved_card( 

332 self, 

333 amount: Numeric, 

334 currency: str, 

335 order_id: str, 

336 card_id: str, 

337 split_user_id: str, 

338 split_amount: Numeric, 

339 description: Unset[str] = UNSET, 

340 ) -> APIResponse[SplitPayWithSavedCardResponseSchema]: 

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

342 

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

344 

345 Example: 

346 ```python 

347 from integrify.epoint import EPointRequest 

348 

349 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') 

350 ``` 

351 

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

353 

354 Args: 

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

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

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

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

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

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

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

362 """ # noqa: E501 

363 

364 def split_pay_and_save_card( 

365 self, 

366 amount: Numeric, 

367 currency: str, 

368 order_id: str, 

369 split_user_id: str, 

370 split_amount: Numeric, 

371 description: Unset[str] = UNSET, 

372 ) -> APIResponse[RedirectUrlWithCardIdResponseSchema]: 

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

374 

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

376 

377 Example: 

378 ```python 

379 from integrify.epoint import EPointRequest 

380 

381 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') 

382 ``` 

383 

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

385 

386 Args: 

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

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

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

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

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

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

393 """ # noqa: E501 

394 

395 

396EPointRequest = EPointClientClass(sync=True) 

397EPointAsyncRequest = EPointClientClass(sync=False)