Coverage for packages/azericard/src/integrify/azericard/schemas/request/transfer.py: 100%

40 statements  

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

1from decimal import Decimal 

2from hashlib import md5 

3from typing import ClassVar 

4 

5from integrify.azericard import env 

6from integrify.azericard.utils import TimeStampOut 

7from integrify.schemas import PayloadBaseModel 

8from pydantic import AliasGenerator, ConfigDict, Field, computed_field 

9from pydantic.alias_generators import to_pascal 

10 

11 

12class BaseTransferRequestSchema(PayloadBaseModel): 

13 SIGNATURE_FIELDS: ClassVar[list[str]] 

14 """Signature hesablanılması üçün lazım olan field adları""" 

15 

16 model_config = ConfigDict(alias_generator=AliasGenerator(serialization_alias=to_pascal)) 

17 

18 merchant: str = Field(min_length=1, max_length=16) 

19 """Şirkət adı""" 

20 

21 srn: str = Field(min_length=1, max_length=12, serialization_alias='SRN') 

22 """Tərəfinizdən unikal əməliyyat nömrəsi""" 

23 

24 amount: Decimal 

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

26 

27 cur: str = Field(min_length=3, max_length=3) 

28 """Ödəniş valyutasının 3 rəqəmli kodu (AZN - 944)""" 

29 

30 @computed_field 

31 @property 

32 def signature(self) -> str: 

33 """Yaradılmış data üçün signature generasiyası""" 

34 assert self.SIGNATURE_FIELDS 

35 

36 with open(env.AZERICARD_KEY_FILE_PATH, encoding='utf-8') as key_file: 

37 key = key_file.read().replace('\n', '') 

38 

39 source = '' 

40 for field in self.SIGNATURE_FIELDS: 

41 source += str(getattr(self, field)) 

42 

43 source += key 

44 

45 return md5(source.encode('utf-8'), usedforsecurity=False).hexdigest() 

46 

47 

48class TransferStartRequestSchema(BaseTransferRequestSchema): 

49 SIGNATURE_FIELDS: ClassVar[list[str]] = [ 

50 'merchant', 

51 'srn', 

52 'amount', 

53 'cur', 

54 'receiver_credentials', 

55 'redirect_link', 

56 ] 

57 

58 receiver_credentials: str = Field(max_length=151) 

59 """İstifadəçinin tam adı""" 

60 

61 redirect_link: str = Field(max_length=12) 

62 """Əməliyyatın sonunda müştərini yönləndirmək istədiyiniz keçid""" 

63 

64 

65class TransferConfirmDeclineRequestSchema(BaseTransferRequestSchema): 

66 SIGNATURE_FIELDS: ClassVar[list[str]] = ['merchant', 'srn', 'amount', 'cur', 'timestamp'] 

67 

68 timestamp: TimeStampOut