/*
* The Kuali Financial System, a comprehensive financial management system for higher education.
*
* Copyright 2005-2014 The Kuali Foundation
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.kuali.kfs.gl.service.impl;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.kuali.kfs.gl.GeneralLedgerConstants;
import org.kuali.kfs.gl.batch.service.impl.OriginEntryFileIterator;
import org.kuali.kfs.gl.businessobject.LedgerEntryForReporting;
import org.kuali.kfs.gl.businessobject.LedgerEntryHolder;
import org.kuali.kfs.gl.businessobject.OriginEntryFull;
import org.kuali.kfs.gl.businessobject.PosterOutputSummaryEntry;
import org.kuali.kfs.gl.service.OriginEntryGroupService;
import org.kuali.kfs.gl.service.OriginEntryService;
import org.kuali.kfs.sys.KFSConstants;
import org.kuali.kfs.sys.Message;
import org.kuali.rice.core.api.datetime.DateTimeService;
import org.kuali.rice.core.api.util.type.KualiDecimal;
import org.springframework.transaction.annotation.Transactional;
/**
* The base implementation of OriginEntryService
*/
@Transactional
public class OriginEntryServiceImpl implements OriginEntryService {
private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(OriginEntryServiceImpl.class);
private static final String ENTRY_GROUP_ID = "entryGroupId";
private static final String FINANCIAL_DOCUMENT_TYPE_CODE = "financialDocumentTypeCode";
private static final String FINANCIAL_SYSTEM_ORIGINATION_CODE = "financialSystemOriginationCode";
private OriginEntryGroupService originEntryGroupService;
private DateTimeService dateTimeService;
private String batchFileDirectoryName;
/**
* Sets the originEntryGroupService attribute
* @param originEntryGroupService the implementation of OriginEntryGroupService to set
*/
public void setOriginEntryGroupService(OriginEntryGroupService originEntryGroupService) {
this.originEntryGroupService = originEntryGroupService;
}
/**
* Constructs a new instance of OriginEntryServiceImpl
*/
public OriginEntryServiceImpl() {
super();
}
public void createEntry(OriginEntryFull originEntry, PrintStream ps) {
LOG.debug("createEntry() with PrintStream started");
try {
ps.printf("%s\n", originEntry.getLine());
} catch (Exception e) {
throw new RuntimeException(e.toString());
}
}
/**
* Given a collection of group ids, summarize the entries in each group.
* @param groupIdList a Collection of the ids of origin entry groups to summarize
* @return a LedgerEntryHolder with all of the summarized information
* @see org.kuali.kfs.gl.service.OriginEntryService#getSummaryByGroupId(Collection)
*/
//TODO:- This method used for report. I will delete this method after all reports are done.
public LedgerEntryHolder getSummaryByGroupId(Collection groupIdList) {
LOG.debug("getSummaryByGroupId() started");
LedgerEntryHolder ledgerEntryHolder = new LedgerEntryHolder();
if (groupIdList.size() == 0) {
return ledgerEntryHolder;
}
return ledgerEntryHolder;
}
/**
* Creates or updates a ledger entry with the array of information from the given entry summary object
*
* @param entrySummary a collection of java.lang.Objects, which is what OJB report queries return
* @return a LedgerEntry holding the given report summarization data
*/
public static LedgerEntryForReporting buildLedgerEntry(Object[] entrySummary) {
// extract the data from an array and use them to populate a ledger entry
Object oFiscalYear = entrySummary[0];
Object oPeriodCode = entrySummary[1];
Object oBalanceType = entrySummary[2];
Object oOriginCode = entrySummary[3];
Object oDebitCreditCode = entrySummary[4];
Object oAmount = entrySummary[5];
Object oCount = entrySummary[6];
Integer fiscalYear = oFiscalYear != null ? new Integer(oFiscalYear.toString()) : null;
String periodCode = oPeriodCode != null ? oPeriodCode.toString() : GeneralLedgerConstants.getSpaceUniversityFiscalPeriodCode();
String balanceType = oBalanceType != null ? oBalanceType.toString() : GeneralLedgerConstants.getSpaceBalanceTypeCode();
String originCode = oOriginCode != null ? oOriginCode.toString() : GeneralLedgerConstants.getSpaceFinancialSystemOriginationCode();
String debitCreditCode = oDebitCreditCode != null ? oDebitCreditCode.toString() : GeneralLedgerConstants.getSpaceDebitCreditCode();
KualiDecimal amount = oAmount != null ? new KualiDecimal(oAmount.toString()) : KualiDecimal.ZERO;
int count = oCount != null ? Integer.parseInt(oCount.toString()) : 0;
// construct a ledger entry with the information fetched from the given array
LedgerEntryForReporting ledgerEntry = new LedgerEntryForReporting(fiscalYear, periodCode, balanceType, originCode);
if (KFSConstants.GL_CREDIT_CODE.equals(debitCreditCode)) {
ledgerEntry.setCreditAmount(amount);
ledgerEntry.setCreditCount(count);
}
else if (KFSConstants.GL_DEBIT_CODE.equals(debitCreditCode)) {
ledgerEntry.setDebitAmount(amount);
ledgerEntry.setDebitCount(count);
}
else {
ledgerEntry.setNoDCAmount(amount);
ledgerEntry.setNoDCCount(count);
}
ledgerEntry.setRecordCount(count);
return ledgerEntry;
}
/**
* This method writes origin entries into a file format. This particular implementation will use the OriginEntryFull.getLine
* method to generate the text for this file.
*
* @param entries An iterator of OriginEntries
* @param bw an opened, ready-for-output bufferedOutputStream.
* @see org.kuali.kfs.gl.service.OriginEntryService#flatFile(java.util.Iterator, java.io.BufferedOutputStream)
*/
public void flatFile(Iterator<OriginEntryFull> entries, BufferedOutputStream bw) {
try {
while (entries.hasNext()) {
OriginEntryFull e = entries.next();
bw.write((e.getLine() + "\n").getBytes());
}
}
catch (IOException e) {
LOG.error("flatFile() Error writing to file", e);
throw new RuntimeException("Error writing to file: " + e.getMessage());
}
}
public Map getEntriesByGroupIdWithPath(String fileNameWithPath, List<OriginEntryFull> originEntryList) {
FileReader INPUT_GLE_FILE = null;
BufferedReader INPUT_GLE_FILE_br;
try {
INPUT_GLE_FILE = new FileReader(fileNameWithPath);
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
}
INPUT_GLE_FILE_br = new BufferedReader(INPUT_GLE_FILE);
boolean loadError = false;
//returnErrorList is list of List<Message>
Map returnMessageMap = getEntriesByBufferedReader(INPUT_GLE_FILE_br, originEntryList);
try{
INPUT_GLE_FILE_br.close();
INPUT_GLE_FILE.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
return returnMessageMap;
}
public Map getEntriesByBufferedReader(BufferedReader inputBufferedReader, List<OriginEntryFull> originEntryList) {
String line;
int lineNumber = 0;
Map returnMessageMap = new HashMap();
try {
List<Message> tmperrors = new ArrayList();
while ((line = inputBufferedReader.readLine()) != null) {
lineNumber++;
OriginEntryFull originEntry = new OriginEntryFull();
tmperrors = originEntry.setFromTextFileForBatch(line, lineNumber);
originEntry.setEntryId(lineNumber);
if (tmperrors.size() > 0){
returnMessageMap.put(new Integer(lineNumber), tmperrors);
} else {
originEntryList.add(originEntry);
}
}
} catch (IOException e) {
throw new RuntimeException(e);
}
return returnMessageMap;
}
/**
* get the summarized information of poster input entries that belong to the entry groups with the given group id list
*
* @param groupIdList the origin entry groups
* @return a map of summarized information of poster input entries within the specified groups
* @see org.kuali.kfs.gl.service.OriginEntryService#getPosterOutputSummaryByGroupId(java.util.Collection)
*/
//TODO:- This method used for report. This method can be deleted after all reports are done.
public Map<String, PosterOutputSummaryEntry> getPosterOutputSummaryByGroupId(Collection groupIdList) {
LOG.debug("getPosterOutputSummaryByGroupId() started");
Map<String, PosterOutputSummaryEntry> output = new HashMap<String, PosterOutputSummaryEntry>();
if (groupIdList.size() == 0) {
return output;
}
return output;
}
public Integer getGroupCount(String fileNameWithPath){
File file = new File(fileNameWithPath);
Iterator<OriginEntryFull> fileIterator = new OriginEntryFileIterator(file);
int count = 0;
while(fileIterator.hasNext()){
count++;
fileIterator.next();
}
return count;
}
public void setDateTimeService(DateTimeService dateTimeService) {
this.dateTimeService = dateTimeService;
}
public void setBatchFileDirectoryName(String batchFileDirectoryName) {
this.batchFileDirectoryName = batchFileDirectoryName;
}
}