package is.idega.idegaweb.member.isi.block.accounting.export.business;
import is.idega.idegaweb.member.isi.block.accounting.data.CreditCardContract;
import is.idega.idegaweb.member.isi.block.accounting.data.FinanceEntry;
import is.idega.idegaweb.member.isi.block.accounting.export.data.CompanyBatchInformation;
import is.idega.idegaweb.member.isi.block.accounting.export.data.CompanyBatchInformationHome;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.text.NumberFormat;
import java.util.Collection;
import java.util.Iterator;
import javax.ejb.CreateException;
import javax.ejb.FinderException;
import com.idega.data.IDOLookup;
import com.idega.data.IDOLookupException;
import com.idega.util.IWTimestamp;
public class VisaFileCreation implements CreditCardFileCreation {
public File createFile(CreditCardContract contract, Collection entries) throws IOException {
File tempfile = File.createTempFile(contract.getContractNumber(), ".txt");
FileWriter writer = new FileWriter(tempfile);
BufferedWriter bWriter = new BufferedWriter(writer);
StringBuffer empty = new StringBuffer("");
for (int i = 0; i < 60; i++) {
empty.append(" ");
}
IWTimestamp now = IWTimestamp.RightNow();
NumberFormat format = NumberFormat.getInstance();
format.setMaximumFractionDigits(0);
format.setMinimumFractionDigits(0);
format.setMinimumIntegerDigits(11);
format.setMaximumIntegerDigits(11);
format.setGroupingUsed(false);
NumberFormat format2 = NumberFormat.getInstance();
format2.setMaximumFractionDigits(0);
format2.setMinimumFractionDigits(0);
format2.setMinimumIntegerDigits(9);
format2.setMaximumIntegerDigits(9);
format2.setGroupingUsed(false);
//Styrifaersla
bWriter.write("1401");
bWriter.write("VI");
//bWriter.write(now.getDateString("yyMMdd"));
bWriter.write(empty.substring(0, 6));
bWriter.write("//");
bWriter.write("VISA ISLAND");
bWriter.write(empty.substring(0, 55));
bWriter.newLine();
double total = 0.0d;
Iterator it = entries.iterator();
while (it.hasNext()) {
FinanceEntry entry = (FinanceEntry) it.next();
total += entry.getAmount();
}
bWriter.write("1401");
bWriter.write("87");
bWriter.write(contract.getContractNumber());
bWriter.write(contract.getPersonalId());
bWriter.write(empty.substring(0, 1));
bWriter.write("08");
bWriter.write(format.format(total * 100));
bWriter.write(getBatchNumber(contract, now));
bWriter.write(now.getDateString("ddMM"));
bWriter.write(now.getDateString("ddMM"));
bWriter.write(empty.substring(0, 30));
bWriter.newLine();
it = entries.iterator();
int counter = 0;
while (it.hasNext()) {
counter++;
FinanceEntry entry = (FinanceEntry) it.next();
bWriter.write("1401");
bWriter.write("87");
String cardNumber = entry.getPaymentContract().getCardNumber();
if (cardNumber.length() < 16) {
StringBuffer p = new StringBuffer(cardNumber);
while (p.length() < 16) {
p.insert(0, '0');
}
cardNumber = p.toString();
} else if (cardNumber.length() > 16) {
cardNumber = cardNumber.substring(0, 16);
}
bWriter.write(cardNumber);
bWriter.write("05");
bWriter.write(empty.substring(0, 2));
bWriter.write(format2.format(entry.getAmount() * 100));
bWriter.write(getEntryNumber(contract, now, counter));
bWriter.write(new IWTimestamp(entry.getDateOfEntry()).getDateString("ddMM"));
bWriter.write(empty.substring(0, 5));
bWriter.write(empty.substring(0, 29));
bWriter.newLine();
}
bWriter.close();
return tempfile;
}
private String getEntryNumber(CreditCardContract contract, IWTimestamp now, int counter) {
NumberFormat format = NumberFormat.getInstance();
format.setMaximumFractionDigits(0);
format.setMinimumFractionDigits(0);
format.setMinimumIntegerDigits(4);
format.setMaximumIntegerDigits(4);
format.setGroupingUsed(false);
StringBuffer number = new StringBuffer();
number.append(contract.getCompanyNumber());
int month = now.getMonth();
if (month == 10) {
month = 0;
} else if (month == 11) {
month = 5;
} else if (month == 12) {
month = 6;
}
number.append(month);
number.append(format.format(counter));
return number.toString();
}
private String getBatchNumber(CreditCardContract contract, IWTimestamp now) {
NumberFormat format = NumberFormat.getInstance();
format.setMaximumFractionDigits(0);
format.setMinimumFractionDigits(0);
format.setMinimumIntegerDigits(3);
format.setMaximumIntegerDigits(3);
format.setGroupingUsed(false);
StringBuffer number = new StringBuffer();
number.append(contract.getCompanyNumber());
number.append(now.getDateString("MM"));
CompanyBatchInformation info = null;
int seq = 0;
try {
info = ((CompanyBatchInformationHome) IDOLookup.getHome(CompanyBatchInformation.class)).findByPrimaryKey(contract.getContractNumber());
String month = info.getBatchMonth();
if (month.equals(now.getDateString("MM"))) {
seq = info.getBatchNumber();
seq++;
info.setBatchNumber(seq);
info.store();
} else {
seq = 1;
info.setBatchMonth(now.getDateString("MM"));
info.setBatchNumber(seq);
info.store();
}
} catch (IDOLookupException e) {
e.printStackTrace();
} catch (FinderException e) {
try {
info = ((CompanyBatchInformationHome) IDOLookup.getHome(CompanyBatchInformation.class)).create();
info.setCompanyNumber(contract.getContractNumber());
info.setBatchMonth(now.getDateString("MM"));
info.setBatchNumber(1);
info.store();
seq = 1;
} catch (IDOLookupException e1) {
e1.printStackTrace();
} catch (CreateException e1) {
e1.printStackTrace();
}
}
number.append(format.format(seq));
return number.toString();
}
}