From 5141a0f057c8f1efa57a3a0e5be323e229a5edcc Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Wed, 25 Jul 2018 18:39:03 +0200 Subject: [PATCH] Multi-transfer --- fints/client.py | 33 ++++++++++++++++++++++----------- fints/segments/transfer.py | 24 ++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 11 deletions(-) diff --git a/fints/client.py b/fints/client.py index a1fbcbd..03e189f 100644 --- a/fints/client.py +++ b/fints/client.py @@ -16,7 +16,7 @@ from .segments.auth import HKTAN, HKTAB from .segments.depot import HKWPD from .segments.saldo import HKSAL from .segments.statement import HKKAZ -from .segments.transfer import HKCCS +from .segments.transfer import HKCCS, HKCCM from .utils import mt940_to_array, MT535_Miniparser, split_for_data_groups, split_for_data_elements, Password logger = logging.getLogger(__name__) @@ -286,29 +286,40 @@ class FinTS3Client: return self.start_sepa_transfer(account, xml, tan_method, tan_description) def _get_start_sepa_transfer_message(self, dialog, account: SEPAAccount, pain_message: str, tan_method, - tan_description): - segHKCCS = HKCCS(3, account, pain_message) - segHKTAN = HKTAN(4, '4', '', tan_description, tan_method.version) + tan_description, multiple, control_sum, currency, book_as_single): + if multiple: + if not control_sum: + raise ValueError("Control sum required.") + segreq = HKCCM(3, account, pain_message, control_sum, currency, book_as_single) + else: + segreq = HKCCS(3, account, pain_message) + segtan = HKTAN(4, '4', '', tan_description, tan_method.version) return self._new_message(dialog, [ - segHKCCS, - segHKTAN + segreq, + segtan ]) - def start_sepa_transfer(self, account: SEPAAccount, pain_message: str, tan_method, tan_description=''): + def start_sepa_transfer(self, account: SEPAAccount, pain_message: str, tan_method, tan_description='', + multiple=False, control_sum=None, currency='EUR', book_as_single=False): dialog = self._new_dialog() dialog.sync() dialog.tan_mechs = [tan_method] dialog.init() with self.pin.protect(): - logger.debug('Sending HKCCS: {}'.format(self._get_start_sepa_transfer_message( - dialog, account, pain_message, tan_method, tan_description + logger.debug('Sending: {}'.format(self._get_start_sepa_transfer_message( + dialog, account, pain_message, tan_method, tan_description, multiple, control_sum, currency, + book_as_single ))) resp = dialog.send(self._get_start_sepa_transfer_message( - dialog, account, pain_message, tan_method, tan_description)) - logger.debug('Got HKCCS response: {}'.format(resp)) + dialog, account, pain_message, tan_method, tan_description, multiple, control_sum, currency, + book_as_single + )) + logger.debug('Got response: {}'.format(resp)) + return self._tan_requiring_response(dialog, resp) + def _tan_requiring_response(self, dialog, resp): seg = resp._find_segment('HITAN') s = split_for_data_groups(seg) spl = split_for_data_elements(s[0]) diff --git a/fints/segments/transfer.py b/fints/segments/transfer.py index fe17bbb..eae03dd 100644 --- a/fints/segments/transfer.py +++ b/fints/segments/transfer.py @@ -22,3 +22,27 @@ class HKCCS(FinTS3Segment): '@{}@{}'.format(len(pain_msg), pain_msg) ] super().__init__(segno, data) + + +class HKCCM(FinTS3Segment): + """ + HKCCM (SEPA-Sammelüberweisung einreichen) + Section C.10.3.1.1 + """ + type = 'HKCCM' + + def __init__(self, segno, account: SEPAAccount, pain_msg, control_sum, currency, book_as_single): + self.version = 1 + sepa_descriptor = 'urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.001.001.03' + msg = ':'.join([ + account.iban, + account.bic + ]) + data = [ + msg, + str(control_sum).replace('.', ',') + ':' + currency, + 'J' if book_as_single else '', + sepa_descriptor, + '@{}@{}'.format(len(pain_msg), pain_msg) + ] + super().__init__(segno, data) -- 2.39.5