Hide keyboard shortcuts

Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1# pylint: disable=too-many-branches,too-many-nested-blocks,too-many-locals 

2import csv 

3import re 

4from copy import copy 

5from typing import Any 

6 

7from django.core.management.base import CommandParser 

8from jutil.command import SafeCommand 

9from jutil.bank_const_se import SE_BANK_CLEARING_LIST 

10 

11 

12def se_iban_load_map(filename: str) -> list: 

13 """ 

14 Loads Swedish monetary institution codes in CSV format. 

15 :param filename: CSV file name of the BIC definitions. 

16 Columns: Institution Name, Range Begin-Range End (inclusive), Account digits count 

17 :return: List of (bank name, clearing code begin, clearing code end, account digits) 

18 """ 

19 out = [] 

20 name_repl = { 

21 "BNP Paribas Fortis SA/NV, Bankfilial Sverige": "BNP Paribas Fortis SA/NV", 

22 "Citibank International Plc, Sweden Branch": "Citibank", 

23 "Santander Consumer Bank AS (deltar endast i Dataclearingen)": "Santander Consumer Bank AS", 

24 "Nordax Bank AB (deltar endast i Dataclearingen)": "Nordax Bank AB", 

25 "Swedbank och fristående Sparbanker, t ex Leksands Sparbank och Roslagsbanken.": "Swedbank", 

26 "Ålandsbanken Abp (Finland),svensk filial": "Ålandsbanken Abp", 

27 "SBAB (deltar endast i Dataclearingen)": "SBAB Bank AB", 

28 "SBAB deltar endast i Dataclearingen": "SBAB Bank AB", 

29 "DNB Bank ASA, filial Sverige": "Den Norske Bank", 

30 "Länsförsäkringar Bank Aktiebolag": "Länsförsäkringar Bank AB", 

31 "MedMera Bank AB": "Med Mera Bank AB", 

32 } 

33 with open(filename) as fp: 

34 for row in csv.reader(fp): 

35 if len(row) == 3: 

36 name, series, acc_digits = row 

37 # pprint([name, series, acc_digits]) 

38 

39 # clean up name 

40 name = re.sub(r"\n.*", "", name) 

41 name = name_repl.get(name, name) 

42 

43 # clean up series 

44 ml_acc_digits = acc_digits.split("\n") 

45 for i, ser in enumerate(series.split("\n")): 

46 begin, end = None, None 

47 res = re.match(r"^(\d+)-(\d+).*$", ser) 

48 if res: 

49 begin, end = res.group(1), res.group(2) 

50 if begin is None: 

51 res = re.match(r"^(\d{4}).*$", ser) 

52 if res: 

53 begin = res.group(1) 

54 end = begin 

55 

56 if begin and end: 

57 digits: Any = None 

58 try: 

59 digits = int(acc_digits) 

60 except ValueError: 

61 pass 

62 if digits is None: 

63 try: 

64 digits = int(ml_acc_digits[i]) 

65 except ValueError: 

66 digits = "?" 

67 except IndexError: 

68 digits = "?" 

69 

70 out.append([name.strip(), begin.strip(), end.strip(), digits]) 

71 # print('OK!') 

72 return out 

73 

74 

75class Command(SafeCommand): 

76 help = "Generates Python file with Swedish bank info as constants" 

77 

78 def add_arguments(self, parser: CommandParser): 

79 parser.add_argument("--filename", type=str) 

80 parser.add_argument("--php", action="store_true") 

81 

82 def do(self, *args, **kw): 

83 new_bank_list = se_iban_load_map(kw["filename"]) if kw["filename"] else [] 

84 # pprint(bank_list) 

85 

86 bank_list = list(copy(SE_BANK_CLEARING_LIST)) 

87 for name, begin, end, acc_digits in new_bank_list: 

88 exists = False 

89 # pylint: disable=unused-variable 

90 for name0, begin0, end0, acc_digits0 in bank_list: 

91 if begin0 == begin and end0 == end: 

92 exists = True 

93 break 

94 # pylint: enable=unused-variable 

95 if not exists: 

96 bank_list.append((name, begin, end, acc_digits)) 

97 

98 if kw["php"]: 

99 print("<?php") 

100 print("") 

101 print("global $SE_BANK_CLEARING_LIST;") 

102 print("$SE_BANK_CLEARING_LIST = array(") 

103 errors = False 

104 for name, begin, end, acc_digits in bank_list: 

105 print(" ['{}', '{}', '{}', {}],".format(name, begin, end, acc_digits)) 

106 if acc_digits == "?": 

107 errors = True 

108 print(");") 

109 if errors: 

110 print("") 

111 print('// TODO: fix errors from above marked with "?"') 

112 print("") 

113 else: 

114 print("SE_BANK_CLEARING_LIST = ( # " + str(len(bank_list))) 

115 errors = False 

116 for name, begin, end, acc_digits in bank_list: 

117 print(" ('{}', '{}', '{}', {}),".format(name, begin, end, acc_digits)) 

118 if acc_digits == "?": 

119 errors = True 

120 print(")") 

121 if errors: 

122 print("") 

123 print('# TODO: fix errors from above marked with "?"') 

124 print("")