/* $Id: DTAUS_CH.java,v 1.1 2011/05/04 22:38:03 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.swift;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import org.kapott.hbci.exceptions.HBCI_Exception;
import org.kapott.hbci.exceptions.InvalidArgumentException;
import org.kapott.hbci.structures.Konto;
import org.kapott.hbci.structures.Value;
public class DTAUS_CH
{
public class Transaction
{
public Konto other;
public Value value;
public List<String> usage;
public int idx;
public Transaction(Konto other,Value value)
{
this.other=other;
this.value=value;
this.usage=new ArrayList<String>();
}
public void addUsage(String st)
{
usage.add(st);
}
public String toString()
{
StringBuffer ret=new StringBuffer();
ret.append("01");
ret.append(new SimpleDateFormat("yyMMdd").format(now));
ret.append(expand(other.blz,12,(byte)0x20,ALIGN_LEFT));
ret.append(expand("",5,(byte)0x30,ALIGN_LEFT));
ret.append(new SimpleDateFormat("yyMMdd").format(now));
ret.append(expand(myAccount.blz,7,(byte)0x20,ALIGN_LEFT));
ret.append(expand("",5,(byte)0x20,ALIGN_LEFT));
ret.append(expand(Integer.toString(idx),5,(byte)0x30,ALIGN_RIGHT));
ret.append("827");
ret.append("00");
ret.append(expand("",5,(byte)0x20,ALIGN_LEFT));
ret.append(expand("TAN"+Integer.toString(idx),11,(byte)0x20,ALIGN_LEFT));
ret.append(expand(myAccount.number,24,(byte)0x20,ALIGN_LEFT));
ret.append(expand("",6,(byte)0x20,ALIGN_LEFT));
ret.append(value.getCurr());
ret.append(expand(new DecimalFormat("0.00").format(value.getBigDecimalValue()).replace('.',','),12,(byte)0x20,ALIGN_LEFT));
total+=value.getLongValue();
ret.append(expand("",14,(byte)0x20,ALIGN_LEFT));
ret.append("02");
ret.append(expand(myAccount.name,24,(byte)0x20,ALIGN_LEFT));
for (int i=0;i<3;i++) {
ret.append(expand((i<myAddress.length?myAddress[i]:""),
24,(byte)0x20,ALIGN_LEFT));
}
ret.append(expand("",30,(byte)0x20,ALIGN_LEFT));
ret.append("03");
ret.append("/C/");
ret.append(expand(other.number,27,(byte)0x20,ALIGN_LEFT));
ret.append(expand(other.name,24,(byte)0x20,ALIGN_LEFT));
for (int i=0;i<3;i++) {
ret.append(expand("",24,(byte)0x20,ALIGN_LEFT));
}
ret.append("04");
for (int i=0;i<4;i++) {
ret.append(expand((i<usage.size()?(String)usage.get(i):""),
28,(byte)0x20,ALIGN_LEFT));
}
ret.append(expand("",14,(byte)0x20,ALIGN_LEFT));
return ret.toString();
}
}
private List<Transaction> entries;
private Konto myAccount;
private String[] myAddress;
private int counter;
private Date now;
private long total;
private static final byte ALIGN_LEFT=1;
private static final byte ALIGN_RIGHT=2;
public DTAUS_CH(Konto myAccount,String[] myAddress)
{
if (!myAccount.country.equals("CH"))
throw new InvalidArgumentException("*** can only be used with swiss accounts");
this.entries=new ArrayList<Transaction>();
this.myAccount=myAccount;
this.myAddress=((myAddress!=null)?myAddress:new String[0]);
this.counter=0;
}
public void addEntry(Transaction entry)
{
entry.idx=++counter;
entries.add(entry);
}
public String toString()
{
StringBuffer ret=new StringBuffer();
now=new Date();
total=0;
for (Iterator<Transaction> i=entries.iterator();i.hasNext();) {
Transaction trans= i.next();
ret.append(trans.toString());
}
ret.append("01");
ret.append(expand("",6,(byte)0x30,ALIGN_LEFT));
ret.append(expand("",12,(byte)0x20,ALIGN_LEFT));
ret.append(expand("",5,(byte)0x30,ALIGN_LEFT));
ret.append(new SimpleDateFormat("yyMMdd").format(now));
ret.append(expand("",7,(byte)0x20,ALIGN_LEFT));
ret.append(expand("",5,(byte)0x20,ALIGN_LEFT));
ret.append(expand(Integer.toString(counter+1),5,(byte)0x30,ALIGN_RIGHT));
ret.append("890");
ret.append("00");
ret.append(expand(new DecimalFormat("0.000").format(total/100.0).replace('.',','),16,(byte)0x20,ALIGN_LEFT));
ret.append(expand("",59,(byte)0x20,ALIGN_LEFT));
return ret.toString();
}
private String expand(String st,int len,byte filler,int align)
{
if (st.length()<len) {
try {
byte[] fill=new byte[len-st.length()];
Arrays.fill(fill,filler);
String fillst=new String(fill,"ISO-8859-1");
if (align==ALIGN_LEFT)
st=st+fillst;
else if (align==ALIGN_RIGHT)
st=fillst+st;
else
throw new HBCI_Exception("*** invalid align type: "+align);
} catch (Exception e) {
throw new HBCI_Exception(e);
}
} else if (st.length()>len) {
throw new InvalidArgumentException("*** string too long: \""+st+"\" has "+st.length()+" chars, but max is "+len);
}
return st;
}
}