From: yniverz <88168412+yniverz@users.noreply.github.com> Date: Thu, 26 Jan 2023 20:22:40 +0000 (-0800) Subject: Add SEPA-instant payment functionality (#144) X-Git-Tag: v4.0.0~3 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=70e0a9343f768b17a6aa279dbaf909d9290184c1;p=thirdparty%2Fpython-fints.git Add SEPA-instant payment functionality (#144) --- diff --git a/fints/client.py b/fints/client.py index 61ef2f5..28810b1 100644 --- a/fints/client.py +++ b/fints/client.py @@ -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.") diff --git a/fints/segments/transfer.py b/fints/segments/transfer.py index 5203379..9773b3b 100644 --- a/fints/segments/transfer.py +++ b/fints/segments/transfer.py @@ -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