]> git.ipfire.org Git - thirdparty/python-fints.git/commitdiff
Use sepaxml to generate PAIN message
authorRaphael Michel <mail@raphaelmichel.de>
Wed, 25 Jul 2018 13:09:06 +0000 (15:09 +0200)
committerRaphael Michel <mail@raphaelmichel.de>
Thu, 26 Jul 2018 20:27:05 +0000 (22:27 +0200)
fints/client.py
fints/segments/transfer.py
requirements.txt
setup.py

index a867ac3e24b8f87a2dccf433b5f2dd54e7263ee8..3212b2039d10af07efc51ea33d48b3e99d8187a2 100644 (file)
@@ -2,6 +2,8 @@ import logging
 import re
 import datetime
 
+from decimal import Decimal
+
 from .connection import FinTSHTTPSConnection
 from .dialog import FinTSDialog
 from .message import FinTSMessage
@@ -15,6 +17,7 @@ from .segments.transfer import HKCCS
 from .message import FinTSResponse
 from .utils import mt940_to_array, MT535_Miniparser, split_for_data_groups, split_for_data_elements, Password
 from mt940.models import Balance
+from sepaxml import SepaTransfer
 
 logger = logging.getLogger(__name__)
 
@@ -265,20 +268,40 @@ class FinTS3Client:
 
         return 'Ok'
 
-    def create_sepa_transfer(self, account, arg):
-        # Diese Funktion erstellt eine neue SEPA-Überweisung
-        self.tan_bezeichnung = arg['TAN-Bezeichnung']
+    def start_simple_sepa_transfer(self, account: SEPAAccount, tan_method, iban: str, bic: str, recipient_name: str,
+                                   amount: Decimal, account_name: str, reason: str, endtoend_id='NOTPROVIDED',
+                                   tan_description=''):
+        config = {
+            "name": account_name,
+            "IBAN": account.iban,
+            "BIC": account.bic,
+            "batch": False,
+            "currency": "EUR",
+        }
+        sepa = SepaTransfer(config, 'pain.001.001.03')
+        payment = {
+            "name": recipient_name,
+            "IBAN": iban,
+            "BIC": bic,
+            "amount": int(Decimal(amount) * 100),  # in cents
+            "execution_date": datetime.date.today(),
+            "description": reason,
+            "endtoend_id": endtoend_id,
+        }
+        sepa.add_payment(payment)
+        xml = sepa.export().decode()
+        self.start_sepa_transfer(account, xml, tan_method, tan_description)
+
+    def start_sepa_transfer(self, account: SEPAAccount, pain_message: str, tan_method, tan_description=''):
         dialog = self._new_dialog()
         dialog.sync()
 
-        # TAN-Verfahren für Dialoginitialisierung ändern
-        dialog.tan_mechs = [arg['TAN-Verfahren']]
-
+        dialog.tan_mechs = [tan_method.security_feature]
         dialog.init()
 
         def _get_msg():
-            segHKCCS = HKCCS(3, account, arg)
-            segHKTAN = HKTAN(4, 4, '', self.tan_bezeichnung)
+            segHKCCS = HKCCS(3, account, pain_message)
+            segHKTAN = HKTAN(4, 4, '', tan_description)
             return self._new_message(dialog, [
                 segHKCCS,
                 segHKTAN
@@ -293,7 +316,6 @@ class FinTS3Client:
         response = {}
         response['response'] = resp
         response['dialog'] = dialog
-
         return response
 
     def get_tan_methods(self):
index e839ed3e1e60e7b131b82100c5b8a4360cd8999e..fe17bbb299949b9af65383468744ed9f907d9327 100644 (file)
@@ -1,5 +1,5 @@
 from . import FinTS3Segment
-import datetime
+from ..models import SEPAAccount
 
 
 class HKCCS(FinTS3Segment):
@@ -9,10 +9,9 @@ class HKCCS(FinTS3Segment):
     """
     type = 'HKCCS'
 
-    def __init__(self, segno, account, arg):
+    def __init__(self, segno, account: SEPAAccount, pain_msg):
         self.version = 1
         sepa_descriptor = 'urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.001.001.03'
-        pain_msg = self.create_pain(account, arg)
         msg = ':'.join([
             account.iban,
             account.bic
@@ -23,40 +22,3 @@ class HKCCS(FinTS3Segment):
             '@{}@{}'.format(len(pain_msg), pain_msg)
         ]
         super().__init__(segno, data)
-
-    def create_pain(self, account, arg):
-        pain = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>'
-        pain += '<Document xmlns="urn:iso:std:iso:20022:tech:xsd:pain.001.001.03" ' \
-                'xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ' \
-                'xsi:schemaLocation="urn:iso:std:iso:20022:tech:xsd:pain.001.001.03 pain.001.001.03.xsd">'
-        pain += '<CstmrCdtTrfInitn>'
-        pain += '<GrpHdr>'
-        pain += '<MsgId>' + datetime.datetime.now().isoformat()[:-2] + '</MsgId>'
-        pain += '<CreDtTm>' + datetime.datetime.now().replace(microsecond=0).isoformat() + '</CreDtTm>'
-        pain += '<NbOfTxs>1</NbOfTxs>'
-        pain += '<CtrlSum>' + arg['CtrlSum'] + '</CtrlSum>'
-        pain += '<InitgPty><Nm>' + arg['Nm'] + '</Nm></InitgPty>'
-        pain += '</GrpHdr>'
-        pain += '<PmtInf>'
-        pain += '<PmtInfId>' + datetime.datetime.now().isoformat()[:-2] + '</PmtInfId>'
-        pain += '<PmtMtd>TRF</PmtMtd><NbOfTxs>1</NbOfTxs>'
-        pain += '<CtrlSum>' + arg['CtrlSum'] + '</CtrlSum>'
-        pain += '<PmtTpInf><SvcLvl><Cd>SEPA</Cd></SvcLvl></PmtTpInf>'
-        pain += '<ReqdExctnDt>1999-01-01</ReqdExctnDt>'
-        pain += '<Dbtr><Nm>' + arg['Nm'] + '</Nm></Dbtr>'
-        pain += '<DbtrAcct><Id><IBAN>' + account.iban + '</IBAN></Id></DbtrAcct>'
-        pain += '<DbtrAgt><FinInstnId><BIC>' + account.bic + '</BIC></FinInstnId></DbtrAgt>'
-        pain += '<ChrgBr>SLEV</ChrgBr>'
-        pain += '<CdtTrfTxInf>'
-        pain += '<PmtId><EndToEndId>NOTPROVIDED</EndToEndId></PmtId>'
-        pain += '<Amt><InstdAmt Ccy="EUR">' + arg['CtrlSum'] + '</InstdAmt></Amt>'
-        pain += '<CdtrAgt><FinInstnId><BIC>' + arg['DbtrAgt'] + '</BIC></FinInstnId></CdtrAgt>'
-        pain += '<Cdtr><Nm>' + arg['Nm'] + '</Nm></Cdtr>'
-        pain += '<CdtrAcct><Id><IBAN>' + arg['DbtrAcct'] + '</IBAN></Id></CdtrAcct>'
-        pain += '<RmtInf><Ustrd>' + arg['Ustrd'] + '</Ustrd></RmtInf>'
-        pain += '</CdtTrfTxInf>'
-        pain += '</PmtInf>'
-        pain += '</CstmrCdtTrfInitn>'
-        pain += '</Document>'
-
-        return pain
index 3b33fbc473554584987fbcb14211b5ab3d9b6b6c..b562c2e15069fe9d8c8e7be7b787d80ad5e6850d 100644 (file)
@@ -1,3 +1,3 @@
 requests
 mt-940
-
+sepaxml==2.0.*
index e48a5748949c8a2605b6f9c8db2706de76ba9644..9cb98462726223ca3a229fe161db8bc2793e3bb5 100644 (file)
--- a/setup.py
+++ b/setup.py
@@ -35,7 +35,7 @@ setup(
 
     keywords='hbci banking fints',
     install_requires=[
-        'requests', 'mt-940',
+        'requests', 'mt-940', 'sepaxml==2.0.*'
     ],
 
     packages=find_packages(include=['fints', 'fints.*']),