/**********************************************************************
* $Source: /cvsroot/hibiscus/hbci4java/test/hbci4java/ddv/PCSCTest.java,v $
* $Revision: 1.1 $
* $Date: 2011/11/24 21:59:37 $
* $Author: willuhn $
*
* Copyright (c) by willuhn - software & services
* All rights reserved
*
**********************************************************************/
package hbci4java.sepa;
import hbci4java.AbstractTest;
import java.io.File;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Properties;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.kapott.hbci.GV.HBCIJobImpl;
import org.kapott.hbci.callback.HBCICallback;
import org.kapott.hbci.callback.HBCICallbackConsole;
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.passport.HBCIPassportPinTan;
import org.kapott.hbci.protocol.SEG;
import org.kapott.hbci.structures.Value;
/**
* Testet das Erstellen von SEPA-Basis-Lastschriften
Folgende Angaben sind f�r das Nachrichtenformat f�r SEPA-Lastschriften (pain.008) erforderlich:
- Art des Verfahrens (Basis- oder Firmen-Lastschrift, <LclInstrm>)
- Art der Lastschrift (einmalige, erste, wieder-kehrende, letzte Lastschrift,
<SeqTp>)
- Name des Zahlungsempf�ngers (<Cdtr><Nm>)
- Gl�ubiger-Identifikationsnummer des Zahlungsempf�ngers (<CdtrSchmeId>)
- IBAN des Zahlungskontos des Zahlungsempf�ngers, auf dem die Gutschrift
vorgenommen werden soll (<CdtrAcct>)
- BIC des Kreditinstituts des Zahlungsempf�ngers (<CdtrAgt>)
- Name des Zahlungspflichtigen (<Dbtr><Nm>)
- IBAN des Zahlungskontos des Zahlungspflichtigen (<DbtrAcct>)
- BIC des Kreditinstituts des Zahlungspflichtigen (<DbtrAgt>)
- Eindeutige Mandatsreferenz (<MndtId>)
- Datum der Unterschrift des SEPA-Lastschriftmandats, sofern dieses vom Zahlungspflichtigen erteilt wird, bzw. Datum der Mitteilung �ber die Weiternutzung einer Einzugserm�chtigung (<DtOfSgntr>)
- H�he des Einzugsbetrags (<InstdAmt>)
- Angaben zum Verwendungszweck (<RmtInf>)
- Name der Referenzpartei des Zahlungspflichtigen (falls im SEPALastschriftmandat vorhanden, <UltmtDbtr>)
- Identifikationscode der Referenzpartei des Zahlungspflichtigen
(falls im SEPA-Lastschriftmandat vorhanden, <Dbtr><Id>)
- F�lligkeitsdatum des Einzugs (<ReqdColltnDt>)
*/
public class TestGVLastSEPA extends AbstractTest
{
private final static int LOGLEVEL = HBCIUtils.LOG_INFO;
private final static Map<Integer,String> settings = new HashMap<Integer,String>()
{{
// Demo-Konto bei der ApoBank
put(HBCICallback.NEED_COUNTRY, "DE");
put(HBCICallback.NEED_BLZ, "30060601");
put(HBCICallback.NEED_CUSTOMERID, "0001956434");
put(HBCICallback.NEED_FILTER, "Base64");
put(HBCICallback.NEED_HOST, "hbcibanking.apobank.de/fints_pintan/receiver");
put(HBCICallback.NEED_PASSPHRASE_LOAD, "test");
put(HBCICallback.NEED_PASSPHRASE_SAVE, "test");
put(HBCICallback.NEED_PORT, "443");
put(HBCICallback.NEED_PT_PIN, "11111");
put(HBCICallback.NEED_PT_TAN, "123456"); // hier geht jede 6-stellige Zahl
put(HBCICallback.NEED_USERID, "0001956434");
put(HBCICallback.NEED_PT_SECMECH, "900"); // wird IMHO nicht benoetigt, weil es beim Demo-Account eh nur dieses eine Verfahren gibt
put(HBCICallback.NEED_CONNECTION, ""); // ignorieren
put(HBCICallback.CLOSE_CONNECTION, ""); // ignorieren
}};
private static File dir = null;
private HBCIPassportPinTan passport = null;
private HBCIHandler handler = null;
/**
* Testet das Erstellen einer SEPA-Basis-Lastschrift.
* @throws Exception
*/
@Test
public void test001() throws Exception
{
HBCIJobImpl job = (HBCIJobImpl) handler.newJob("Ueb");
// wir nehmen einfach das erste verfuegbare Konto
job.setParam("src",passport.getAccounts()[0]);
job.setParam("dst",passport.getAccounts()[0]);
job.setParam("btg",new Value(1L,"EUR"));
job.setParam("usage","test");
job.setParam("name","test");
job.setParam("key","51");
job.addToQueue();
SEG seg = job.createJobSegment(0);
seg.validate();
String msg = seg.toString(0);
Assert.assertEquals("HKUEB:0:5+0001956434:EUR:280:30060601+0001956434:EUR:280:30060601+TEST++0,01:EUR+51++TEST'",msg);
}
/**
* Erzeugt das Passport-Objekt.
* @throws Exception
*/
@Before
public void beforeTest() throws Exception
{
Properties props = new Properties();
props.put("log.loglevel.default",Integer.toString(LOGLEVEL));
props.put("infoPoint.enabled",Boolean.FALSE.toString());
props.put("client.passport.PinTan.filename",dir.getAbsolutePath() + File.separator + System.currentTimeMillis() + ".pt");
props.put("client.passport.PinTan.init","1");
props.put("client.passport.PinTan.checkcert","0"); // Check der SSL-Zertifikate abschalten - brauchen wir nicht fuer den Test
// falls noetig
props.put("client.passport.PinTan.proxy",""); // host:port
props.put("client.passport.PinTan.proxyuser","");
props.put("client.passport.PinTan.proxypass","");
HBCICallback callback = new HBCICallbackConsole()
{
public void callback(HBCIPassport passport, int reason, String msg, int datatype, StringBuffer retData)
{
// haben wir einen vordefinierten Wert?
String value = settings.get(reason);
if (value != null)
{
retData.replace(0,retData.length(),value);
return;
}
// Ne, dann an Super-Klasse delegieren
super.callback(passport, reason, msg, datatype, retData);
}
};
HBCIUtils.init(props,callback);
this.passport = (HBCIPassportPinTan) AbstractHBCIPassport.getInstance("PinTan");
// init handler
this.handler = new HBCIHandler("300",passport);
// dump bpd
// this.dump("BPD",this.passport.getBPD());
// Liste der unterstuetzten Geschaeftsvorfaelle ausgeben
// this.dump("Supported GV",this.handler.getSupportedLowlevelJobs());
}
/**
* Schliesst das Passport-Objekt und loescht die Passport-Datei.
* @throws Exception
*/
@After
public void afterTest() throws Exception
{
try
{
if (this.passport != null)
this.passport.close();
File file = new File(this.passport.getFileName());
if (!file.delete())
throw new Exception("unable to delete " + file);
}
finally
{
try
{
if (this.handler != null)
this.handler.close();
}
finally
{
HBCIUtils.done();
}
}
}
/**
* Erzeugt das Passport-Verzeichnis.
* @throws Exception
*/
@BeforeClass
public static void beforeClass() throws Exception
{
String tmpDir = System.getProperty("java.io.tmpdir","/tmp");
dir = new File(tmpDir,"hbci4java-junit-" + System.currentTimeMillis());
dir.mkdirs();
}
/**
* Loescht das Passport-Verzeichnis.
* @throws Exception
*/
@AfterClass
public static void afterClass() throws Exception
{
if (!dir.delete())
throw new Exception("unable to delete " + dir);
}
private void dump(String name, Properties props)
{
System.out.println("--- BEGIN: " + name + " -----");
Iterator keys = props.keySet().iterator();
while (keys.hasNext())
{
Object key = keys.next();
System.out.println(key + ": " + props.get(key));
}
System.out.println("--- END: " + name + " -----");
}
}