Skip to content

Commit 62824ca

Browse files
johan12345raphaelm
authored andcommitted
Implement fetching account statements (HKKAU, HKEKA)
1 parent 7282fb5 commit 62824ca

3 files changed

Lines changed: 221 additions & 4 deletions

File tree

fints/client.py

Lines changed: 51 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
from .formals import (
1818
CUSTOMER_ID_ANONYMOUS, KTI1, BankIdentifier, DescriptionRequired,
1919
SynchronizationMode, TANMediaClass4, TANMediaType2,
20-
SupportedMessageTypes, TANUsageOption
20+
SupportedMessageTypes, StatementFormat, TANUsageOption
2121
)
2222
from .message import FinTSInstituteMessage
2323
from .models import SEPAAccount
@@ -37,7 +37,7 @@
3737
from .segments.dialog import HIRMG2, HIRMS2, HISYN4, HKSYN3
3838
from .segments.journal import HKPRO3, HKPRO4
3939
from .segments.saldo import HKSAL5, HKSAL6, HKSAL7
40-
from .segments.statement import DKKKU2, HKKAZ5, HKKAZ6, HKKAZ7, HKCAZ1
40+
from .segments.statement import DKKKU2, HKKAZ5, HKKAZ6, HKKAZ7, HKCAZ1, HKKAU2, HKKAU1, HKEKA3, HKEKA4, HKEKA5
4141
from .segments.transfer import HKCCM1, HKCCS1, HKIPZ1, HKIPM1
4242
from .types import SegmentSequence
4343
from .utils import (
@@ -733,6 +733,55 @@ def get_communication_endpoints(self):
733733

734734
return responses
735735

736+
def get_statements(self, account: SEPAAccount):
737+
"""
738+
Retrieve list of statements of an account.
739+
740+
:param account: SEPAAccount to retrieve statements for.
741+
:return: List of HIKAU objects
742+
"""
743+
with self._get_dialog() as dialog:
744+
hkkau = self._find_highest_supported_command(HKKAU1, HKKAU2)
745+
746+
responses = self._fetch_with_touchdowns(
747+
dialog,
748+
lambda touchdown: hkkau(
749+
account=hkkau._fields['account'].type.from_sepa_account(account),
750+
touchdown_point=touchdown,
751+
),
752+
lambda response: response,
753+
'HIKAU'
754+
)
755+
756+
return responses
757+
758+
def _get_statement(self, command_seg, response):
759+
for resp in response.response_segments(command_seg, 'HIEKA'):
760+
return resp
761+
762+
def get_statement(self, account: SEPAAccount, number: int, year: int, format: StatementFormat = None):
763+
"""
764+
Retrieve a given statement of an account.
765+
766+
:param account: SEPAAccount to retrieve statement for.
767+
:param number: Number of the statement to retrieve.
768+
:param year: Year of the statement to retrieve.
769+
:param format: Format to retrieve the statement in.
770+
:return: HIEKA object
771+
"""
772+
with self._get_dialog() as dialog:
773+
hkeka = self._find_highest_supported_command(HKEKA3, HKEKA4, HKEKA5)
774+
775+
seg = hkeka(
776+
account=hkeka._fields['account'].type.from_sepa_account(account),
777+
statement_format=format,
778+
statement_number=number,
779+
statement_year=year
780+
)
781+
782+
response = self._send_with_possible_retry(dialog, seg, self._get_statement)
783+
return response
784+
736785
def _find_supported_sepa_version(self, candidate_versions):
737786
hispas = self.bpd.find_segment_first('HISPAS')
738787
if not hispas:

fints/formals.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1043,3 +1043,31 @@ class BookedCamtStatements1(DataElementGroup):
10431043
10441044
Source: Messages - Multibankfähige Geschäftsvorfälle (SEPA)"""
10451045
camt_statements = DataElementField(type='bin', min_count=1, required=True, _d="camt-Umsätze gebucht")
1046+
1047+
1048+
@document_enum
1049+
class StatementFormat(RepresentableEnum):
1050+
"""Kontoauszugsformat
1051+
1052+
Source: FinTS Financial Transaction Services, Schnittstellenspezifikation, Messages -- Multibankfähige Geschäftsvorfälle"""
1053+
MT_940 = '1' # doc: S.W.I.F.T. MT940
1054+
ISO_8583 = '2' # doc: ISO 8583
1055+
PDF = '3' # doc: printable format (e.g., PDF)
1056+
1057+
1058+
@document_enum
1059+
class Confirmation(RepresentableEnum):
1060+
"""Quittierung
1061+
1062+
Source: FinTS Financial Transaction Services, Schnittstellenspezifikation, Messages -- Multibankfähige Geschäftsvorfälle"""
1063+
NOT_REQUIRED = '0' # doc: Nicht Notwendig
1064+
CONFIRMED = '1' # doc: Quittiert
1065+
AWAITING_CONFIRMATION = '2' # doc: Quittierung offen
1066+
1067+
1068+
class ReportPeriod2(DataElementGroup):
1069+
"""Berichtszeitraum, version 2
1070+
1071+
Source: FinTS Financial Transaction Services, Schnittstellenspezifikation, Messages -- Multibankfähige Geschäftsvorfälle"""
1072+
start_date = DataElementField(type='dat', _d="Startdatum")
1073+
end_date = DataElementField(type='dat', required=False, _d="Enddatum")

fints/segments/statement.py

Lines changed: 142 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
from fints.fields import DataElementField, DataElementGroupField
1+
from fints.fields import DataElementField, DataElementGroupField, CodeField
22
from fints.formals import KTI1, Account2, Account3, QueryCreditCardStatements2, SupportedMessageTypes, \
3-
BookedCamtStatements1
3+
BookedCamtStatements1, StatementFormat, Confirmation, ReportPeriod2
44

55
from .base import FinTS3Segment, ParameterSegment
66

@@ -111,3 +111,143 @@ class HICAZ1(FinTS3Segment):
111111
camt_descriptor = DataElementField(type='an', _d="camt-Deskriptor")
112112
statement_booked = DataElementGroupField(type=BookedCamtStatements1, _d="Gebuchte Umsätze")
113113
statement_pending = DataElementField(type='bin', required=False, _d="Nicht gebuchte Umsätze")
114+
115+
116+
class HKKAU1(FinTS3Segment):
117+
"""Übersicht Kontoauszüge, version 1
118+
119+
Source: FinTS Financial Transaction Services, Schnittstellenspezifikation, Messages -- Multibankfähige Geschäftsvorfälle"""
120+
account = DataElementGroupField(type=Account3, _d="Kontoverbindung Auftraggeber")
121+
max_number_responses = DataElementField(type='num', max_length=4, required=False, _d="Maximale Anzahl Einträge")
122+
touchdown_point = DataElementField(type='an', max_length=35, required=False, _d="Aufsetzpunkt")
123+
124+
125+
class HKKAU2(FinTS3Segment):
126+
"""Übersicht Kontoauszüge, version 2
127+
128+
Source: FinTS Financial Transaction Services, Schnittstellenspezifikation, Messages -- Multibankfähige Geschäftsvorfälle"""
129+
account = DataElementGroupField(type=KTI1, _d="Kontoverbindung international")
130+
max_number_responses = DataElementField(type='num', max_length=4, required=False, _d="Maximale Anzahl Einträge")
131+
touchdown_point = DataElementField(type='an', max_length=35, required=False, _d="Aufsetzpunkt")
132+
133+
134+
class HIKAU1(FinTS3Segment):
135+
"""Übersicht Kontoauszüge, version 1
136+
137+
Source: FinTS Financial Transaction Services, Schnittstellenspezifikation, Messages -- Multibankfähige Geschäftsvorfälle"""
138+
statement_number = DataElementField(type='num', max_length=5, _d="Kontoauszugsnummer")
139+
confirmation = CodeField(enum=Confirmation, length=1, _d="Quittierung")
140+
collection_possible = DataElementField(type='jn', _d="Abholung möglich J/N")
141+
year = DataElementField(type='num', length=4, required=False, _d="Jahr")
142+
date_created = DataElementField(type='dat', required=False, _d="Datum der Erstellung")
143+
time_created = DataElementField(type='tim', required=False, _d="Uhrzeit der Erstellung")
144+
creation_type = DataElementField(type='an', max_length=30, required=False, _d="Erstellart")
145+
146+
147+
class HIKAU2(FinTS3Segment):
148+
"""Übersicht Kontoauszüge, version 2
149+
150+
Source: FinTS Financial Transaction Services, Schnittstellenspezifikation, Messages -- Multibankfähige Geschäftsvorfälle"""
151+
statement_number = DataElementField(type='num', max_length=5, _d="Kontoauszugsnummer")
152+
confirmation = CodeField(enum=Confirmation, length=1, _d="Quittierung")
153+
collection_possible = DataElementField(type='jn', _d="Abholung möglich J/N")
154+
year = DataElementField(type='num', length=4, required=False, _d="Jahr")
155+
date_created = DataElementField(type='dat', required=False, _d="Datum der Erstellung")
156+
time_created = DataElementField(type='tim', required=False, _d="Uhrzeit der Erstellung")
157+
creation_type = DataElementField(type='an', max_length=30, required=False, _d="Erstellart")
158+
159+
160+
class HKEKA3(FinTS3Segment):
161+
"""Kontoauszug anfordern, version 3
162+
163+
Source: FinTS Financial Transaction Services, Schnittstellenspezifikation, Messages -- Multibankfähige Geschäftsvorfälle"""
164+
account = DataElementGroupField(type=Account3, _d="Kontoverbindung Auftraggeber")
165+
statement_format = CodeField(enum=StatementFormat, length=1, required=False, _d="Kontoauszugsformat")
166+
statement_number = DataElementField(type='num', max_length=5, _d="Kontoauszugsnummer")
167+
statement_year = DataElementField(type='num', length=4, _d="Kontoauszugsjahr")
168+
max_number_responses = DataElementField(type='num', max_length=4, required=False, _d="Maximale Anzahl Einträge")
169+
touchdown_point = DataElementField(type='an', max_length=35, required=False, _d="Aufsetzpunkt")
170+
171+
172+
class HKEKA4(FinTS3Segment):
173+
"""Kontoauszug anfordern, version 4
174+
175+
Source: FinTS Financial Transaction Services, Schnittstellenspezifikation, Messages -- Multibankfähige Geschäftsvorfälle"""
176+
account = DataElementGroupField(type=KTI1, _d="Kontoverbindung international")
177+
statement_format = CodeField(enum=StatementFormat, length=1, required=False, _d="Kontoauszugsformat")
178+
statement_number = DataElementField(type='num', max_length=5, _d="Kontoauszugsnummer")
179+
statement_year = DataElementField(type='num', length=4, _d="Kontoauszugsjahr")
180+
max_number_responses = DataElementField(type='num', max_length=4, required=False, _d="Maximale Anzahl Einträge")
181+
touchdown_point = DataElementField(type='an', max_length=35, required=False, _d="Aufsetzpunkt")
182+
183+
184+
class HKEKA5(FinTS3Segment):
185+
"""Kontoauszug anfordern, version 5
186+
187+
Source: FinTS Financial Transaction Services, Schnittstellenspezifikation, Messages -- Multibankfähige Geschäftsvorfälle"""
188+
account = DataElementGroupField(type=KTI1, _d="Kontoverbindung international")
189+
statement_format = CodeField(enum=StatementFormat, length=1, required=False, _d="Kontoauszugsformat")
190+
statement_number = DataElementField(type='num', max_length=5, _d="Kontoauszugsnummer")
191+
statement_year = DataElementField(type='num', length=4, _d="Kontoauszugsjahr")
192+
max_number_responses = DataElementField(type='num', max_length=4, required=False, _d="Maximale Anzahl Einträge")
193+
touchdown_point = DataElementField(type='an', max_length=35, required=False, _d="Aufsetzpunkt")
194+
195+
196+
class HIEKA3(FinTS3Segment):
197+
"""Kontoauszug, version 3
198+
199+
Source: FinTS Financial Transaction Services, Schnittstellenspezifikation, Messages -- Multibankfähige Geschäftsvorfälle"""
200+
statement_format = CodeField(enum=StatementFormat, length=1, required=False, _d="Kontoauszugsformat")
201+
statement_period = DataElementGroupField(type=ReportPeriod2, _d="Berichtszeitraum")
202+
data = DataElementField(type='bin', _d="Gebuchte Umsätze")
203+
statement_info = DataElementField(type='txt', max_length=65536, required=False, _d="Informationen zum Rechnungsabschluss")
204+
customer_info = DataElementField(type='txt', max_length=65536, required=False,
205+
_d="Informationen zu Kundenbedingungen")
206+
advertising_text = DataElementField(type='txt', max_length=65536, required=False, _d="Werbetext")
207+
account_iban = DataElementField(type='an', max_length=34, required=False, _d="IBAN Konto")
208+
account_bic = DataElementField(type='an', max_length=11, required=False, _d="BIC Konto")
209+
statement_name_1 = DataElementField(type='an', max_length=35, required=False, _d="Auszugsname 1")
210+
statement_name_2 = DataElementField(type='an', max_length=35, required=False, _d="Auszugsname 2")
211+
statement_name_extra = DataElementField(type='an', max_length=35, required=False, _d="Namenszusatz")
212+
confirmation_code = DataElementField(type='bin', required=False, _d="Quittungscode")
213+
214+
215+
class HIEKA4(FinTS3Segment):
216+
"""Kontoauszug, version 4
217+
218+
Source: FinTS Financial Transaction Services, Schnittstellenspezifikation, Messages -- Multibankfähige Geschäftsvorfälle"""
219+
statement_format = CodeField(enum=StatementFormat, length=1, required=False, _d="Kontoauszugsformat")
220+
statement_period = DataElementGroupField(type=ReportPeriod2, _d="Berichtszeitraum")
221+
data = DataElementField(type='bin', _d="Gebuchte Umsätze")
222+
statement_info = DataElementField(type='txt', max_length=65536, required=False, _d="Informationen zum Rechnungsabschluss")
223+
customer_info = DataElementField(type='txt', max_length=65536, required=False,
224+
_d="Informationen zu Kundenbedingungen")
225+
advertising_text = DataElementField(type='txt', max_length=65536, required=False, _d="Werbetext")
226+
account_iban = DataElementField(type='an', max_length=34, required=False, _d="IBAN Konto")
227+
account_bic = DataElementField(type='an', max_length=11, required=False, _d="BIC Konto")
228+
statement_name_1 = DataElementField(type='an', max_length=35, required=False, _d="Auszugsname 1")
229+
statement_name_2 = DataElementField(type='an', max_length=35, required=False, _d="Auszugsname 2")
230+
statement_name_extra = DataElementField(type='an', max_length=35, required=False, _d="Namenszusatz")
231+
confirmation_code = DataElementField(type='bin', required=False, _d="Quittungscode")
232+
233+
234+
class HIEKA5(FinTS3Segment):
235+
"""Kontoauszug, version 5
236+
237+
Source: FinTS Financial Transaction Services, Schnittstellenspezifikation, Messages -- Multibankfähige Geschäftsvorfälle"""
238+
statement_format = CodeField(enum=StatementFormat, length=1, required=False, _d="Kontoauszugsformat")
239+
statement_period = DataElementGroupField(type=ReportPeriod2, _d="Berichtszeitraum")
240+
date_created = DataElementField(type='dat', required=False, _d="Erstellungsdatum Kontoauszug")
241+
statement_year = DataElementField(type='num', length=4, required=False, _d="Kontoauszugsjahr")
242+
statement_number = DataElementField(type='num', max_length=5, required=False, _d="Kontoauszugsnummer")
243+
data = DataElementField(type='bin', _d="Gebuchte Umsätze")
244+
statement_info = DataElementField(type='txt', max_length=65536, required=False, _d="Informationen zum Rechnungsabschluss")
245+
customer_info = DataElementField(type='txt', max_length=65536, required=False,
246+
_d="Informationen zu Kundenbedingungen")
247+
advertising_text = DataElementField(type='txt', max_length=65536, required=False, _d="Werbetext")
248+
account_iban = DataElementField(type='an', max_length=34, required=False, _d="IBAN Konto")
249+
account_bic = DataElementField(type='an', max_length=11, required=False, _d="BIC Konto")
250+
statement_name_1 = DataElementField(type='an', max_length=35, required=False, _d="Auszugsname 1")
251+
statement_name_2 = DataElementField(type='an', max_length=35, required=False, _d="Auszugsname 2")
252+
statement_name_extra = DataElementField(type='an', max_length=35, required=False, _d="Namenszusatz")
253+
confirmation_code = DataElementField(type='bin', required=False, _d="Quittungscode")

0 commit comments

Comments
 (0)