from .segments.statement import HKKAZ
from .segments.saldo import HKSAL
from .segments.depot import HKWPD
-from .utils import mt940_to_array, MT535_Miniparser
+from .utils import mt940_to_array, MT535_Miniparser, split_for_data_groups, split_for_data_elements
from mt940.models import Balance
logger = logging.getLogger(__name__)
while HKKAZ.type in touchdowns:
logger.info('Fetching more results ({})...'.format(touchdown_counter))
msg = self._create_statement_message(dialog, account, start_date, end_date, touchdowns[HKKAZ.type])
+ logger.debug('Send message: {}'.format(msg))
resp = dialog.send(msg)
responses.append(resp)
# find segment and split up to balance part
seg = resp._find_segment('HISAL')
- arr = seg.split('+')[4].split(':')
+ arr = split_for_data_elements(split_for_data_groups(seg)[4])
# get balance date
date = datetime.datetime.strptime(arr[3], "%Y%m%d").date()
import random
import re
+from fints.utils import split_for_data_groups, split_for_data_elements, fints_unescape
from .segments.message import HNHBK, HNHBS, HNSHA, HNSHK, HNVSD, HNVSK
for msgseg in msg.encrypted_segments:
seg = self._find_segment_for_reference('HIRMS', msgseg)
if seg:
- parts = seg.split('+')[1:]
+ parts = split_for_data_groups(seg)[1:]
for p in parts:
- psplit = p.split(':')
+ psplit = split_for_data_elements(p)
if psplit[0] == "3040":
td = psplit[3]
- touchdown[msgseg.type] = td
+ touchdown[msgseg.type] = fints_unescape(td)
return touchdown
def _get_segment_max_version(self, name):
v = 3
segs = self._find_segments(name)
for s in segs:
- parts = s.split('+')
- segheader = parts[0].split(':')
+ parts = split_for_data_groups(s)
+ segheader = split_for_data_elements(parts[0])
curver = int(segheader[2])
if curver > v:
v = curver
+from fints.utils import fints_escape
from . import FinTS3Segment
class HKKAZ(FinTS3Segment):
"""
HKKAZ (Kontoumsätze)
+
+ Refs: http://www.hbci-zka.de/dokumente/spezifikation_deutsch/fintsv3/FinTS_3.0_Messages_Geschaeftsvorfaelle_2015-08-07_final_version.pdf
Section C.2.1.1.1.2
"""
type = 'HKKAZ'
date_start.strftime('%Y%m%d'),
date_end.strftime('%Y%m%d'),
'',
- touchdown if touchdown is not None else ''
+ fints_escape(touchdown) if touchdown is not None else ''
]
super().__init__(segno, data)
print(u"{}: {}".format(idx, seg.encode('utf-8')))
+def fints_escape(content):
+ """
+ Escape strings
+
+ Ref: https://www.hbci-zka.de/dokumente/spezifikation_deutsch/fintsv3/FinTS_3.0_Formals_2017-05-11_final_version.pdf
+ Section H.1.1
+ """
+ return content.replace('?', '??').replace('+', '?+').replace(':', '?:').replace("'", "?'")
+
+
+def fints_unescape(content):
+ return content.replace('??', '?').replace("?'", "'").replace('?+', '+').replace('?:', ':')
+
+
+def split_for_data_groups(seg):
+ return re.split('\+(?<!\?\+)', seg)
+
+
+def split_for_data_elements(deg):
+ return re.split(':(?<!\?:)', deg)
+
+
class MT535_Miniparser:
re_identification = re.compile(r"^:35B:ISIN\s(.*)\|(.*)\|(.*)$")
re_marketprice = re.compile(r"^:90B::MRKT\/\/ACTU\/([A-Z]{3})(\d*),{1}(\d*)$")