/* $Id: GVWPDepotList.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 java.text.SimpleDateFormat;
import java.util.Properties;
import org.kapott.hbci.GV_Result.GVRWPDepotList;
import org.kapott.hbci.exceptions.HBCI_Exception;
import org.kapott.hbci.manager.HBCIHandler;
import org.kapott.hbci.manager.HBCIUtilsInternal;
import org.kapott.hbci.manager.LogFilter;
import org.kapott.hbci.passport.HBCIPassport;
import org.kapott.hbci.status.HBCIMsgStatus;
import org.kapott.hbci.structures.BigDecimalValue;
import org.kapott.hbci.structures.Konto;
import org.kapott.hbci.swift.Swift;
import org.kapott.hbci.swift.SwiftLegacy;
public final class GVWPDepotList
extends HBCIJobImpl
{
private StringBuffer buffer;
public static String getLowlevelName()
{
return "WPDepotList";
}
public GVWPDepotList(HBCIHandler handler)
{
super(handler,getLowlevelName(),new GVRWPDepotList());
this.buffer=new StringBuffer();
HBCIPassport passport=handler.getPassport();
addConstraint("my.number","Depot.number",null, LogFilter.FILTER_IDS);
addConstraint("my.subnumber","Depot.subnumber","", LogFilter.FILTER_MOST);
addConstraint("my.country","Depot.KIK.country",passport.getUPD().getProperty("KInfo.KTV.KIK.country"), LogFilter.FILTER_NONE);
addConstraint("my.blz","Depot.KIK.blz",passport.getUPD().getProperty("KInfo.KTV.KIK.blz"), LogFilter.FILTER_MOST);
//addConstraint("my.curr","curr",passport.getUPD().getProperty("KInfo.cur",""), LogFilter.FILTER_NONE);
addConstraint("quality","quality","", LogFilter.FILTER_NONE);
addConstraint("maxentries","maxentries","", LogFilter.FILTER_NONE);
}
protected void extractResults(HBCIMsgStatus msgstatus,String header,int idx)
{
Properties result=msgstatus.getData();
// TODO es muessen noch die antwortdaten eines 571 geparst werden
StringBuffer paramName=new StringBuffer(header).append(".data535");
buffer.append(Swift.decodeUmlauts(result.getProperty(paramName.toString())));
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);
GVRWPDepotList.Entry entry=new GVRWPDepotList.Entry();
String st_timestamp=null;
String st_date=null;
String st_time=null;
char option='C';
int i=0;
while (true) {
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("STAT")) {
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 {
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);
entry.depot=new Konto();
entry.depot.blz=st_depot.substring(pos1+2,pos2);
entry.depot.number=st_depot.substring(pos2+1);
getMainPassport().fillAccountInfo(entry.depot);
String st;
i=0;
while (true) {
st=Swift.getTagValue(onerecord,"19A",i++);
if (st==null) {
break;
}
if (st.substring(1,5).equals("HOLP")) {
pos1=7;
if (st.charAt(pos1)=='N')
pos1++;
entry.total=new BigDecimalValue(
st.substring(pos1+3).replace(',','.'),
st.substring(pos1,pos1+3));
if (pos1>7)
entry.total.setValue(entry.total.getValue().negate());
break;
}
}
st=Swift.getTagValue(onerecord,"17B",0);
if (st.substring(st.indexOf("//")+2).equals("Y")) {
int subpos=onerecord.indexOf(":16R:FIN");
while (true) {
pos2=onerecord.indexOf(":16S:FIN",subpos);
if ((pos2)==-1) {
break;
}
String onegattung=onerecord.substring(subpos,pos2+8);
subpos+=onegattung.length();
GVRWPDepotList.Entry.Gattung gattung=new GVRWPDepotList.Entry.Gattung();
st=Swift.getTagValue(onegattung,"35B",0);
boolean haveISIN=st.substring(0,5).equals("ISIN ");
if (haveISIN) {
pos1=st.indexOf("\r\n");
gattung.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();
}
gattung.wkn=st.substring(pos1+6,pos2);
pos1=pos2;
}
} else {
pos1=st.indexOf("\r\n");
gattung.wkn=st.substring(4,pos1);
}
pos1+=2;
if (pos1<st.length())
gattung.name=st.substring(pos1);
if (gattung.name!=null) {
StringBuffer sb=new StringBuffer(gattung.name);
int p;
while ((p=sb.indexOf("\r\n"))!=-1) {
sb.replace(p,p+2," ");
}
gattung.name=sb.toString();
}
st=SwiftLegacy.getTagValue(onegattung,"90",new String[] {"A","B"},0);
if (st!=null) {
gattung.pricequalifier=(st.substring(1,5).equals("MRKT"))?GVRWPDepotList.Entry.Gattung.PRICE_QUALIF_MRKT
:GVRWPDepotList.Entry.Gattung.PRICE_QUALIF_HINT;
int next=0;
String curr;
if (st.substring(7,11).equals("PRCT")) {
gattung.pricetype=GVRWPDepotList.Entry.Gattung.PRICE_TYPE_PRCT;
curr="%";
next=12;
} else {
gattung.pricetype=GVRWPDepotList.Entry.Gattung.PRICE_TYPE_VALUE;
curr=st.substring(12,15);
next=15;
}
gattung.price=new BigDecimalValue(
st.substring(next).replace(',','.'),
curr);
}
st=Swift.getTagValue(onegattung,"94B",0);
if (st!=null) {
String st_source=st.substring(7,11);
if (st_source.equals("LMAR"))
gattung.source=GVRWPDepotList.Entry.Gattung.SOURCE_LOC;
else if (st_source.equals("THEO"))
gattung.source=GVRWPDepotList.Entry.Gattung.SOURCE_THEOR;
else if (st_source.equals("VEND"))
gattung.source=GVRWPDepotList.Entry.Gattung.SOURCE_SELLER;
pos1=st.indexOf("/",11);
if (pos1!=-1) {
gattung.source_comment=st.substring(pos1+1);
}
}
st_timestamp=null;
st_date=null;
st_time=null;
option='C';
i=0;
while (true) {
st_timestamp=Swift.getTagValue(onegattung,"98"+option,i++);
if (st_timestamp==null) {
if (option=='C') {
option='A';
i=0;
} else {
break;
}
} else {
if (st_timestamp.substring(1,5).equals("PRIC")) {
st_date=st_timestamp.substring(7,15);
if (option=='C') {
st_time=st_timestamp.substring(15,21);
}
break;
}
}
}
if (st_date!=null) {
if (st_time!=null) {
gattung.timestamp_price=date_time_format.parse(st_date+" "+st_time);
} else {
gattung.timestamp_price=date_only_format.parse(st_date);
}
}
st=Swift.getTagValue(onegattung,"93B",0);
String st_type=st.substring(7,11);
String curr="EUR";
if (st_type.equals("FAMT")) {
gattung.saldo_type=GVRWPDepotList.Entry.SALDO_TYPE_WERT;
curr=""; // TODO
} else if (st_type.equals("UNIT")) {
gattung.saldo_type=GVRWPDepotList.Entry.SALDO_TYPE_STCK;
curr="";
}
pos1=12;
if (st.charAt(pos1)=='N')
gattung.saldo=new BigDecimalValue(
"-"+st.substring(pos1+1).replace(',','.'),
curr);
else
gattung.saldo=new BigDecimalValue(
st.substring(pos1).replace(',','.'),
curr);
st=Swift.getTagValue(onegattung,"99A",0);
if (st!=null) {
if (st.charAt(7)=='N') {
gattung.days=-1*Integer.parseInt(st.substring(8));
} else {
gattung.days=Integer.parseInt(st.substring(7));
}
}
i=0;
while (true) {
st=Swift.getTagValue(onegattung,"19A",i++);
if (st==null) {
break;
}
if (st.substring(1,5).equals("HOLD")) {
pos1=7;
if (st.charAt(pos1)=='N')
pos1++;
gattung.depotwert=new BigDecimalValue(
st.substring(pos1+3).replace(',','.'),
st.substring(pos1,pos1+3));
if (pos1>7)
gattung.depotwert.setValue(gattung.depotwert.getValue().negate());
break;
}
}
i=0;
while (true) {
st=Swift.getTagValue(onegattung,"19A",i++);
if (st==null) {
break;
}
if (st.substring(1,5).equals("ACRU")) {
pos1=7;
if (st.charAt(pos1)=='N')
pos1++;
gattung.stueckzinsbetrag=new BigDecimalValue(
st.substring(pos1+3).replace(',','.'),
st.substring(pos1,pos1+3));
if (pos1>7)
gattung.stueckzinsbetrag.setValue(gattung.stueckzinsbetrag.getValue().negate());
break;
}
}
st=Swift.getTagValue(onegattung,"92B",0);
if (st!=null) {
gattung.xchg_cur1=st.substring(7,10);
gattung.xchg_cur2=st.substring(11,14);
gattung.xchg_kurs=Double.parseDouble(st.substring(15).replace(',','.'));
}
st=Swift.getTagValue(onegattung,"70E",0);
if (st!=null) {
String formtext=st.substring(7);
gattung.curr=SwiftLegacy.getLineFieldValue(formtext,"1",0);
gattung.wptype=SwiftLegacy.getLineFieldValue(formtext,"1",1);
gattung.branche=SwiftLegacy.getLineFieldValue(formtext,"1",2);
gattung.countryEmittent=SwiftLegacy.getLineFieldValue(formtext,"1",3);
st=SwiftLegacy.getLineFieldValue(formtext,"1",4);
if (st!=null)
gattung.kauf=date_only_format.parse(st);
st=SwiftLegacy.getLineFieldValue(formtext,"1",5);
if (st!=null)
gattung.faellig=date_only_format.parse(st);
st=SwiftLegacy.getLineFieldValue(formtext,"2",0);
if (st!=null) {
gattung.einstandspreis=new BigDecimalValue(
st.replace(',','.'),
"%");
}
st=SwiftLegacy.getLineFieldValue(formtext,"2",1);
if (st!=null)
gattung.einstandspreis.setCurr(st);
st=SwiftLegacy.getLineFieldValue(formtext,"2",2);
if (st!=null)
gattung.zinssatz=HBCIUtilsInternal.string2Long(st.replace(',','.'), 1000);
// TODO: zeug fuer kontrakte
}
int subsaldopos=onegattung.indexOf(":16R:SUBBAL");
while (true) {
pos2=onegattung.indexOf(":16S:SUBBAL",subsaldopos);
if ((pos2)==-1) {
break;
}
String onesubsaldo=onegattung.substring(subsaldopos,pos2+11);
subsaldopos+=onesubsaldo.length();
GVRWPDepotList.Entry.Gattung.SubSaldo subsaldo=new GVRWPDepotList.Entry.Gattung.SubSaldo();
st=Swift.getTagValue(onesubsaldo,"93C",0);
subsaldo.qualifier=st.substring(1,5);
st_type=st.substring(7,11);
curr="EUR";
if (st_type.equals("FAMT")) {
subsaldo.saldo_type=GVRWPDepotList.Entry.SALDO_TYPE_WERT;
curr="";
} else if (st_type.equals("UNIT")) {
subsaldo.saldo_type=GVRWPDepotList.Entry.SALDO_TYPE_STCK;
curr="";
}
subsaldo.locked=st.substring(12,16).equals("NAVL");
pos1=17;
if (st.charAt(pos1)=='N')
subsaldo.saldo=new BigDecimalValue(
"-"+st.substring(pos1+1).replace(',','.'),
curr);
else
subsaldo.saldo=new BigDecimalValue(
st.substring(pos1).replace(',','.'),
curr);
st=Swift.getTagValue(onesubsaldo,"94C",0);
if (st!=null)
subsaldo.country=st.substring(7);
String formtext=Swift.getTagValue(onesubsaldo,"70C",0);
if (formtext!=null) {
st=SwiftLegacy.getLineFieldValue(formtext,"2",0);
if (st!=null)
subsaldo.verwahrung=Integer.parseInt(st);
subsaldo.lager=SwiftLegacy.getLineFieldValue(formtext,"2",1);
st=SwiftLegacy.getLineFieldValue(formtext,"2",2);
if (st!=null)
subsaldo.lockeduntil=date_only_format.parse(st);
subsaldo.comment=SwiftLegacy.getLineFieldValue(formtext,"3",0);
st=SwiftLegacy.getLineFieldValue(formtext,"4",0);
if (st!=null) {
if (subsaldo.comment==null)
subsaldo.comment=st;
else
subsaldo.comment+=" "+st;
}
}
gattung.addSubSaldo(subsaldo);
}
entry.addEntry(gattung);
}
}
((GVRWPDepotList)jobResult).addEntry(entry);
buffer.delete(0,onerecord.length());
} catch (Exception e) {
throw new HBCI_Exception("*** error while extracting data",e);
}
}
((GVRWPDepotList)jobResult).rest=buffer.toString();
}
public void verifyConstraints()
{
super.verifyConstraints();
checkAccountCRC("my");
}
}