/* $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.util.Iterator; import java.util.List; import java.util.Properties; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import org.kapott.hbci.GV.HBCIJob; import org.kapott.hbci.GV_Result.GVRKUms; import org.kapott.hbci.GV_Result.GVRKUms.UmsLine; import org.kapott.hbci.callback.HBCICallback; import org.kapott.hbci.callback.HBCICallbackConsole; import org.kapott.hbci.callback.HBCICallbackUnsupported; import org.kapott.hbci.concurrent.DefaultHBCIPassportFactory; import org.kapott.hbci.concurrent.HBCIPassportFactory; import org.kapott.hbci.concurrent.HBCIRunnable; import org.kapott.hbci.concurrent.HBCIThreadFactory; 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.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>*/ public final class AnalyzeReportOfTransactions { private static class MyHBCICallback extends HBCICallbackConsole { public void callback(HBCIPassport passport,int reason,String msg,int dataType,StringBuffer retData) { System.out.println("Callback f�r folgendes Passport: "+passport.getClientData("init").toString()); 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/stefan.palme/temp/a.props"), new MyHBCICallback()); // Nutzer-Passport initialisieren Object passportDescription="Passport f�r Kontoauszugs-Demo"; passport=AbstractHBCIPassport.getInstance(passportDescription); try { // ein HBCI-Handle f�r einen Nutzer erzeugen String version=passport.getHBCIVersion(); hbciHandle=new HBCIHandler((version.length()!=0)?version:"plus",passport); // Kontoausz�ge auflisten analyzeReportOfTransactions(passport, hbciHandle); } finally { if (hbciHandle!=null) { hbciHandle.close(); } else if (passport!=null) { passport.close(); } } } public static void main_multithreaded(String[] args) throws Exception { // Da im main-Thread keine HBCI Aktionen laufen sollen, reicht es hier, die Umgebung // nur "notd�rftig" zu initialisieren. Leere Konfiguration, und keine Callback-Unterst�tzung. HBCIUtils.init(new Properties(), new HBCICallbackUnsupported()); // Die Verwendung der HBCIThreadFactory ist f�r die korrekte Funktionsweise von HBCI4Java zwingend erforderlich // (Alternativ m�sste manuell sichergestellt werden, dass jeder Thread in einer eigenen Thread-Gruppe l�uft.) ExecutorService executor = Executors.newCachedThreadPool(new HBCIThreadFactory()); // Einstellungen f�r die Aufgabe erstellen Properties properties = HBCIUtils.loadPropertiesFile(new FileSystemClassLoader(),"/home/stefan.palme/temp/a.props"); HBCICallback callback = new MyHBCICallback(); HBCIPassportFactory passportFactory = new DefaultHBCIPassportFactory((Object) "Passport f�r Kontoauszugs-Demo"); // Aufgabe implementieren. Die HBCIRunnable �bernimmt Initialisierung // und Schlie�en von Passport und Handler automatisch. Runnable runnable = new HBCIRunnable(properties, callback, passportFactory) { @Override protected void execute() throws Exception { // Kontoausz�ge auflisten analyzeReportOfTransactions(passport, handler); } }; // Aufgabe ausf�hren executor.submit(runnable); // Executor runterfahren und warten, bis alle Aufgaben fertig sind executor.shutdown(); while (!executor.isTerminated()) { executor.awaitTermination(1, TimeUnit.SECONDS); } // Haupt-Thread beenden HBCIUtils.done(); } private static void analyzeReportOfTransactions(HBCIPassport hbciPassport, HBCIHandler hbciHandle) { // auszuwertendes Konto automatisch ermitteln (das erste verf�gbare HBCI-Konto) Konto myaccount=hbciPassport.getAccounts()[0]; // 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(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()); } } }