Coverage for packages/epoint/src/integrify/epoint/schemas/response.py: 100%

106 statements  

« prev     ^ index     » next       coverage.py v7.16.0, created at 2026-10-19 02:39 +0000

1from datetime import datetime 

2from decimal import Decimal 

3from typing import Any 

4 

5from integrify.epoint.schemas.enums import Code, TransactionStatus, TransactionStatusExtended 

6from pydantic import BaseModel, field_validator 

7 

8 

9class MinimalResponseSchema(BaseModel): 

10 status: TransactionStatus 

11 """Success və ya failed əməliyyatının nəticəsi""" 

12 

13 message: str | None = None 

14 """Ödənişin icra statusu haqqında mesaj""" 

15 

16 

17class BaseResponseSchema(MinimalResponseSchema): 

18 # if success 

19 transaction: str | None = None 

20 """EPoint xidmətinin əməliyyat IDsi""" 

21 

22 bank_transaction: str | None = None 

23 """Bank ödəniş əməliyyatı IDsi""" 

24 

25 bank_response: str | None = None 

26 """Ödəniş icrasının nəticəsi ilə bankın cavabı""" 

27 

28 operation_code: str | None = None 

29 """001-kart qeydiyyatı\n100- istifadəçi ödənişi""" 

30 

31 rrn: str | None = None 

32 """Retrieval Reference Number - unikal əməliyyat identifikatoru. 

33 Yalnız uğurlu bir əməliyyat üçün mövcuddur""" 

34 

35 card_mask: str | None = None 

36 """Ödəniş səhifəsində göstərilən istifadəçi adı""" 

37 

38 card_name: str | None = None 

39 """123456******1234 formatında əks edilən kart maskası""" 

40 

41 amount: Decimal | None = None 

42 """Ödəniş məbləği""" 

43 

44 

45class BaseWithCodeSchema(BaseResponseSchema): 

46 code: str | None = None 

47 """Bankın 3 rəqəmli cavab kodu.""" 

48 

49 @field_validator('code', mode='before') 

50 @classmethod 

51 def code_to_msg(cls, v: str | None = None) -> str | None: 

52 """3 rəqəmli koddan, xəta/uğur mesajına çevrilir. 

53 

54 Kod `Code` lüğətində yoxdursa (bank yeni/naməlum kod qaytara bilər), 

55 `KeyError` atmaq əvəzinə orijinal kod qaytarılır ki, cavab parse-i crash olmasın. 

56 """ 

57 if not v: 

58 return None 

59 

60 return Code.get(v, v) 

61 

62 

63################################################################# 

64class RedirectUrlResponseSchema(MinimalResponseSchema): 

65 # if success 

66 transaction: str | None = None 

67 """EPoint xidmətinin əməliyyat IDsi""" 

68 

69 redirect_url: str | None = None 

70 """İstifadəçinin kart məlumatlarını daxil etmək üçün yönləndirilməsi lazım olan URL""" 

71 

72 

73class RedirectUrlWithCardIdResponseSchema(RedirectUrlResponseSchema): 

74 card_id: str | None = None 

75 """Ödənişləri yerinə yetirmək üçün istifadə edilməsi 

76 lazım olan unikal kart identifikatoru""" 

77 

78 

79class PaymentSchema(BaseWithCodeSchema): 

80 order_id: str 

81 """Tətbiqinizdə unikal əməliyyat ID""" 

82 

83 other_attr: str | None = None 

84 """Əlavə göndərdiyiniz seçimlər""" 

85 

86 

87class TransactionStatusResponseSchema(BaseWithCodeSchema): 

88 status: TransactionStatusExtended 

89 """Tranzaksiyanın detallı statusu""" 

90 

91 order_id: str | None = None 

92 """Tətbiqinizdə unikal əməliyyat ID""" 

93 

94 other_attr: str | None = None 

95 """Əlavə göndərdiyiniz seçimlər""" 

96 

97 

98class SplitPayWithSavedCardResponseSchema(BaseResponseSchema): 

99 split_amount: Decimal | None = None 

100 """İkinci istifadəçi üçün ödəniş məbləği.""" 

101 

102 

103################################################################# 

104# Apple Pay & Google Pay 

105class WidgetResponseSchema(BaseModel): 

106 """`/api/1/token/widget` sorğusunun cavabı""" 

107 

108 status: str 

109 """Əməliyyatın nəticəsi: `success` və ya `error`""" 

110 

111 message: str | None = None 

112 """Xəta baş verdikdə, xəta mesajı""" 

113 

114 widget_url: str | None = None 

115 """Apple Pay/Google Pay düymələrinin olduğu widget-in URL-i. 

116 iframe və ya webview daxilində açılmalıdır.""" 

117 

118 

119class TokenPaymentResponseSchema(BaseModel): 

120 """`/api/1/token/payment` sorğusunun cavabı: EPoint-də yaradılmış token ödənişi. 

121 Bu obyekt frontend-də `initTokenPay`-ə `payment` parametri kimi ötürülür.""" 

122 

123 # if error 

124 status: str | None = None 

125 """Xəta baş verdikdə, əməliyyatın statusu""" 

126 

127 message: str | None = None 

128 """Xəta baş verdikdə, xəta mesajı""" 

129 

130 # if success 

131 id: int | None = None 

132 """Token ödənişinin EPoint-dəki IDsi. Apple/Google Pay sorğularında istifadə olunur.""" 

133 

134 transaction: str | None = None 

135 """EPoint xidmətinin əməliyyat IDsi""" 

136 

137 rrn: str | None = None 

138 """Retrieval Reference Number - unikal əməliyyat identifikatoru""" 

139 

140 short_link: str | None = None 

141 """Ödənişin qısa linki""" 

142 

143 bank_order_id: str | None = None 

144 """Bank tərəfindəki sifariş IDsi""" 

145 

146 total: Decimal | None = None 

147 """Ödənişin yekun məbləği""" 

148 

149 card_name: str | None = None 

150 """Ödəniş səhifəsində göstərilən istifadəçi adı""" 

151 

152 card_mask: str | None = None 

153 """123456******1234 formatında əks edilən kart maskası""" 

154 

155 description: str | None = None 

156 """Ödənişin təsviri""" 

157 

158 merchant_order_id: str | None = None 

159 """Tətbiqinizdə unikal əməliyyat ID (sorğuda göndərdiyiniz `order_id`)""" 

160 

161 other_attr: Any = None 

162 """Əlavə göndərdiyiniz seçimlər""" 

163 

164 created_at: datetime | None = None 

165 """Ödənişin yaradılma tarixi""" 

166 

167 updated_at: datetime | None = None 

168 """Ödənişin son yenilənmə tarixi""" 

169 

170 

171class TokenPayResponseSchema(BaseModel): 

172 """Apple Pay/Google Pay ödənişinin tamamlanması sorğusunun cavabı""" 

173 

174 status: str 

175 """Əməliyyatın nəticəsi. Uğurlu olduqda: `success`""" 

176 

177 message: str | None = None 

178 """Ödənişin icra statusu haqqında mesaj""" 

179 

180 result: Any = None 

181 """Ödəniş provayderindən (PSP) gələn cavab""" 

182 

183 redirect_url: str | None = None 

184 """Yönləndirmə URL-i (məs., 3DS üçün). Hər zaman gəlmir."""