/* $Id: AnalyzeReportOfTransactions.java,v 1.1 2011/05/04 22:37:45 willuhn Exp $ This file is part of HBCI4Java Copyright (C) 2001-2008 Stefan Palme HBCI4Java is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. HBCI4Java is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package org.kapott.hbci.tools; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.io.InputStreamReader; import org.kapott.hbci.GV.GVWPDepotUms; import org.kapott.hbci.GV.HBCIJob; import org.kapott.hbci.GV_Result.GVRKUms; import org.kapott.hbci.GV_Result.GVRWPDepotList; import org.kapott.hbci.GV_Result.GVRWPDepotUms; import org.kapott.hbci.callback.HBCICallback; import org.kapott.hbci.callback.HBCICallbackConsole; import org.kapott.hbci.manager.FileSystemClassLoader; import org.kapott.hbci.manager.HBCIHandler; import org.kapott.hbci.manager.HBCIUtils; import org.kapott.hbci.passport.AbstractHBCIPassport; import org.kapott.hbci.passport.HBCIPassport; import org.kapott.hbci.status.HBCIExecStatus; import org.kapott.hbci.status.HBCIMsgStatus; import org.kapott.hbci.structures.Konto; /** <p>Tool zum Abholen und Auswerten von Kontoausz�gen, gleichzeitig Beispielprogramm f�r die Verwendung von <em>HBCI4Java</em>. Dieses Tool sollte nicht out-of-the-box benutzt werden, da erst einige Anpassungen im Quelltext vorgenommen werden m�ssen. Es dient eher als Vorlage, wie <em>HBCI4Java</em> im konkreten Anwendungsfall eingesetzt werden kann.</p> <p>Die Methode {@link #main(String[])} zeigt die Verwendung mit einem einzelnen Haupt- Thread. die Methode {@link #main_multithreaded(String[])} skizziert die Implementierung f�r Anwendungen mit mehreren Threads.</p> <p>Im Quelltext m�ssen folgende Stellen angepasst werden:</p> <ul> <li><p>Beim Aufruf der Methode <code>HBCIUtils.init()</code> wird der Name eines Property-Files angegeben, in welchem alle ben�tigten Kernel-Parameter aufgelistet sind. Diese Datei muss erst erzeugt (Kopieren und Anpassen von <code>hbci.props.template</code>) und der Dateiname beim Aufruf angepasst werden.</p></li> <li><p>Zum Festlegen des abzufragenden Kontos wird zurzeit automatisch das erste Konto benutzt, auf welches �ber HBCI zugegriffen werden kann. Ist diese Information nicht verf�gbar (einige Banken senden keine Informationen �ber die verf�gbaren Konten), oder soll eine andere Kontoverbindung benutzt werden, so sind entsprechende �nderungen bei der Initialisierung der Variablen <code>myaccount</code> vorzunehmen.</p></li> <li><p>Soll der Kontoauszug nur ab einem bestimmten Zeitpunkt (und nicht alle verf�gbaren Daten) abgeholt werden, so ist beim Erzeugen des entsprechenden Auftrages das Startdatum einzustellen (im Quelltext zur Zeit auskommentiert).</p></li> <li><p>Au�erdem ist im Quelltext Code zur eigentlichen Auswertung der Ausz�ge zu implementieren. In dieser Vorlage wird nur nach einer fest codierten Rechnungsnummer im Verwendungszweck gesucht. Der entsprechende Abschnitt im Quelltext ist den eigenen Bed�rfnissen anzupassen.</p></li> </ul> <p>Anschlie�end kann der Quelltext compiliert und mit <pre>java -cp ... org.kapott.hbci.tools.AnalyzeReportOfTransactions</pre> gestartet werden.</p> <p>Der Quellcode dieser Klasse zeigt die prinzipielle Benutzung von <em>HBCI4Java</em>. Wurde der HBCI-Zugang, der mit diesem Programm benutzt werden soll, noch nie verwendet, so werden alle ben�tigten Schritte zur Initialisierung der Zugangsdaten und Sicherheitsmedien automatisch von <em>HBCI4Java</em> durchgef�hrt. Es ist nicht n�tigt, f�r die Initialisierung von "frischen" Sicherheitsmedien speziellen Code in die HBCI-Anwendung einzubauen -- die entsprechenden Aktionen werden automatisch und v�llig transparent von <em>HBCI4Java</em> durchgef�hrt. Das hat den Vorteil, dass jede beliebige Anwendung, die <em>HBCI4Java</em> als HBCI-Bibliothek benutzt, gleichzeitig zum Initialisieren von HBCI-Sicherheitsmedien benutzt werden kann, ohne dass daf�r spezieller Programmcode n�tig w�re. Au�erdem wird dadurch sichergestellt, dass nur initialisierte und funktionierende HBCI-Sicherheitsmedien benutzt werden (weil <em>HBCI4Java</em> beim Laden eines Sicherheitsmediums automatisch entsprechende �berpr�fungen vornimmt).</p>*/ // Angepasste Version von AnalyzeReportOfTransactions // Kurzanleitung: // 1. .properties-Datei erstellen mit folgendem Inhalt: // //# -- Beginn //client.passport.default=PinTan //default.hbciversion=300 //log.loglevel.default=2 // //client.passport.PinTan.filename=/home/jonas/java/hbci/pintan_hbci4java.test // //# client.passport.PinTan.certfile=hbcicerts.bin //client.passport.PinTan.checkcert=1 //# client.passport.PinTan.proxy=proxy.intern.domain.com:3128 //client.passport.PinTan.init=1 //# --Ende // // Anzupassen ist nur client.passport.PinTan.filename // Diese Datei muss nicht existieren, sondern wird beim ersten Start angelegt. Dort fragt HBCI4Java dann auch // automatisch die ganzen Informationen zur Verbindung ab (BLZ, Benutzername, usw.) // // 2. Unten im Source Code "/home/jonas/java/hbci/jw.hbci4java.properties" durch den Pfad zu dieser .properties-Datei ersetzen public final class DepotAbrufTest { private static class MyHBCICallback extends HBCICallbackConsole { public void callback(HBCIPassport passport,int reason,String msg,int dataType,StringBuffer retData) { if (reason == HBCICallback.CLOSE_CONNECTION || reason == HBCICallback.NEED_CONNECTION) return; System.out.println("Callback f�r folgendes Passport: "+passport.getClientData("init").toString() + ", reason=" + reason); super.callback(passport,reason,msg,dataType,retData); } } public static void main(String[] args) throws Exception { // HBCI Objekte HBCIPassport passport = null; HBCIHandler hbciHandle = null; // HBCI4Java initialisieren HBCIUtils.init(HBCIUtils.loadPropertiesFile(new FileSystemClassLoader(),"/home/jonas/java/hbci/jw.hbci4java.properties"), new MyHBCICallback()); // Nutzer-Passport initialisieren Object passportDescription="Passport f�r Kontoauszugs-Demo"; passport=AbstractHBCIPassport.getInstance(passportDescription); //passport.clearBPD(); try { // ein HBCI-Handle f�r einen Nutzer erzeugen String version=passport.getHBCIVersion(); //hbciHandle=new HBCIHandler("300", passport); hbciHandle=new HBCIHandler((version.length()!=0)?version:"plus",passport); System.out.println("Alle Gesch�ftsvorf�lle in HBCI4Java: " + hbciHandle.getKernel().getAllLowlevelJobs().toString()); System.out.println("Unterst�tzte Gesch�ftsvorf�lle der Bank: " + hbciHandle.getSupportedLowlevelJobs().toString()); //"Trockentest" des Umsatzparsers mit vorgebenen Daten //test_ums(hbciHandle, "/home/jonas/java/hbci/msg536.txt"); //test_ums(hbciHandle, "/home/jonas/java/hbci/msg536_hbci-zka.txt"); //Konten ausgeben System.out.println("Kontenliste:"); System.out.println("------------"); Konto[] konten = passport.getAccounts(); for (int i=0; i<konten.length; i++) { System.out.println("Konto " + i + ": " + konten[i]); } BufferedReader rd = new BufferedReader(new InputStreamReader(System.in)); String line; int umsatzkto=-1, depotkto=-1; System.out.print("Bitte Konto f�r Umsatzliste eingeben (-1, um zu �berspringen): "); do { line = rd.readLine(); try { umsatzkto = Integer.parseInt(line); if (umsatzkto >= -1 && umsatzkto < konten.length) { break; } else { System.out.println("Ung�ltiges Konto: " + line); } } catch (Exception e) { e.printStackTrace(); } } while (line != null); System.out.print("Bitte Konto f�r Depotliste eingeben (-1, um zu �berspringen): "); do { line = rd.readLine(); try { depotkto = Integer.parseInt(line); if (depotkto >= -1 && depotkto < konten.length) { break; } else { System.out.println("Ung�ltiges Konto: " + line); } } catch (Exception e) { e.printStackTrace(); } } while (line != null); // Ums�tze auflisten (als Demo, dass es grunds�tzlich funktioniert) if (umsatzkto >= 0) analyzeReportOfTransactions(passport, hbciHandle, konten[umsatzkto]); // Depotinhalt auflisten if (depotkto >= 0) analyzeDepot(passport, hbciHandle, konten[depotkto]); } finally { if (hbciHandle!=null) { hbciHandle.close(); } else if (passport!=null) { passport.close(); } } } private static void analyzeReportOfTransactions(HBCIPassport hbciPassport, HBCIHandler hbciHandle, Konto myaccount) { // auszuwertendes Konto automatisch ermitteln (das erste verf�gbare HBCI-Konto) // wenn der obige Aufruf nicht funktioniert, muss die abzufragende // Kontoverbindung manuell gesetzt werden: // Konto myaccount=new Konto("DE","86055592","1234567890"); // Job zur Abholung der Kontoausz�ge erzeugen HBCIJob auszug=hbciHandle.newJob("KUmsAll"); auszug.setParam("my",myaccount); // evtl. Datum setzen, ab welchem die Ausz�ge geholt werden sollen // job.setParam("startdate","21.5.2003"); auszug.addToQueue(); // alle Jobs in der Job-Warteschlange ausf�hren HBCIExecStatus ret=hbciHandle.execute(); GVRKUms result=(GVRKUms)auszug.getJobResult(); // wenn der Job "Kontoausz�ge abholen" erfolgreich ausgef�hrt wurde if (result.isOK()) { // kompletten kontoauszug als string ausgeben: System.out.println("##############################"); System.out.println("##### Umsatzliste #######"); System.out.println("##############################"); System.out.println(result.toString()); // // kontoauszug durchlaufen, jeden eintrag einmal anfassen: // // List<UmsLine> lines=result.getFlatData(); // // int numof_lines=lines.size(); // // for (Iterator<UmsLine> j=lines.iterator(); j.hasNext(); ) { // alle Umsatzeintr�ge durchlaufen // UmsLine entry= j.next(); // // // f�r jeden Eintrag ein Feld mit allen Verwendungszweckzeilen extrahieren // List<String> usages=entry.usage; // // int numof_usagelines=usages.size(); // // for (Iterator<String> k=usages.iterator(); k.hasNext(); ) { // alle Verwendungszweckzeilen durchlaufen // String usageline= k.next(); // // // ist eine bestimmte Rechnungsnummer gefunden (oder welche // // Kriterien hier auch immer anzuwenden sind), ... // if (usageline.equals("Rechnung 12345")) { // // hier diesen Umsatzeintrag (<entry>) auswerten // // // entry.bdate enth�lt Buchungsdatum // // entry.value enth�lt gebuchten Betrag // // entry.usage enth�lt die Verwendungszweck-zeilen // // mehr Informationen sie Dokumentation zu // // org.kapott.hbci.GV_Result.GVRKUms // } // } // } } else { // Fehlermeldungen ausgeben System.out.println("Job-Error"); System.out.println(result.getJobStatus().getErrorString()); System.out.println("Global Error"); System.out.println(ret.getErrorString()); } } private static void analyzeDepot(HBCIPassport hbciPassport, HBCIHandler hbciHandle, Konto myaccount) { myaccount.curr = null; // Job zur Abholung des Depotbestands erzeugen HBCIJob auszug=hbciHandle.newJob("WPDepotList"); auszug.setParam("my",myaccount); auszug.addToQueue(); // alle Jobs in der Job-Warteschlange ausf�hren HBCIExecStatus ret=hbciHandle.execute(); GVRWPDepotList result=(GVRWPDepotList)auszug.getJobResult(); // wenn der Job "Depotbestand abholen" erfolgreich ausgef�hrt wurde if (result.isOK()) { // kompletten Depotbestand als string ausgeben: System.out.println("##############################"); System.out.println("##### Depotliste #######"); System.out.println("##############################"); System.out.println(result.toString()); } else { // Fehlermeldungen ausgeben System.out.println("Job-Error"); System.out.println(result.getJobStatus().getErrorString()); System.out.println("Global Error"); System.out.println(ret.getErrorString()); } // Pr�fen, ob Depotumsatzabruf unterst�tzt wird if (!hbciHandle.getSupportedLowlevelJobs().containsKey("WPDepotUms")) { System.out.println("Abruf der Depotums�tze nicht unterst�tzt!"); } else { // Job zur Abholung der Depotums�tze erzeugen HBCIJob ums=hbciHandle.newJob("WPDepotUms"); ums.setParam("my",myaccount); // evtl. Datum setzen, ab welchem die Ums�tze geholt werden sollen // job.setParam("startdate","21.5.2003"); ums.addToQueue(); // alle Jobs in der Job-Warteschlange ausf�hren ret=hbciHandle.execute(); GVRWPDepotUms umsRes =(GVRWPDepotUms)ums.getJobResult(); // wenn der Job "Depotums�tze abholen" erfolgreich ausgef�hrt wurde if (umsRes.isOK()) { // komplette Depotums�tze als string ausgeben: System.out.println("################################"); System.out.println("##### Depotums�tze #######"); System.out.println("################################"); System.out.println(umsRes.toString()); } else { // Fehlermeldungen ausgeben System.out.println("Job-Error"); System.out.println(umsRes.getJobStatus().getErrorString()); System.out.println("Global Error"); System.out.println(ret.getErrorString()); } } } // Testcode f�r Beispielumsatzdaten, die aus einer Textdatei gelesen werden private static class MyGVUms extends GVWPDepotUms { public MyGVUms(HBCIHandler handler) { super(handler); // TODO Auto-generated constructor stub } public GVRWPDepotUms myExtract(String testdata) { HBCIMsgStatus stat = new HBCIMsgStatus(); stat.getData().put("foo.data536", testdata); extractResults(stat, "foo", 0); return (GVRWPDepotUms)jobResult; } } private static void test_ums(HBCIHandler hbciHandle, String fileName) { try { MyGVUms test = new MyGVUms(hbciHandle); FileReader rd=new FileReader(fileName); StringBuilder res = new StringBuilder(); char[] buf = new char[4000]; int sz; while ((sz=rd.read(buf)) >= 0) { res.append(buf, 0, sz); } rd.close(); System.out.println(test.myExtract(res.toString())); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }