]> git.ipfire.org Git - thirdparty/python-fints.git/commitdiff
Add SEPA-instant payment functionality (#144)
authoryniverz <88168412+yniverz@users.noreply.github.com>
Thu, 26 Jan 2023 20:22:40 +0000 (12:22 -0800)
committerGitHub <noreply@github.com>
Thu, 26 Jan 2023 20:22:40 +0000 (21:22 +0100)
fints/client.py
fints/segments/transfer.py

index 61ef2f5ba5123651160de67349fe46e19474538f..28810b1c2348bf75dfa5e6e6ada82144eebea2cb 100644 (file)
@@ -37,7 +37,7 @@ from .segments.dialog import HIRMG2, HIRMS2, HISYN4, HKSYN3
 from .segments.journal import HKPRO3, HKPRO4
 from .segments.saldo import HKSAL5, HKSAL6, HKSAL7
 from .segments.statement import DKKKU2, HKKAZ5, HKKAZ6, HKKAZ7, HKCAZ1
-from .segments.transfer import HKCCM1, HKCCS1
+from .segments.transfer import HKCCM1, HKCCS1, HKIPZ1, HKIPM1
 from .types import SegmentSequence
 from .utils import (
     MT535_Miniparser, Password, SubclassesMixin,
@@ -744,7 +744,7 @@ class FinTS3Client:
         return candidate_versions[0]
 
     def simple_sepa_transfer(self, account: SEPAAccount, iban: str, bic: str,
-                             recipient_name: str, amount: Decimal, account_name: str, reason: str,
+                             recipient_name: str, amount: Decimal, account_name: str, reason: str, instant_payment=False,
                              endtoend_id='NOTPROVIDED'):
         """
         Simple SEPA transfer.
@@ -756,6 +756,7 @@ class FinTS3Client:
         :param amount: Amount as a ``Decimal``
         :param account_name: Sender account name
         :param reason: Transfer reason
+        :param instant_payment: Whether to use instant payment (defaults to ``False``)
         :param endtoend_id: End-to-end-Id (defaults to ``NOTPROVIDED``)
         :return: Returns either a NeedRetryResponse or TransactionResponse
         """
@@ -779,11 +780,11 @@ class FinTS3Client:
         }
         sepa.add_payment(payment)
         xml = sepa.export().decode()
-        return self.sepa_transfer(account, xml, pain_descriptor="urn:iso:std:iso:20022:tech:xsd:"+version)
+        return self.sepa_transfer(account, xml, pain_descriptor="urn:iso:std:iso:20022:tech:xsd:"+version, instant_payment=instant_payment)
 
     def sepa_transfer(self, account: SEPAAccount, pain_message: str, multiple=False,
                       control_sum=None, currency='EUR', book_as_single=False,
-                      pain_descriptor='urn:iso:std:iso:20022:tech:xsd:pain.001.001.03'):
+                      pain_descriptor='urn:iso:std:iso:20022:tech:xsd:pain.001.001.03', instant_payment=False):
         """
         Custom SEPA transfer.
 
@@ -794,14 +795,15 @@ class FinTS3Client:
         :param currency: Transfer currency
         :param book_as_single: Kindly ask the bank to put multiple transactions as separate lines on the bank statement (defaults to ``False``)
         :param pain_descriptor: URN of the PAIN message schema used.
+        :param instant_payment: Whether this is an instant transfer (defaults to ``False``)
         :return: Returns either a NeedRetryResponse or TransactionResponse
         """
 
         with self._get_dialog() as dialog:
             if multiple:
-                command_class = HKCCM1
+                command_class = HKIPM1 if instant_payment else HKCCM1
             else:
-                command_class = HKCCS1
+                command_class = HKIPZ1 if instant_payment else HKCCS1
 
             hiccxs, hkccx = self._find_highest_supported_command(
                 command_class,
@@ -814,6 +816,9 @@ class FinTS3Client:
                 sepa_pain_message=pain_message.encode(),
             )
 
+            # if instant_payment:
+            #     seg.allow_convert_sepa_transfer = True
+
             if multiple:
                 if hiccxs.parameter.sum_amount_required and control_sum is None:
                     raise ValueError("Control sum required.")
index 5203379faa7f65634b5390ef466b604bdf1fe188..9773b3bbda1bf67d4450750dd645209e166495c3 100644 (file)
@@ -12,6 +12,23 @@ class HKCCS1(FinTS3Segment):
     sepa_descriptor = DataElementField(type='an', max_length=256, _d="SEPA Descriptor")
     sepa_pain_message = DataElementField(type='bin', _d="SEPA pain message")
 
+class HKIPZ1(FinTS3Segment):
+    """SEPA-instant Einzelüberweisung, version 1
+    
+    Source: FinTS Financial Transaction Services, Schnittstellenspezifikation, Messages -- Multibankfähige Geschäftsvorfälle """
+    account = DataElementGroupField(type=KTI1, _d="Kontoverbindung international")
+    sepa_descriptor = DataElementField(type='an', max_length=256, _d="SEPA Descriptor")
+    sepa_pain_message = DataElementField(type='bin', _d="SEPA pain message")
+
+# class HKIPZ2(FinTS3Segment):
+#     """SEPA-instant Einzelüberweisung, version 2
+#     
+#     Source: FinTS Financial Transaction Services, Schnittstellenspezifikation, Messages -- Multibankfähige Geschäftsvorfälle """
+#     account = DataElementGroupField(type=KTI1, _d="Kontoverbindung international")
+#     sepa_descriptor = DataElementField(type='an', max_length=256, _d="SEPA Descriptor")
+#     sepa_pain_message = DataElementField(type='bin', _d="SEPA pain message")
+#     allow_convert_sepa_transfer = DataElementField(type="jn", _d="Allow conversion to SEPA transfer if instant-payment not supported")
+
 
 class HKCCM1(FinTS3Segment):
     """SEPA-Sammelüberweisung, version 1
@@ -23,6 +40,28 @@ class HKCCM1(FinTS3Segment):
     sepa_descriptor = DataElementField(type='an', max_length=256, _d="SEPA Descriptor")
     sepa_pain_message = DataElementField(type='bin', _d="SEPA pain message")
 
+    
+class HKIPM1(FinTS3Segment):
+    """SEPA-instant Sammelüberweisung, version 1
+    
+    Source: FinTS Financial Transaction Services, Schnittstellenspezifikation, Messages -- Multibankfähige Geschäftsvorfälle """
+    account = DataElementGroupField(type=KTI1, _d="Kontoverbindung international")
+    sum_amount = DataElementGroupField(type=Amount1, _d="Summenfeld")
+    request_single_booking = DataElementField(type='jn', _d="Einzelbuchung gewünscht")
+    sepa_descriptor = DataElementField(type='an', max_length=256, _d="SEPA Descriptor")
+    sepa_pain_message = DataElementField(type='bin', _d="SEPA pain message")
+
+# class HKIPM2(FinTS3Segment):
+#     """SEPA-instant Sammelüberweisung, version 2
+#     
+#     Source: FinTS Financial Transaction Services, Schnittstellenspezifikation, Messages -- Multibankfähige Geschäftsvorfälle """
+#     account = DataElementGroupField(type=KTI1, _d="Kontoverbindung international")
+#     sum_amount = DataElementGroupField(type=Amount1, _d="Summenfeld")
+#     request_single_booking = DataElementField(type='jn', _d="Einzelbuchung gewünscht")
+#     sepa_descriptor = DataElementField(type='an', max_length=256, _d="SEPA Descriptor")
+#     sepa_pain_message = DataElementField(type='bin', _d="SEPA pain message")
+#     allow_convert_sepa_transfer = DataElementField(type="jn", _d="Allow conversion to SEPA transfer if instant-payment not supported")
+
 
 class HICCMS1(ParameterSegment):
     """SEPA-Sammelüberweisung Parameter, version 1