From: Christian Meißner Date: Mon, 9 Jan 2017 22:51:08 +0000 (+0100) Subject: Add basic account balance request X-Git-Tag: v0.2.0~3^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=cef7b27b696c03cd6abf159f63f052fb84b4e865;p=thirdparty%2Fpython-fints.git Add basic account balance request --- diff --git a/fints/client.py b/fints/client.py index 4070e5c..671af70 100644 --- a/fints/client.py +++ b/fints/client.py @@ -1,13 +1,17 @@ import logging import re +import datetime from .connection import FinTSHTTPSConnection from .dialog import FinTSDialog from .message import FinTSMessage from .models import SEPAAccount +from .models import Saldo from .segments.accounts import HKSPA from .segments.statement import HKKAZ +from .segments.saldo import HKSAL from .utils import mt940_to_array +from mt940.models import Balance logger = logging.getLogger(__name__) @@ -113,7 +117,52 @@ class FinTS3Client: ) ]) + def get_balance(self, account): + # init dialog + dialog = self._new_dialog() + dialog.sync() + dialog.init() + + # execute job + msg = self._create_balance_message(dialog, account) + logger.debug('Sending HKSAL: {}'.format(msg)) + resp = dialog.send(msg) + logger.debug('Got HKSAL response: {}'.format(resp)) + + # end dialog + dialog.end() + + # find segment and split up to balance part + seg = resp._find_segment('HISAL') + arr = seg.split('+')[4].split(':') + + # get balance date + date = datetime.datetime.strptime(arr[3], "%Y%m%d").date() + + # return balance + return Balance(arr[0], arr[1], date, currency=arr[2]) + + def _create_balance_message(self, dialog: FinTSDialog, account: SEPAAccount): + hversion = dialog.hksalversion + + if hversion in (1, 2, 3, 4, 5, 6): + acc = ':'.join([ + account.accountnumber, account.subaccount, str(280), account.blz + ]) + elif hversion == 7: + acc = ':'.join([ + account.iban, account.bic, account.accountnumber, account.subaccount, str(280), account.blz + ]) + else: + raise ValueError('Unsupported HKSAL version {}'.format(hversion)) + return self._new_message(dialog, [ + HKSAL( + 3, + hversion, + acc + ) + ]) class FinTS3PinTanClient(FinTS3Client): def __init__(self, blz, username, pin, server): diff --git a/fints/models.py b/fints/models.py index 2c21878..f2ebc69 100644 --- a/fints/models.py +++ b/fints/models.py @@ -1,3 +1,5 @@ from collections import namedtuple SEPAAccount = namedtuple('SEPAAccount', 'iban bic accountnumber subaccount blz') + +Saldo = namedtuple('Saldo', 'account date value currency') diff --git a/fints/segments/saldo.py b/fints/segments/saldo.py new file mode 100644 index 0000000..76ef8e1 --- /dev/null +++ b/fints/segments/saldo.py @@ -0,0 +1,16 @@ +from . import FinTS3Segment + +class HKSAL(FinTS3Segment): + """ + HKSAL (Konto Saldo anfordern) + Section C.2.1.2 + """ + type = 'HKSAL' + + def __init__(self, segno, version, account): + self.version = version + data = [ + account, + 'N' + ] + super().__init__(segno, data)