]> git.ipfire.org Git - thirdparty/python-fints.git/commitdiff
Multi-transfer
authorRaphael Michel <mail@raphaelmichel.de>
Wed, 25 Jul 2018 16:39:03 +0000 (18:39 +0200)
committerRaphael Michel <mail@raphaelmichel.de>
Wed, 25 Jul 2018 16:39:03 +0000 (18:39 +0200)
fints/client.py
fints/segments/transfer.py

index a1fbcbd8fd79b08c03818233e071a2b0a381f1f6..03e189f9a43bd5cf9937d5d8783c87d0af2a5eee 100644 (file)
@@ -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])
index fe17bbb299949b9af65383468744ed9f907d9327..eae03dd303a3dabb495aea1581e4112c9c592995 100644 (file)
@@ -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)