org.kapott.hbci.GV.GVWPDepotUms Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of hbci4j-adorsys Show documentation
Show all versions of hbci4j-adorsys Show documentation
HBCI4j - Home Banking Computer Interface for Java - Clone from https://github.com/hbci4j/hbci4java
/* $Id: GVWPDepotUms.java 62 2008-10-22 17:03:26Z kleiner $
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.GV;
import org.kapott.hbci.GV_Result.GVRWPDepotUms;
import org.kapott.hbci.GV_Result.GVRWPDepotUms.Entry.FinancialInstrument;
import org.kapott.hbci.GV_Result.GVRWPDepotUms.Entry.FinancialInstrument.Transaction;
import org.kapott.hbci.exceptions.HBCI_Exception;
import org.kapott.hbci.passport.HBCIPassportInternal;
import org.kapott.hbci.status.HBCIMsgStatus;
import org.kapott.hbci.structures.BigDecimalValue;
import org.kapott.hbci.structures.Konto;
import org.kapott.hbci.structures.TypedValue;
import org.kapott.hbci.swift.Swift;
import java.text.SimpleDateFormat;
import java.util.HashMap;
public class GVWPDepotUms extends AbstractHBCIJob {
private StringBuilder buffer;
public GVWPDepotUms(HBCIPassportInternal passport) {
super(passport, getLowlevelName(), new GVRWPDepotUms(passport));
this.buffer = new StringBuilder();
addConstraint("my.number", "Depot.number", null);
addConstraint("my.subnumber", "Depot.subnumber", "");
addConstraint("my.country", "Depot.KIK.country", passport.getUPD().get("KInfo.KTV.KIK.country"));
addConstraint("my.blz", "Depot.KIK.blz", passport.getUPD().get("KInfo.KTV.KIK.blz"));
//addConstraint("my.curr","curr",passport.getUPD().getProperty("KInfo.cur",""));
addConstraint("quality", "quality", "");
addConstraint("maxentries", "maxentries", "");
addConstraint("startdate", "startdate", "");
addConstraint("enddate", "enddate", "");
addConstraint("dummy", "alldepots", "N");
}
public static String getLowlevelName() {
return "WPDepotUms";
}
private TypedValue parseTypedValue(String st) {
String st_type = st.substring(7, 11);
String curr = "";
boolean withCurr = false;
int saldo_type = -1;
if (st_type.equals("FAMT")) {
saldo_type = TypedValue.TYPE_WERT;
} else if (st_type.equals("ACTU")) {
saldo_type = TypedValue.TYPE_WERT;
withCurr = true;
} else if (st_type.equals("UNIT")) {
saldo_type = TypedValue.TYPE_STCK;
} else if (st_type.equals("PRCT")) {
saldo_type = TypedValue.TYPE_PROZENT;
}
int pos1 = 12;
boolean neg = (st.charAt(pos1) == 'N');
if (neg)
pos1++;
if (withCurr) {
curr = st.substring(pos1, pos1 + 3);
pos1 += 3;
}
return new TypedValue(
(neg ? "-" : "") + st.substring(pos1).replace(',', '.'),
curr,
saldo_type);
}
protected void extractResults(HBCIMsgStatus msgstatus, String header, int idx) {
HashMap result = msgstatus.getData();
buffer.append(Swift.decodeUmlauts(result.get(header + ".data536")));
final SimpleDateFormat date_time_format = new SimpleDateFormat("yyyyMMdd hhmmss");
final SimpleDateFormat date_only_format = new SimpleDateFormat("yyyyMMdd");
while (buffer.length() != 0) {
try {
String onerecord = Swift.getOneBlock(buffer);
GVRWPDepotUms.Entry entry = new GVRWPDepotUms.Entry();
String st_timestamp = null;
String st_date = null;
String st_time = null;
char option = 'C';
int i = 0;
while (true) {
//Parse allgemeine Informationen (Mandatory Sequence A General Information)
st_timestamp = Swift.getTagValue(onerecord, "98" + option, i++);
if (st_timestamp == null) {
if (option == 'C') {
option = 'A';
i = 0;
} else {
break;
}
} else {
if (st_timestamp.substring(1, 5).equals("PREP")) {
st_date = st_timestamp.substring(7, 15);
if (option == 'C') {
st_time = st_timestamp.substring(15, 21);
}
break;
}
}
}
if (st_time != null) {
entry.timestamp = date_time_format.parse(st_date + " " + st_time);
} else if (st_date != null) {
entry.timestamp = date_only_format.parse(st_date);
}
String st_depot = Swift.getTagValue(onerecord, "97A", 0);
int pos1 = st_depot.indexOf("//");
int pos2 = st_depot.indexOf("/", pos1 + 2);
if (pos2 < 0)
pos2 = st_depot.length();
entry.depot = new Konto();
entry.depot.blz = st_depot.substring(pos1 + 2, pos2);
if (pos2 < st_depot.length())
entry.depot.number = st_depot.substring(pos2 + 1);
passport.fillAccountInfo(entry.depot);
String st;
i = 0;
// Parse einzelnes Finanzinstrument (Repetitive Optional Subsequence B1 Financial Instrument)
st = Swift.getTagValue(onerecord, "17B", 0);
if (st.substring(st.indexOf("//") + 2).equals("Y")) {
int fin_start = onerecord.indexOf(":16R:FIN");
while (true) {
int fin_end = onerecord.indexOf(":16S:FIN", fin_start);
if ((fin_end) == -1) {
break;
}
String oneinstrument = onerecord.substring(fin_start, fin_end + 8);
fin_start += oneinstrument.length();
FinancialInstrument instrument = new GVRWPDepotUms.Entry.FinancialInstrument();
int trans_start = oneinstrument.indexOf(":16R:TRAN\r\n");
String oneinstrument_header;
if (trans_start >= 0)
oneinstrument_header = oneinstrument.substring(0, trans_start + 9);
else
oneinstrument_header = oneinstrument;
st = Swift.getTagValue(oneinstrument_header, "35B", 0);
boolean haveISIN = st.substring(0, 5).equals("ISIN ");
if (haveISIN) {
pos1 = st.indexOf("\r\n");
instrument.isin = st.substring(5, pos1);
if (pos1 + 2 < st.length() && st.substring(pos1 + 2, pos1 + 6).equals("/DE/")) {
pos2 = st.indexOf("\r\n", pos1 + 6);
if (pos2 == -1) {
pos2 = st.length();
}
instrument.wkn = st.substring(pos1 + 6, pos2);
pos1 = pos2;
}
} else {
pos1 = st.indexOf("\r\n");
instrument.wkn = st.substring(4, pos1);
}
pos1 += 2;
if (pos1 < st.length())
instrument.name = st.substring(pos1);
if (instrument.name != null) {
StringBuilder sb = new StringBuilder(instrument.name);
int p;
while ((p = sb.indexOf("\r\n")) != -1) {
sb.replace(p, p + 2, " ");
}
instrument.name = sb.toString();
}
i = 0;
while (true) {
st = Swift.getTagValue(oneinstrument_header, "93B", i++);
if (st == null)
break;
String qualifier = st.substring(1, 5);
if ("FIOP".equals(qualifier) || (instrument.startSaldo == null && "INOP".equals(qualifier))) {
instrument.startSaldo = parseTypedValue(st);
} else if ("FICL".equals(qualifier) || (instrument.endSaldo == null && "INCL".equals(qualifier))) {
instrument.endSaldo = parseTypedValue(st);
} else {
System.out.println("Unbekannter 93B: " + st);
}
}
i = 0;
while (true) {
st = Swift.getTagValue(oneinstrument_header, "98A", i++);
if (st == null)
break;
String qualifier = st.substring(1, 5);
if ("PRIC".equals(qualifier)) {
instrument.preisdatum = date_only_format.parse(st.substring(7, 15));
} else {
System.out.println("Unbekannter 98A: " + st);
}
}
i = 0;
while (true) {
st = Swift.getTagValue(oneinstrument_header, "90A", i++);
if (st == null)
break;
instrument.preis = parseTypedValue(st);
}
i = 0;
while (true) {
st = Swift.getTagValue(oneinstrument_header, "90B", i++);
if (st == null)
break;
instrument.preis = parseTypedValue(st);
}
//Parse einzelne Transaktionen
while (trans_start >= 0) {
int trans_end = oneinstrument.indexOf(":16S:TRAN\r\n", trans_start);
if (trans_end < 0)
break;
String onetransaction = oneinstrument.substring(trans_start, trans_end + 9);
trans_start = trans_end + 9;
Transaction transaction = new Transaction();
int link_start = onetransaction.indexOf(":16R:LINK");
if (link_start >= 0) {
int link_end = onetransaction.indexOf(":16S:LINK", link_start);
if (link_end >= 0) {
String onelink = onetransaction.substring(link_start, link_end + 8);
String rela = Swift.getTagValue(onelink, "20C", 0);
if (rela != null) {
transaction.kundenreferenz = rela.substring(7);
}
}
}
int detail_start = onetransaction.indexOf(":16R:TRANSDET");
if (detail_start >= 0) {
int detail_end = onetransaction.indexOf(":16S:TRANSDET", detail_start);
if (detail_end >= 0) {
String onedetail = onetransaction.substring(detail_start, detail_end + 12);
String quantity = Swift.getTagValue(onedetail, "36B", 0);
if (quantity != null)
if (quantity.startsWith(":PSTA")) {
transaction.anzahl = parseTypedValue(quantity);
} else {
System.out.println("Unbekannter 36B: " + quantity);
}
String t99a = Swift.getTagValue(onedetail, "99A", 0);
if (t99a != null)
if (t99a.startsWith(":DAAC")) {
int neg = 0;
if (t99a.charAt(7) == 'N')
neg = 1;
transaction.stueckzins_tage = Integer.parseInt(t99a.substring(7 + neg));
if (neg != 0)
transaction.stueckzins_tage = -transaction.stueckzins_tage;
} else {
System.out.println("Unbekannter 99A: " + t99a);
}
int tagidx = 0;
while (true) {
String t19a = Swift.getTagValue(onedetail, "19A", tagidx++);
if (t19a == null)
break;
if (t19a.startsWith(":PSTA")) {
int off = 7;
if (t19a.charAt(off) == 'N')
off++;
transaction.betrag = new BigDecimalValue(
t19a.substring(off + 3).replace(',', '.'),
t19a.substring(off, off + 3));
if (off > 7)
transaction.betrag.setValue(transaction.betrag.getValue().negate());
} else if (t19a.startsWith(":ACRU")) {
int off = 7;
if (t19a.charAt(off) == 'N')
off++;
transaction.stueckzinsen = new BigDecimalValue(
t19a.substring(off + 3).replace(',', '.'),
t19a.substring(off, off + 3));
if (off > 7)
transaction.stueckzinsen.setValue(transaction.stueckzinsen.getValue().negate());
} else {
System.out.println("Unbekannter 19A: " + t19a);
}
}
tagidx = 0;
while (true) {
String t22f = Swift.getTagValue(onedetail, "22F", tagidx++);
if (t22f == null)
break;
if (t22f.startsWith(":TRAN")) {
if (t22f.endsWith("SETT")) {
transaction.transaction_indicator =
Transaction.INDICATOR_SETTLEMENT_CLEARING;
} else if (t22f.endsWith("CORP")) {
transaction.transaction_indicator =
Transaction.INDICATOR_CORPORATE_ACTION;
} else if (t22f.endsWith("BOLE")) {
transaction.transaction_indicator = Transaction.INDICATOR_LEIHE;
} else if (t22f.endsWith("COLL")) {
transaction.transaction_indicator = Transaction.INDICATOR_SICHERHEITEN;
} else {
System.out.println("Unbekannter 22F->TRAN: " + t22f);
transaction.transaction_indicator = -1;
}
} else if (t22f.startsWith(":CCPT")) {
if (t22f.endsWith("YCCP")) {
transaction.ccp_eligibility = true;
} else {
System.out.println("Unbekannter 22F->CCPT: " + t22f);
}
} else {
System.out.println("Unbekannter 22F: " + t22f);
}
}
tagidx = 0;
while (true) {
String t22h = Swift.getTagValue(onedetail, "22H", tagidx++);
if (t22h == null)
break;
if (t22h.startsWith(":REDE")) {
if (t22h.endsWith("DELI")) {
transaction.richtung = Transaction.RICHTUNG_LIEFERUNG;
} else if (t22h.endsWith("RECE")) {
transaction.richtung = Transaction.RICHTUNG_ERHALT;
} else {
System.out.println("Unbekannter 22H->REDE: " + t22h);
transaction.richtung = -1;
}
} else if (t22h.startsWith(":PAYM")) {
if (t22h.endsWith("APMT")) {
transaction.bezahlung = Transaction.BEZAHLUNG_GEGEN_ZAHLUNG;
} else if (t22h.endsWith("FREE")) {
transaction.bezahlung = Transaction.BEZAHLUNG_FREI;
} else {
System.out.println("Unbekannter 22H->PAYM: " + t22h);
transaction.bezahlung = -1;
}
} else {
System.out.println("Unbekannter 22F: " + t22h);
}
}
tagidx = 0;
while (true) {
String t98a = Swift.getTagValue(onedetail, "98A", tagidx++);
if (t98a == null)
break;
if (t98a.startsWith(":ESET")) {
String datum = t98a.substring(7);
transaction.datum = date_only_format.parse(datum);
} else if (t98a.startsWith(":SETT")) {
String datum = t98a.substring(7);
transaction.datum_valuta = date_only_format.parse(datum);
} else {
System.out.println("Unbekannter 98A: " + t98a);
}
}
String move = Swift.getTagValue(onedetail, "25D", 0);
if (move != null)
if (move.startsWith(":MOVE")) {
if (move.endsWith("REVE"))
transaction.storno = true;
} else {
System.out.println("Unbekannter 25D: " + move);
}
String freitext = Swift.getTagValue(onedetail, "70E", 0);
if (freitext != null)
if (freitext.startsWith(":TRDE")) {
transaction.freitext_details = freitext.substring(7);
} else {
System.out.println("Unbekannter 70E: " + freitext);
}
}
}
int party_start = onetransaction.indexOf(":16R:SETPRTY");
if (party_start >= 0) {
int party_end = onetransaction.indexOf(":16S:SETPRTY", party_start);
if (party_end >= 0) {
String oneparty = onetransaction.substring(party_start, party_end + 10);
String deag = Swift.getTagValue(oneparty, "95Q", 0);
if (deag != null) {
transaction.gegenpartei = deag.substring(7);
}
}
}
instrument.transactions.add(transaction);
trans_start = oneinstrument.indexOf(":16R:TRAN\r\n", trans_start);
}
entry.instruments.add(instrument);
}
}
((GVRWPDepotUms) jobResult).addEntry(entry);
buffer.delete(0, onerecord.length());
} catch (Exception e) {
throw new HBCI_Exception("*** error while extracting data", e);
}
}
((GVRWPDepotUms) jobResult).rest = buffer.toString();
}
public void verifyConstraints() {
super.verifyConstraints();
checkAccountCRC("my");
}
}