Coverage for jbank/pain002.py: 0%

31 statements  

« prev     ^ index     » next       coverage.py v7.2.2, created at 2023-03-27 13:36 +0700

1from datetime import datetime 

2from os.path import basename 

3from typing import Optional 

4from django.utils.timezone import now 

5from jbank.helpers import logger 

6from jbank.models import Payout, PayoutStatus, PAYOUT_PAID 

7from jbank.sepa import Pain002 

8from jutil.format import strip_media_root 

9 

10 

11def process_pain002_file_content(bcontent: bytes, filename: str, created: Optional[datetime] = None): 

12 if not created: 

13 created = now() 

14 s = Pain002(bcontent) 

15 p = Payout.objects.filter(msg_id=s.original_msg_id).first() 

16 

17 ps = PayoutStatus( 

18 payout=p, 

19 file_name=basename(filename), 

20 file_path=strip_media_root(filename), 

21 msg_id=s.msg_id, 

22 original_msg_id=s.original_msg_id, 

23 group_status=s.group_status, 

24 status_reason=s.status_reason[:255], 

25 created=created, 

26 timestamp=s.credit_datetime, 

27 ) 

28 ps.full_clean() 

29 fields = ( 

30 "payout", 

31 "file_name", 

32 "response_code", 

33 "response_text", 

34 "msg_id", 

35 "original_msg_id", 

36 "group_status", 

37 "status_reason", 

38 ) 

39 params = {} 

40 for k in fields: 

41 params[k] = getattr(ps, k) 

42 ps_old = PayoutStatus.objects.filter(**params).first() 

43 if ps_old: 

44 ps = ps_old 

45 else: 

46 ps.save() 

47 logger.info("%s status updated %s", p, ps) 

48 if p: 

49 if ps.is_accepted: 

50 p.state = PAYOUT_PAID 

51 p.paid_date = s.credit_datetime 

52 p.save(update_fields=["state", "paid_date"]) 

53 logger.info("%s marked as paid %s", p, ps) 

54 return ps