import datetime
import logging
-import re
-import bleach
-from enum import Enum
-from decimal import Decimal
-from contextlib import contextmanager
from collections import OrderedDict
+from contextlib import contextmanager
+from decimal import Decimal
+from enum import Enum
-from mt940.models import Balance
+import bleach
from sepaxml import SepaTransfer
from .connection import FinTSHTTPSConnection
from .dialog import FinTSDialog
+from .exceptions import *
from .formals import (
- KTI1, Account3, BankIdentifier,
- SynchronisationMode, TwoStepParametersCommon,
- TANMediaType2, TANMediaClass4, CUSTOMER_ID_ANONYMOUS,
- DescriptionRequired,
+ CUSTOMER_ID_ANONYMOUS, KTI1, BankIdentifier, DescriptionRequired,
+ SynchronisationMode, TANMediaClass4, TANMediaType2,
)
from .message import FinTSInstituteMessage
-from .models import (
- SEPAAccount, TANChallenge, TANChallenge3,
- TANChallenge4, TANChallenge5, TANChallenge6,
-)
+from .models import SEPAAccount
+from .parser import FinTS3Serializer
from .security import (
PinTanDummyEncryptionMechanism, PinTanOneStepAuthenticationMechanism,
PinTanTwoStepAuthenticationMechanism,
)
-from .segments.bank import HIBPA3, HIUPA4, HKKOM4
from .segments.accounts import HISPA1, HKSPA1
-from .segments.auth import HKTAB4, HKTAB5, HKTAN3, HKTAN5, HIPINS1
+from .segments.auth import HIPINS1, HKTAB4, HKTAB5, HKTAN3, HKTAN5
+from .segments.bank import HIBPA3, HIUPA4, HKKOM4
+from .segments.debit import (
+ HKDBS1, HKDBS2, HKDMB1, HKDMC1, HKDME1, HKDME2,
+ HKDSC1, HKDSE1, HKDSE2, DebitResponseBase,
+)
from .segments.depot import HKWPD5, HKWPD6
-from .segments.dialog import HISYN4, HKSYN3, HIRMG2, HIRMS2
-from .segments.debit import HKDSE1, HKDSE2, HKDME1, HKDME2, HKDSC1, HKDMC1, HKDBS1, HKDBS2, HKDMB1, DebitResponseBase
+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 HKKAZ5, HKKAZ6, HKKAZ7, DKKKU2
+from .segments.statement import DKKKU2, HKKAZ5, HKKAZ6, HKKAZ7
from .segments.transfer import HKCCM1, HKCCS1
-from .segments.journal import HKPRO3, HKPRO4
from .types import SegmentSequence
-from .utils import MT535_Miniparser, Password, mt940_to_array, compress_datablob, decompress_datablob, SubclassesMixin
-from .parser import FinTS3Serializer
-from .exceptions import *
+from .utils import (
+ MT535_Miniparser, Password, SubclassesMixin,
+ compress_datablob, decompress_datablob, mt940_to_array,
+)
logger = logging.getLogger(__name__)
'tan_mechanisms': self.get_tan_mechanisms(),
}
return retval
-
import base64
-import logging
import io
+import logging
import requests
-from fints.parser import FinTS3Parser
from fints.utils import Password
-from .message import FinTSInstituteMessage, FinTSMessage
from .exceptions import *
+from .message import FinTSInstituteMessage, FinTSMessage
logger = logging.getLogger(__name__)
+import io
import logging
import pickle
-import io
-from .formals import (
- BankIdentifier, Language2, SynchronisationMode, SystemIDStatus, CUSTOMER_ID_ANONYMOUS,
-)
-from .message import (
- FinTSCustomerMessage, FinTSMessage, MessageDirection,
-)
+from .connection import FinTSConnectionError
+from .exceptions import *
+from .formals import CUSTOMER_ID_ANONYMOUS, Language2, SystemIDStatus
+from .message import FinTSCustomerMessage, MessageDirection
from .segments.auth import HKIDN2, HKVVB3
from .segments.dialog import HKEND1
from .segments.message import HNHBK3, HNHBS1
from .utils import compress_datablob, decompress_datablob
-from .connection import FinTSConnectionError
-from .exceptions import *
logger = logging.getLogger(__name__)
class FinTSConnectionError(FinTSError):
pass
-
import re
import warnings
-from fints.types import (
- Field, TypedField, SegmentSequence
-)
+from fints.types import Container, SegmentSequence, TypedField
from fints.utils import (
- DocTypeMixin, FieldRenderFormatStringMixin,
- FixedLengthMixin, Password
+ DocTypeMixin, FieldRenderFormatStringMixin, FixedLengthMixin, Password,
)
def _default_value(self):
if self.type is None:
- return fints.types.Container()
+ return Container()
else:
return self.type()
import re
-from fints.types import * # The order is important!
from fints.fields import *
+from fints.types import *
from fints.utils import RepresentableEnum, ShortReprMixin
CUSTOMER_ID_ANONYMOUS = '9999999999'
-import random
from enum import Enum
from .formals import SegmentSequence
-from .segments._base import FinTS3Segment
-from .segments.auth import HITANSBase
-from .segments.bank import HIBPA3
-from .segments.dialog import HIRMG2, HIRMS2
-from .segments.message import HNHBK3, HNHBS1
+from .segments.base import FinTS3Segment
+from .segments.dialog import HIRMS2
class MessageDirection(Enum):
from .formals import (
Container, DataElementGroupField, SegmentSequence, ValueList,
)
-from .segments._base import FinTS3Segment
+# Ensure that all segment types are loaded (otherwise the subclass find won't see them)
+from .segments import ( # noqa
+ accounts, auth, bank, base, debit, depot, dialog,
+ journal, message, saldo, statement, transfer,
+)
+from .segments.base import FinTS3Segment
#
# FinTS 3.0 structure:
+++ /dev/null
-import re
-
-from fints.fields import DataElementField, DataElementGroupField, IntCodeField
-from fints.types import Container, ContainerMeta
-from fints.formals import SegmentHeader, SecurityClass
-from fints.utils import SubclassesMixin, classproperty
-
-TYPE_VERSION_RE = re.compile(r'^([A-Z]+)(\d+)$')
-
-class FinTS3SegmentMeta(ContainerMeta):
- @staticmethod
- def _check_fields_recursive(instance):
- for name, field in instance._fields.items():
- if not isinstance(field, (DataElementField, DataElementGroupField)):
- raise TypeError("{}={!r} is not DataElementField or DataElementGroupField".format(name, field))
- if isinstance(field, DataElementGroupField):
- FinTS3SegmentMeta._check_fields_recursive(field.type)
-
- def __new__(cls, name, bases, classdict):
- retval = super().__new__(cls, name, bases, classdict)
- FinTS3SegmentMeta._check_fields_recursive(retval)
- return retval
-
-class FinTS3Segment(Container, SubclassesMixin, metaclass=FinTS3SegmentMeta):
- header = DataElementGroupField(type=SegmentHeader, _d="Segmentkopf")
-
- @classproperty
- def TYPE(cls):
- match = TYPE_VERSION_RE.match(cls.__name__)
- if match:
- return match.group(1)
-
- @classproperty
- def VERSION(cls):
- match = TYPE_VERSION_RE.match(cls.__name__)
- if match:
- return int( match.group(2) )
-
- def __init__(self, *args, **kwargs):
- if 'header' not in kwargs:
- kwargs['header'] = SegmentHeader(self.TYPE, None, self.VERSION)
-
- args = (kwargs.pop('header'), ) + args
-
- return super().__init__(*args, **kwargs)
-
- @classmethod
- def find_subclass(cls, segment):
- h = SegmentHeader.naive_parse(segment[0])
- target_cls = None
-
- for possible_cls in cls._all_subclasses():
- if getattr(possible_cls, 'TYPE', None) == h.type and getattr(possible_cls, 'VERSION', None) == h.version:
- target_cls = possible_cls
-
- if not target_cls:
- target_cls = cls
-
- return target_cls
-
-
-class ParameterSegment_22(FinTS3Segment):
- max_number_tasks = DataElementField(type='num', max_length=3, _d="Maximale Anzahl Aufträge")
- min_number_signatures = DataElementField(type='num', length=1, _d="Anzahl Signaturen mindestens")
-
-class ParameterSegment(FinTS3Segment):
- max_number_tasks = DataElementField(type='num', max_length=3, _d="Maximale Anzahl Aufträge")
- min_number_signatures = DataElementField(type='num', length=1, _d="Anzahl Signaturen mindestens")
- security_class = IntCodeField(SecurityClass, length=1, _d="Sicherheitsklasse")
-from ._base import FinTS3Segment, ParameterSegment
from ..fields import DataElementGroupField
from ..formals import KTZ1, Account3, GetSEPAAccountParameter1
+from .base import FinTS3Segment, ParameterSegment
+
class HKSPA1(FinTS3Segment):
"""SEPA-Kontoverbindung anfordern, version 1
from fints.fields import CodeField, DataElementField, DataElementGroupField
from fints.formals import (
- BankIdentifier, Language2, SynchronisationMode, SystemIDStatus,
- TANMediaType2, TANMediaClass4, TANMedia5, TANMediaClass3, TANMedia4, TANUsageOption,
- KTI1, ParameterChallengeClass, ResponseHHDUC, ChallengeValidUntil,
- ParameterTwostepTAN1, ParameterTwostepTAN2, ParameterTwostepTAN3, ParameterTwostepTAN4,
- ParameterTwostepTAN5, ParameterTwostepTAN6, ParameterPinTan, SupportedLanguages2,
- SupportedHBCIVersions2
+ KTI1, BankIdentifier, ChallengeValidUntil, Language2,
+ ParameterChallengeClass, ParameterPinTan, ParameterTwostepTAN1,
+ ParameterTwostepTAN2, ParameterTwostepTAN3, ParameterTwostepTAN4,
+ ParameterTwostepTAN5, ParameterTwostepTAN6, ResponseHHDUC,
+ SystemIDStatus, TANMedia4, TANMedia5, TANMediaClass3,
+ TANMediaClass4, TANMediaType2, TANUsageOption,
)
-from ._base import FinTS3Segment, ParameterSegment
+
+from .base import FinTS3Segment, ParameterSegment
class HKIDN2(FinTS3Segment):
Source: FinTS Financial Transaction Services, Schnittstellenspezifikation, Sicherheitsverfahren PIN/TAN
"""
parameter = DataElementGroupField(type=ParameterPinTan, _d="Parameter PIN/TAN-spezifische Informationen")
-
-
-from ._base import FinTS3Segment
-from fints.fields import DataElementField, CodeField, DataElementGroupField
-from fints.formals import UPDUsage, AccountInformation, AccountLimit, AllowedTransaction, BankIdentifier, Language2, CommunicationParameter2, SupportedLanguages2, SupportedHBCIVersions2
+from fints.fields import CodeField, DataElementField, DataElementGroupField
+from fints.formals import (
+ AccountInformation, AccountLimit, AllowedTransaction,
+ BankIdentifier, CommunicationParameter2, Language2,
+ SupportedHBCIVersions2, SupportedLanguages2, UPDUsage,
+)
+
+from .base import FinTS3Segment
+
class HIBPA3(FinTS3Segment):
"""Bankparameter allgemein, version 3
-from ._base import FinTS3Segment, ParameterSegment
-from ..models import SEPAAccount
-from ..fields import DataElementField, DataElementGroupField, CodeField
-from ..formals import ScheduledCOR1DebitParameter1, ScheduledCOR1BatchDebitParameter1, KTI1, Amount1, ScheduledBatchDebitParameter1, ScheduledBatchDebitParameter2, ScheduledDebitParameter1, ScheduledDebitParameter2, SupportedSEPAPainMessages1, QueryScheduledDebitParameter1, QueryScheduledDebitParameter2, SEPACCode1, StatusSEPATask1, QueryScheduledBatchDebitParameter1
+from ..fields import CodeField, DataElementField, DataElementGroupField
+from ..formals import (
+ KTI1, Amount1, QueryScheduledBatchDebitParameter1,
+ QueryScheduledDebitParameter1, QueryScheduledDebitParameter2,
+ ScheduledBatchDebitParameter1, ScheduledBatchDebitParameter2,
+ ScheduledCOR1BatchDebitParameter1, ScheduledCOR1DebitParameter1,
+ ScheduledDebitParameter1, ScheduledDebitParameter2, SEPACCode1,
+ StatusSEPATask1, SupportedSEPAPainMessages1,
+)
+from .base import FinTS3Segment, ParameterSegment
+
class BatchDebitBase(FinTS3Segment):
account = DataElementGroupField(type=KTI1, _d="Kontoverbindung international")
Source: FinTS Financial Transaction Services, Schnittstellenspezifikation, Messages -- Multibankfähige Geschäftsvorfälle """
parameter = DataElementGroupField(type=QueryScheduledBatchDebitParameter1, _d="Parameter Bestand terminierter SEPA-Sammellastschriften")
-
-
-
from fints.fields import DataElementField, DataElementGroupField
from fints.formals import Account2, Account3
-from ._base import FinTS3Segment
+from .base import FinTS3Segment
class HKWPD5(FinTS3Segment):
-from ._base import FinTS3Segment
from ..fields import CodeField, DataElementField, DataElementGroupField
-from ..formals import SynchronisationMode, Response
+from ..formals import Response, SynchronisationMode
+from .base import FinTS3Segment
class HKSYN3(FinTS3Segment):
class HIRMS2(FinTS3Segment):
"Rückmeldungen zu Segmenten"
responses = DataElementGroupField(type=Response, min_count=1, max_count=99, _d="Rückmeldung")
-
from fints.fields import DataElementField, DataElementGroupField
-from fints.formals import (
- ReferenceMessage, Response
-)
+from fints.formals import ReferenceMessage, Response
+
+from .base import FinTS3Segment, ParameterSegment, ParameterSegment_22
-from ._base import FinTS3Segment, ParameterSegment, ParameterSegment_22
class HKPRO3(FinTS3Segment):
"""Statusprotokoll anfordern, version 3
-import time
-
from fints.fields import (
CodeField, DataElementField, DataElementGroupField,
SegmentSequenceField, ZeroPaddedNumericField,
SecurityDateTime, SecurityIdentificationDetails, SecurityProfile,
SecurityRole, SignatureAlgorithm, UserDefinedSignature,
)
-from ._base import FinTS3Segment
+
+from .base import FinTS3Segment
class HNHBK3(FinTS3Segment):
KTI1, Account2, Account3, Amount1, Balance1, Balance2, Timestamp1,
)
-from ._base import FinTS3Segment
+from .base import FinTS3Segment
class HKSAL5(FinTS3Segment):
from fints.fields import DataElementField, DataElementGroupField
-from fints.formals import (
- KTI1, Account3, Account2, QueryCreditCardStatements2
-)
-
-from ._base import FinTS3Segment, ParameterSegment
+from fints.formals import KTI1, Account2, Account3, QueryCreditCardStatements2
+from .base import FinTS3Segment, ParameterSegment
class HKKAZ5(FinTS3Segment):
-from fints.fields import CodeField, DataElementField, DataElementGroupField
-from fints.formals import (
- KTI1, Amount1, BatchTransferParameter1
-)
+from fints.fields import DataElementField, DataElementGroupField
+from fints.formals import KTI1, Amount1, BatchTransferParameter1
-from ._base import FinTS3Segment, ParameterSegment
-from ..models import SEPAAccount
+from .base import FinTS3Segment, ParameterSegment
class HKCCS1(FinTS3Segment):
-from contextlib import suppress
from collections import Iterable, OrderedDict
+from contextlib import suppress
from .utils import SubclassesMixin
+
class Field:
def __init__(self, length=None, min_length=None, max_length=None, count=None, min_count=None, max_count=None, required=True, _d=None):
if length is not None and (min_length is not None or max_length is not None):
-import inspect
-import re
import base64
+import inspect
import json
+import re
import zlib
from contextlib import contextmanager
from datetime import datetime
import os.path
import fints.parser
-import pytest
TEST_MESSAGES = {
os.path.basename(f).rsplit('.')[0]: open(f, 'rb').read() for f in
import pytest
from fints.formals import (
- AlphanumericField, Container, ContainerField, DataElementField,
+ Container, ContainerField, DataElementField,
DataElementGroupField, DigitsField, Field, GenericGroupField,
NumericField, SegmentHeader, SegmentSequence,
)
from conftest import TEST_MESSAGES
from fints.formals import SegmentSequence
from fints.parser import FinTS3Parser, FinTSParserError, FinTSParserWarning
-from fints.segments import FinTS3Segment
+from fints.segments.base import FinTS3Segment
@pytest.mark.parametrize("input_name", TEST_MESSAGES.keys())
m.print_nested()
def test_parse_counted():
- from fints.segments import FinTS3Segment
+ from fints.segments.base import FinTS3Segment
from fints.formals import NumericField, Container, ContainerField
class ITST1(FinTS3Segment):
from conftest import TEST_MESSAGES
from fints.formals import NumericField
from fints.parser import FinTS3Parser, FinTS3Serializer
-from fints.segments import FinTS3Segment
+from fints.segments.base import FinTS3Segment
def test_serialize_1():
def test_serialize_2():
from fints.formals import SegmentSequence
import fints.formals, fints.segments
- s = SegmentSequence([fints.segments.message.HNHBK3(header=fints.formals.SegmentHeader('HNHBK', 1, 3), message_size='000000000428', hbci_version=300, dialogue_id='430711670077=043999659571CN9D=', message_number=2, reference_message=fints.formals.ReferenceMessage(dialogue_id='430711670077=043999659571CN9D=', message_number=2)), fints.segments.message.HNVSK3(header=fints.formals.SegmentHeader('HNVSK', 998, 3), security_profile=fints.formals.SecurityProfile(security_method='PIN', security_method_version=1), security_function='998', security_role='1', security_identification_details=fints.formals.SecurityIdentificationDetails(identified_role='2', cid=None, identifier='oIm3BlHv6mQBAADYgbPpp+kWrAQA'), security_datetime=fints.formals.SecurityDateTime(date_time_type='1'), encryption_algorithm=fints.formals.EncryptionAlgorithm(usage_encryption='2', operation_mode='2', encryption_algorithm='13', algorithm_parameter_value=b'00000000', algorithm_parameter_name='5', algorithm_parameter_iv_name='1'), key_name=fints.formals.KeyName(bank_identifier=fints.formals.BankIdentifier(country_identifier='280', bank_code='15050500'), user_id='hermes', key_type='S', key_number=0, key_version=0), compression_function='0'), fints.segments.message.HNVSD1(header=fints.formals.SegmentHeader('HNVSD', 999, 1), data=SegmentSequence([fints.segments.message.HNSHK4(header=fints.formals.SegmentHeader('HNSHK', 2, 4), security_profile=fints.formals.SecurityProfile(security_method='PIN', security_method_version=1), security_function='999', security_reference='9166926', security_application_area='1', security_role='1', security_identification_details=fints.formals.SecurityIdentificationDetails(identified_role='2', cid=None, identifier='oIm3BlHv6mQBAADYgbPpp+kWrAQA'), security_reference_number=1, security_datetime=fints.formals.SecurityDateTime(date_time_type='1'), hash_algorithm=fints.formals.HashAlgorithm(usage_hash='1', hash_algorithm='999', algorithm_parameter_name='1'), signature_algorithm=fints.formals.SignatureAlgorithm(usage_signature='6', signature_algorithm='10', operation_mode='16'), key_name=fints.formals.KeyName(bank_identifier=fints.formals.BankIdentifier(country_identifier='280', bank_code='15050500'), user_id='hermes', key_type='S', key_number=0, key_version=0)), fints.segments.HIRMG2(header=fints.formals.SegmentHeader('HIRMG', 3, 2), responses=[fints.formals.Response(code='0010', reference_element=None, text='Nachricht entgegengenommen.'), fints.formals.Response(code='0100', reference_element=None, text='Dialog beendet.')]), fints.segments.message.HNSHA2(header=fints.formals.SegmentHeader('HNSHA', 4, 2), security_reference='9166926')])), fints.segments.message.HNHBS1(header=fints.formals.SegmentHeader('HNHBS', 5, 1), message_number=2)])
+ s = SegmentSequence([fints.segments.message.HNHBK3(header=fints.formals.SegmentHeader('HNHBK', 1, 3), message_size='000000000428', hbci_version=300, dialogue_id='430711670077=043999659571CN9D=', message_number=2, reference_message=fints.formals.ReferenceMessage(dialogue_id='430711670077=043999659571CN9D=', message_number=2)), fints.segments.message.HNVSK3(header=fints.formals.SegmentHeader('HNVSK', 998, 3), security_profile=fints.formals.SecurityProfile(security_method='PIN', security_method_version=1), security_function='998', security_role='1', security_identification_details=fints.formals.SecurityIdentificationDetails(identified_role='2', cid=None, identifier='oIm3BlHv6mQBAADYgbPpp+kWrAQA'), security_datetime=fints.formals.SecurityDateTime(date_time_type='1'), encryption_algorithm=fints.formals.EncryptionAlgorithm(usage_encryption='2', operation_mode='2', encryption_algorithm='13', algorithm_parameter_value=b'00000000', algorithm_parameter_name='5', algorithm_parameter_iv_name='1'), key_name=fints.formals.KeyName(bank_identifier=fints.formals.BankIdentifier(country_identifier='280', bank_code='15050500'), user_id='hermes', key_type='S', key_number=0, key_version=0), compression_function='0'), fints.segments.message.HNVSD1(header=fints.formals.SegmentHeader('HNVSD', 999, 1), data=SegmentSequence([fints.segments.message.HNSHK4(header=fints.formals.SegmentHeader('HNSHK', 2, 4), security_profile=fints.formals.SecurityProfile(security_method='PIN', security_method_version=1), security_function='999', security_reference='9166926', security_application_area='1', security_role='1', security_identification_details=fints.formals.SecurityIdentificationDetails(identified_role='2', cid=None, identifier='oIm3BlHv6mQBAADYgbPpp+kWrAQA'), security_reference_number=1, security_datetime=fints.formals.SecurityDateTime(date_time_type='1'), hash_algorithm=fints.formals.HashAlgorithm(usage_hash='1', hash_algorithm='999', algorithm_parameter_name='1'), signature_algorithm=fints.formals.SignatureAlgorithm(usage_signature='6', signature_algorithm='10', operation_mode='16'), key_name=fints.formals.KeyName(bank_identifier=fints.formals.BankIdentifier(country_identifier='280', bank_code='15050500'), user_id='hermes', key_type='S', key_number=0, key_version=0)), fints.segments.dialog.HIRMG2(header=fints.formals.SegmentHeader('HIRMG', 3, 2), responses=[fints.formals.Response(code='0010', reference_element=None, text='Nachricht entgegengenommen.'), fints.formals.Response(code='0100', reference_element=None, text='Dialog beendet.')]), fints.segments.message.HNSHA2(header=fints.formals.SegmentHeader('HNSHA', 4, 2), security_reference='9166926')])), fints.segments.message.HNHBS1(header=fints.formals.SegmentHeader('HNHBS', 5, 1), message_number=2)])
assert FinTS3Serializer().serialize_message(s) == TEST_MESSAGES['basic_simple']
AlphanumericField, DataElementField, GenericField,
NumericField, SegmentHeader, SegmentSequence,
)
-from fints.segments import FinTS3Segment
+from fints.segments.base import FinTS3Segment
from fints.segments.message import HNHBK3, HNHBS1
assert a._fields['header']
def test_fints3_only_de_and_deg():
- from fints.formals import Field, Container, DataElementGroupField, ContainerField
+ from fints.formals import Field, Container, DataElementGroupField
with pytest.raises(TypeError, match="b=.* is not DataElementField or DataElementGroupField"):
class Foo(FinTS3Segment):
def test_nested_output_evalable():
import fints.segments, fints.formals
- a = SegmentSequence([fints.segments.message.HNHBK3(header=fints.formals.SegmentHeader('HNHBK', 1, 3, None), message_size='000000000428', hbci_version=300, dialogue_id='430711670077=043999659571CN9D=', message_number=2, reference_message=fints.formals.ReferenceMessage(dialogue_id='430711670077=043999659571CN9D=', message_number=2)), fints.segments.message.HNVSK3(header=fints.formals.SegmentHeader('HNVSK', 998, 3, None), security_profile=fints.formals.SecurityProfile(security_method='PIN', security_method_version=1), security_function='998', security_role='1', security_identification_details=fints.formals.SecurityIdentificationDetails(identified_role='2', cid=None, identifier='oIm3BlHv6mQBAADYgbPpp+kWrAQA'), security_datetime=fints.formals.SecurityDateTime(date_time_type='1', date=None, time=None), encryption_algorithm=fints.formals.EncryptionAlgorithm(usage_encryption='2', operation_mode='2', encryption_algorithm='13', algorithm_parameter_value=b'00000000', algorithm_parameter_name='5', algorithm_parameter_iv_name='1', algorithm_parameter_iv_value=None), key_name=fints.formals.KeyName(bank_identifier=fints.formals.BankIdentifier(country_identifier='280', bank_code='15050500'), user_id='hermes', key_type='S', key_number=0, key_version=0), compression_function='0', certificate=fints.formals.Certificate(certificate_type=None, certificate_content=None)), fints.segments.message.HNVSD1(header=fints.formals.SegmentHeader('HNVSD', 999, 1, None), data=SegmentSequence([fints.segments.message.HNSHK4(header=fints.formals.SegmentHeader('HNSHK', 2, 4, None), security_profile=fints.formals.SecurityProfile(security_method='PIN', security_method_version=1), security_function='999', security_reference='9166926', security_application_area='1', security_role='1', security_identification_details=fints.formals.SecurityIdentificationDetails(identified_role='2', cid=None, identifier='oIm3BlHv6mQBAADYgbPpp+kWrAQA'), security_reference_number=1, security_datetime=fints.formals.SecurityDateTime(date_time_type='1', date=None, time=None), hash_algorithm=fints.formals.HashAlgorithm(usage_hash='1', hash_algorithm='999', algorithm_parameter_name='1', algorithm_parameter_value=None), signature_algorithm=fints.formals.SignatureAlgorithm(usage_signature='6', signature_algorithm='10', operation_mode='16'), key_name=fints.formals.KeyName(bank_identifier=fints.formals.BankIdentifier(country_identifier='280', bank_code='15050500'), user_id='hermes', key_type='S', key_number=0, key_version=0), certificate=fints.formals.Certificate(certificate_type=None, certificate_content=None)), fints.segments.FinTS3Segment(header=fints.formals.SegmentHeader('HIRMG', 3, 2, None), _additional_data=[['0010', None, 'Nachricht entgegengenommen.'], ['0100', None, 'Dialog beendet.']]), fints.segments.FinTS3Segment(header=fints.formals.SegmentHeader('HNSHA', 4, 2, None), _additional_data=['9166926'])])), fints.segments.message.HNHBS1(header=fints.formals.SegmentHeader('HNHBS', 5, 1, None), message_number=2)])
+ a = SegmentSequence([fints.segments.message.HNHBK3(header=fints.formals.SegmentHeader('HNHBK', 1, 3, None), message_size='000000000428', hbci_version=300, dialogue_id='430711670077=043999659571CN9D=', message_number=2, reference_message=fints.formals.ReferenceMessage(dialogue_id='430711670077=043999659571CN9D=', message_number=2)), fints.segments.message.HNVSK3(header=fints.formals.SegmentHeader('HNVSK', 998, 3, None), security_profile=fints.formals.SecurityProfile(security_method='PIN', security_method_version=1), security_function='998', security_role='1', security_identification_details=fints.formals.SecurityIdentificationDetails(identified_role='2', cid=None, identifier='oIm3BlHv6mQBAADYgbPpp+kWrAQA'), security_datetime=fints.formals.SecurityDateTime(date_time_type='1', date=None, time=None), encryption_algorithm=fints.formals.EncryptionAlgorithm(usage_encryption='2', operation_mode='2', encryption_algorithm='13', algorithm_parameter_value=b'00000000', algorithm_parameter_name='5', algorithm_parameter_iv_name='1', algorithm_parameter_iv_value=None), key_name=fints.formals.KeyName(bank_identifier=fints.formals.BankIdentifier(country_identifier='280', bank_code='15050500'), user_id='hermes', key_type='S', key_number=0, key_version=0), compression_function='0', certificate=fints.formals.Certificate(certificate_type=None, certificate_content=None)), fints.segments.message.HNVSD1(header=fints.formals.SegmentHeader('HNVSD', 999, 1, None), data=SegmentSequence([fints.segments.message.HNSHK4(header=fints.formals.SegmentHeader('HNSHK', 2, 4, None), security_profile=fints.formals.SecurityProfile(security_method='PIN', security_method_version=1), security_function='999', security_reference='9166926', security_application_area='1', security_role='1', security_identification_details=fints.formals.SecurityIdentificationDetails(identified_role='2', cid=None, identifier='oIm3BlHv6mQBAADYgbPpp+kWrAQA'), security_reference_number=1, security_datetime=fints.formals.SecurityDateTime(date_time_type='1', date=None, time=None), hash_algorithm=fints.formals.HashAlgorithm(usage_hash='1', hash_algorithm='999', algorithm_parameter_name='1', algorithm_parameter_value=None), signature_algorithm=fints.formals.SignatureAlgorithm(usage_signature='6', signature_algorithm='10', operation_mode='16'), key_name=fints.formals.KeyName(bank_identifier=fints.formals.BankIdentifier(country_identifier='280', bank_code='15050500'), user_id='hermes', key_type='S', key_number=0, key_version=0), certificate=fints.formals.Certificate(certificate_type=None, certificate_content=None)), fints.segments.base.FinTS3Segment(header=fints.formals.SegmentHeader('HIRMG', 3, 2, None), _additional_data=[['0010', None, 'Nachricht entgegengenommen.'], ['0100', None, 'Dialog beendet.']]), fints.segments.base.FinTS3Segment(header=fints.formals.SegmentHeader('HNSHA', 4, 2, None), _additional_data=['9166926'])])), fints.segments.message.HNHBS1(header=fints.formals.SegmentHeader('HNHBS', 5, 1, None), message_number=2)])
output = StringIO()
a.print_nested(stream=output)