From: Henryk Plötz Date: Mon, 27 Aug 2018 17:42:33 +0000 (+0200) Subject: Add DKKKU based on a cursory reverse engineering and guessing. Untested though X-Git-Tag: v2.0.0~1^2~69 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=44f2fa876a17d1173bfe886619d807c800a8a191;p=thirdparty%2Fpython-fints.git Add DKKKU based on a cursory reverse engineering and guessing. Untested though --- diff --git a/fints/client.py b/fints/client.py index b51ded2..d421b47 100644 --- a/fints/client.py +++ b/fints/client.py @@ -31,7 +31,7 @@ from .segments.depot import HKWPD5, HKWPD6 from .segments.dialog import HISYN4, HKSYN3 from .segments.debit import HKDSE1, HKDSE2, HKDME1, HKDME2, HKDMC1, HKDBS1, HKDBS2, HKDMB1 from .segments.saldo import HKSAL5, HKSAL6, HKSAL7 -from .segments.statement import HKKAZ5, HKKAZ6, HKKAZ7 +from .segments.statement import HKKAZ5, HKKAZ6, HKKAZ7, DKKKU2 from .segments.transfer import HKCCM1, HKCCS1 from .segments.journal import HKPRO3, HKPRO4 from .types import SegmentSequence @@ -319,6 +319,25 @@ class FinTS3Client: return statement + def get_credit_card_statement(self, account: SEPAAccount, credit_card_number: str, start_date: datetime.date, end_date: datetime.date): + # FIXME Reverse engineered, probably wrong + with self._get_dialog() as dialog: + dkkku = self._find_highest_supported_command(DKKKU2) + + responses = self._fetch_with_touchdowns( + dialog, + lambda touchdown: dkkku( + account=dkkku._fields['account'].type.from_sepa_account(account) if account else None, + credit_card_number=credit_card_number, + date_start=start_date, + date_end=end_date, + touchdown_point=touchdown, + ), + 'DIKKU' + ) + + return responses + def get_balance(self, account: SEPAAccount): """ Fetches an accounts current balance. diff --git a/fints/formals.py b/fints/formals.py index 3e0ee75..e92f01c 100644 --- a/fints/formals.py +++ b/fints/formals.py @@ -791,6 +791,14 @@ class QueryScheduledBatchDebitParameter1(DataElementGroup): max_number_responses_allowed = DataElementField(type='jn', _d="Eingabe Anzahl Einträge erlaubt") date_range_allowed = DataElementField(type='jn', _d="Zeitraum möglich") +class QueryCreditCardStatements2(DataElementGroup): + """Parameter Kreditkartenumsätze anfordern, version 2 + + Source: reverse engineered""" + cutoff_days = DataElementField(type='num', max_length=4, _d="Maximale Vorhaltezeit der Umsätze") + max_number_responses_allowed = DataElementField(type='jn', _d="Eingabe Anzahl Einträge erlaubt") + date_range_allowed = DataElementField(type='jn', _d="Zeitraum möglich") + class SEPACCode1(RepresentableEnum): REVERSAL = '1' #: Reversal REVOCATION = '2' #: Revocation diff --git a/fints/segments/statement.py b/fints/segments/statement.py index 8185c72..0cb5651 100644 --- a/fints/segments/statement.py +++ b/fints/segments/statement.py @@ -2,10 +2,10 @@ from fints.utils import fints_escape from fints.fields import DataElementField, DataElementGroupField from fints.formals import ( - KTI1, Account3, Account2 + KTI1, Account3, Account2, QueryCreditCardStatements2 ) -from . import FinTS3Segment +from . import FinTS3Segment, ParameterSegment @@ -65,3 +65,28 @@ class HIKAZ7(FinTS3Segment): Source: FinTS Financial Transaction Services, Schnittstellenspezifikation, Messages -- Multibankfähige Geschäftsvorfälle """ statement_booked = DataElementField(type='bin', _d="Gebuchte Umsätze") statement_pending = DataElementField(type='bin', required=False, _d="Nicht gebuchte Umsätze") + + +class DKKKU2(FinTS3Segment): + """Kreditkartenumsätze anfordern, version 2 + + Source: Reverse engineered""" + account = DataElementGroupField(type=Account2, _d="Kontoverbindung Auftraggeber") + credit_card_number = DataElementField(type='an', _d="Kreditkartennummer") + subaccount = DataElementField(type='an', required=False, _d="Subaccount?") + date_start = DataElementField(type='dat', required=False, _d="Von Datum") + date_end = DataElementField(type='dat', required=False, _d="Bis Datum") + max_number_responses = DataElementField(type='num', max_length=4, required=False, _d="Maximale Anzahl Einträge") + touchdown_point = DataElementField(type='an', max_length=35, required=False, _d="Aufsetzpunkt") + + +class DIKKU2(FinTS3Segment): + """Kreditkartenumsätze rückmelden, version 2 + + Source: Reverse engineered""" + +class DIKKUS2(ParameterSegment): + """Kreditkartenumsätze anfordern Parameter, version 2 + + Source: Reverse engineered""" + parameter = DataElementGroupField(type=QueryCreditCardStatements2, _d="Parameter Kreditkartenumsätze anfordern")