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 MasterCardFileCreation implements CreditCardFileCreation {
public File createFile(CreditCardContract contract, Collection entries) throws IOException {
StringBuffer fileName = new StringBuffer("MCI10");
fileName.append("7256001");
fileName.append(IWTimestamp.RightNow().getDateString("yyyyMMddhhmmss"));
File tempfile = File.createTempFile(fileName.toString(), ".txt");
FileWriter writer = new FileWriter(tempfile);
BufferedWriter bWriter = new BufferedWriter(writer);
//System.out.println("MasterCardFileCreation: file name = " + tempfile.getPath() + tempfile.getName());
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(7);
format.setMaximumIntegerDigits(7);
format.setGroupingUsed(false);
NumberFormat format2 = NumberFormat.getInstance();
format2.setMaximumFractionDigits(0);
format2.setMinimumFractionDigits(0);
format2.setMinimumIntegerDigits(5);
format2.setMaximumIntegerDigits(5);
format2.setGroupingUsed(false);
NumberFormat format3 = NumberFormat.getInstance();
format3.setMaximumFractionDigits(0);
format3.setMinimumFractionDigits(0);
format3.setMinimumIntegerDigits(11);
format3.setMaximumIntegerDigits(11);
format3.setGroupingUsed(false);
NumberFormat format4 = NumberFormat.getInstance();
format4.setMaximumFractionDigits(0);
format4.setMinimumFractionDigits(0);
format4.setMinimumIntegerDigits(13);
format4.setMaximumIntegerDigits(13);
format4.setGroupingUsed(false);
int entryCounter = 1;
//H1
bWriter.write("H1");
bWriter.write("10");
bWriter.write(format.format(entryCounter));
bWriter.write(now.getDateString("yyyyMMdd"));
bWriter.write(now.getDateString("hhmmss"));
//
//bWriter.write(contract.getContractNumber());
bWriter.write("7256001"); //Number for Getspa. Move to a parameter later.
//@Todo check for multiple entries pr. day pr. contract
bWriter.write("001");
bWriter.write("PROD"); //bWriter.write("PROD");
bWriter.write(empty.substring(0, 1));
bWriter.write(empty.substring(0, 20));
bWriter.write(empty.substring(0, 100));
bWriter.write(empty.substring(0, 100));
entryCounter++;
bWriter.newLine();
//B1
bWriter.write("B1");
bWriter.write("10");
bWriter.write(format.format(entryCounter));
bWriter.write(contract.getContractNumber());
String batchNumber = getBatchNumber(contract);
bWriter.write(batchNumber);
bWriter.write(now.getDateString("yyyyMMdd"));
bWriter.write(empty.substring(0, 4));
bWriter.write(empty.substring(0, 4));
bWriter.write(empty.substring(0, 5));
bWriter.write("ISK");
bWriter.write(empty.substring(0, 25));
entryCounter++;
bWriter.newLine();
int countDebit = 0;
int countKredit = 0;
double amountDebit = 0.0d;
double amountKredit = 0.0d;
//F1
Iterator it = entries.iterator();
while (it.hasNext()) {
FinanceEntry entry = (FinanceEntry) it.next();
bWriter.write("F1");
bWriter.write("10");
bWriter.write(format.format(entryCounter));
bWriter.write(contract.getContractNumber());
bWriter.write(batchNumber);
bWriter.write(now.getDateString("yyyyMMdd"));
String cardNumber = entry.getPaymentContract().getCardNumber();
if (cardNumber.length() < 19) {
StringBuffer p = new StringBuffer(cardNumber);
while (p.length() < 19) {
p.append(" ");
}
cardNumber = p.toString();
} else if (cardNumber.length() > 19) {
cardNumber = cardNumber.substring(0, 19);
}
bWriter.write(cardNumber);
bWriter.write(new IWTimestamp(entry.getDateOfEntry()).getDateString("yyyyMMdd"));
bWriter.write(new IWTimestamp(entry.getDateOfEntry()).getDateString("hhmmss"));
//@Todo what is this
bWriter.write("0001");
double amount = entry.getAmount();
boolean isNegative = false;
if (amount < 0.0d) {
isNegative = true;
amount = Math.abs(amount);
countKredit++;
amountKredit += amount;
} else {
countDebit++;
amountDebit += amount;
}
bWriter.write(format3.format(amount * 100));
bWriter.write("ISK");
bWriter.write("T");
bWriter.write("@");
bWriter.write("B");
if (isNegative) {
bWriter.write("09");
} else {
bWriter.write("01");
}
bWriter.write(empty.substring(0, 1));
bWriter.write(empty.substring(0, 1));
bWriter.write(empty.substring(0, 6));
//Use the primary key as a reference number
// bWriter.write(empty.substring(0, 7));
String referenceNumber = entry.getPrimaryKey().toString();
if (referenceNumber.length() < 7) {
StringBuffer p = new StringBuffer(referenceNumber);
while (p.length() < 7) {
p.insert(0, "0");
}
referenceNumber = p.toString();
} else if (referenceNumber.length() > 7) {
referenceNumber = referenceNumber.substring(0, 7);
}
bWriter.write(referenceNumber);
entryCounter++;
bWriter.newLine();
}
//R1
bWriter.write("R1");
bWriter.write("10");
bWriter.write(format.format(entryCounter));
bWriter.write(contract.getContractNumber());
bWriter.write(batchNumber);
bWriter.write(now.getDateString("yyyyMMdd"));
bWriter.write("ISK");
bWriter.write(format2.format(countKredit));
bWriter.write(format2.format(countDebit));
bWriter.write(format3.format(amountKredit * 100));
bWriter.write(format3.format(amountDebit * 100));
bWriter.write(format2.format(entryCounter - 1));
entryCounter++;
bWriter.newLine();
//T3
bWriter.write("T3");
bWriter.write("10");
bWriter.write(format.format(entryCounter));
bWriter.write(now.getDateString("yyyyMMdd"));
bWriter.write(now.getDateString("hhmmss"));
// bWriter.write(contract.getContractNumber());
bWriter.write("7256001");
//@Todo check for multiple entries pr. day pr. contract
bWriter.write("001");
bWriter.write("PROD"); //bWriter.write("PROD");
bWriter.write(format.format(countKredit));
bWriter.write(format.format(countDebit));
bWriter.write(format4.format(amountKredit * 100));
bWriter.write(format4.format(amountDebit * 100));
bWriter.write(format2.format(1));
bWriter.write(format.format(entryCounter));
bWriter.newLine();
bWriter.close();
return tempfile;
}
private String getBatchNumber(CreditCardContract contract) {
NumberFormat format = NumberFormat.getInstance();
format.setMaximumFractionDigits(0);
format.setMinimumFractionDigits(0);
format.setMinimumIntegerDigits(7);
format.setMaximumIntegerDigits(7);
format.setGroupingUsed(false);
CompanyBatchInformation info = null;
int batchNr = 1;
try {
info = ((CompanyBatchInformationHome) IDOLookup.getHome(CompanyBatchInformation.class)).findByPrimaryKey(contract.getContractNumber());
batchNr = info.getBatchNumber();
info.setBatchNumber(batchNr + 1);
} catch (IDOLookupException e) {
e.printStackTrace();
} catch (FinderException e) {
try {
info = ((CompanyBatchInformationHome) IDOLookup.getHome(CompanyBatchInformation.class)).create();
info.setCompanyNumber(contract.getContractNumber());
info.setBatchNumber(2);
info.store();
} catch (IDOLookupException e1) {
e1.printStackTrace();
} catch (CreateException e1) {
e1.printStackTrace();
}
}
return format.format(batchNr);
}
}