001 /* 002 * Copyright 2011 The Kuali Foundation. 003 * 004 * Licensed under the Educational Community License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.opensource.org/licenses/ecl2.php 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 package org.kuali.kfs.gl.service.impl; 017 018 import java.io.BufferedOutputStream; 019 import java.io.BufferedReader; 020 import java.io.BufferedWriter; 021 import java.io.File; 022 import java.io.FileNotFoundException; 023 import java.io.FileReader; 024 import java.io.FileWriter; 025 import java.io.IOException; 026 import java.io.PrintStream; 027 import java.sql.Date; 028 import java.util.ArrayList; 029 import java.util.Collection; 030 import java.util.HashMap; 031 import java.util.Iterator; 032 import java.util.List; 033 import java.util.Map; 034 035 import org.kuali.kfs.gl.GeneralLedgerConstants; 036 import org.kuali.kfs.gl.batch.service.impl.OriginEntryFileIterator; 037 import org.kuali.kfs.gl.businessobject.LedgerEntryForReporting; 038 import org.kuali.kfs.gl.businessobject.LedgerEntryHolder; 039 import org.kuali.kfs.gl.businessobject.OriginEntryFull; 040 import org.kuali.kfs.gl.businessobject.OriginEntryGroup; 041 import org.kuali.kfs.gl.businessobject.OriginEntryStatistics; 042 import org.kuali.kfs.gl.businessobject.PosterOutputSummaryEntry; 043 import org.kuali.kfs.gl.businessobject.Transaction; 044 import org.kuali.kfs.gl.dataaccess.OriginEntryDao; 045 import org.kuali.kfs.gl.service.OriginEntryGroupService; 046 import org.kuali.kfs.gl.service.OriginEntryService; 047 import org.kuali.kfs.sys.KFSConstants; 048 import org.kuali.kfs.sys.KFSPropertyConstants; 049 import org.kuali.kfs.sys.Message; 050 import org.kuali.rice.kns.service.DateTimeService; 051 import org.kuali.rice.kns.util.KualiDecimal; 052 import org.springframework.transaction.annotation.Transactional; 053 054 /** 055 * The base implementation of OriginEntryService 056 */ 057 @Transactional 058 public class OriginEntryServiceImpl implements OriginEntryService { 059 private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(OriginEntryServiceImpl.class); 060 061 private static final String ENTRY_GROUP_ID = "entryGroupId"; 062 private static final String FINANCIAL_DOCUMENT_TYPE_CODE = "financialDocumentTypeCode"; 063 private static final String FINANCIAL_SYSTEM_ORIGINATION_CODE = "financialSystemOriginationCode"; 064 065 private OriginEntryGroupService originEntryGroupService; 066 067 private DateTimeService dateTimeService; 068 private String batchFileDirectoryName; 069 070 /** 071 * Sets the originEntryGroupService attribute 072 * @param originEntryGroupService the implementation of OriginEntryGroupService to set 073 */ 074 public void setOriginEntryGroupService(OriginEntryGroupService originEntryGroupService) { 075 this.originEntryGroupService = originEntryGroupService; 076 } 077 078 /** 079 * Constructs a new instance of OriginEntryServiceImpl 080 */ 081 public OriginEntryServiceImpl() { 082 super(); 083 } 084 085 public void createEntry(OriginEntryFull originEntry, PrintStream ps) { 086 LOG.debug("createEntry() with PrintStream started"); 087 088 try { 089 ps.printf("%s\n", originEntry.getLine()); 090 } catch (Exception e) { 091 throw new RuntimeException(e.toString()); 092 } 093 094 } 095 096 /** 097 * Given a collection of group ids, summarize the entries in each group. 098 * @param groupIdList a Collection of the ids of origin entry groups to summarize 099 * @return a LedgerEntryHolder with all of the summarized information 100 * @see org.kuali.kfs.gl.service.OriginEntryService#getSummaryByGroupId(Collection) 101 */ 102 103 //TODO:- This method used for report. I will delete this method after all reports are done. 104 public LedgerEntryHolder getSummaryByGroupId(Collection groupIdList) { 105 LOG.debug("getSummaryByGroupId() started"); 106 107 LedgerEntryHolder ledgerEntryHolder = new LedgerEntryHolder(); 108 109 if (groupIdList.size() == 0) { 110 return ledgerEntryHolder; 111 } 112 113 return ledgerEntryHolder; 114 } 115 116 /** 117 * Creates or updates a ledger entry with the array of information from the given entry summary object 118 * 119 * @param entrySummary a collection of java.lang.Objects, which is what OJB report queries return 120 * @return a LedgerEntry holding the given report summarization data 121 */ 122 public static LedgerEntryForReporting buildLedgerEntry(Object[] entrySummary) { 123 // extract the data from an array and use them to populate a ledger entry 124 Object oFiscalYear = entrySummary[0]; 125 Object oPeriodCode = entrySummary[1]; 126 Object oBalanceType = entrySummary[2]; 127 Object oOriginCode = entrySummary[3]; 128 Object oDebitCreditCode = entrySummary[4]; 129 Object oAmount = entrySummary[5]; 130 Object oCount = entrySummary[6]; 131 132 Integer fiscalYear = oFiscalYear != null ? new Integer(oFiscalYear.toString()) : null; 133 String periodCode = oPeriodCode != null ? oPeriodCode.toString() : GeneralLedgerConstants.getSpaceUniversityFiscalPeriodCode(); 134 String balanceType = oBalanceType != null ? oBalanceType.toString() : GeneralLedgerConstants.getSpaceBalanceTypeCode(); 135 String originCode = oOriginCode != null ? oOriginCode.toString() : GeneralLedgerConstants.getSpaceFinancialSystemOriginationCode(); 136 String debitCreditCode = oDebitCreditCode != null ? oDebitCreditCode.toString() : GeneralLedgerConstants.getSpaceDebitCreditCode(); 137 KualiDecimal amount = oAmount != null ? new KualiDecimal(oAmount.toString()) : KualiDecimal.ZERO; 138 int count = oCount != null ? Integer.parseInt(oCount.toString()) : 0; 139 140 // construct a ledger entry with the information fetched from the given array 141 LedgerEntryForReporting ledgerEntry = new LedgerEntryForReporting(fiscalYear, periodCode, balanceType, originCode); 142 if (KFSConstants.GL_CREDIT_CODE.equals(debitCreditCode)) { 143 ledgerEntry.setCreditAmount(amount); 144 ledgerEntry.setCreditCount(count); 145 } 146 else if (KFSConstants.GL_DEBIT_CODE.equals(debitCreditCode)) { 147 ledgerEntry.setDebitAmount(amount); 148 ledgerEntry.setDebitCount(count); 149 } 150 else { 151 ledgerEntry.setNoDCAmount(amount); 152 ledgerEntry.setNoDCCount(count); 153 } 154 ledgerEntry.setRecordCount(count); 155 156 return ledgerEntry; 157 } 158 159 /** 160 * This method writes origin entries into a file format. This particular implementation will use the OriginEntryFull.getLine 161 * method to generate the text for this file. 162 * 163 * @param entries An iterator of OriginEntries 164 * @param bw an opened, ready-for-output bufferedOutputStream. 165 * @see org.kuali.kfs.gl.service.OriginEntryService#flatFile(java.util.Iterator, java.io.BufferedOutputStream) 166 */ 167 public void flatFile(Iterator<OriginEntryFull> entries, BufferedOutputStream bw) { 168 try { 169 while (entries.hasNext()) { 170 OriginEntryFull e = entries.next(); 171 bw.write((e.getLine() + "\n").getBytes()); 172 } 173 } 174 catch (IOException e) { 175 LOG.error("flatFile() Error writing to file", e); 176 throw new RuntimeException("Error writing to file: " + e.getMessage()); 177 } 178 } 179 180 public Map getEntriesByGroupIdWithPath(String fileNameWithPath, List<OriginEntryFull> originEntryList) { 181 182 FileReader INPUT_GLE_FILE = null; 183 BufferedReader INPUT_GLE_FILE_br; 184 try { 185 INPUT_GLE_FILE = new FileReader(fileNameWithPath); 186 } catch (FileNotFoundException e) { 187 throw new RuntimeException(e); 188 } 189 INPUT_GLE_FILE_br = new BufferedReader(INPUT_GLE_FILE); 190 191 boolean loadError = false; 192 //returnErrorList is list of List<Message> 193 Map returnErrorMap = getEntriesByBufferedReader(INPUT_GLE_FILE_br, originEntryList); 194 195 try{ 196 INPUT_GLE_FILE_br.close(); 197 INPUT_GLE_FILE.close(); 198 } catch (IOException e) { 199 throw new RuntimeException(e); 200 } 201 202 return returnErrorMap; 203 } 204 205 public Map getEntriesByBufferedReader(BufferedReader inputBufferedReader, List<OriginEntryFull> originEntryList) { 206 String line; 207 int lineNumber = 0; 208 Map returnErrorMap = new HashMap(); 209 try { 210 List<Message> tmperrors = new ArrayList(); 211 while ((line = inputBufferedReader.readLine()) != null) { 212 lineNumber++; 213 OriginEntryFull originEntry = new OriginEntryFull(); 214 tmperrors = originEntry.setFromTextFileForBatch(line, lineNumber); 215 originEntry.setEntryId(lineNumber); 216 if (tmperrors.size() > 0){ 217 returnErrorMap.put(new Integer(lineNumber), tmperrors); 218 } else { 219 originEntryList.add(originEntry); 220 } 221 } 222 } catch (IOException e) { 223 throw new RuntimeException(e); 224 } 225 226 return returnErrorMap; 227 228 229 } 230 231 /** 232 * get the summarized information of poster input entries that belong to the entry groups with the given group id list 233 * 234 * @param groupIdList the origin entry groups 235 * @return a map of summarized information of poster input entries within the specified groups 236 * @see org.kuali.kfs.gl.service.OriginEntryService#getPosterOutputSummaryByGroupId(java.util.Collection) 237 */ 238 239 //TODO:- This method used for report. This method can be deleted after all reports are done. 240 public Map<String, PosterOutputSummaryEntry> getPosterOutputSummaryByGroupId(Collection groupIdList) { 241 LOG.debug("getPosterOutputSummaryByGroupId() started"); 242 243 Map<String, PosterOutputSummaryEntry> output = new HashMap<String, PosterOutputSummaryEntry>(); 244 245 if (groupIdList.size() == 0) { 246 return output; 247 } 248 249 return output; 250 } 251 252 public Integer getGroupCount(String fileNameWithPath){ 253 File file = new File(fileNameWithPath); 254 Iterator<OriginEntryFull> fileIterator = new OriginEntryFileIterator(file); 255 int count = 0; 256 257 while(fileIterator.hasNext()){ 258 count++; 259 fileIterator.next(); 260 } 261 return count; 262 } 263 264 public void setDateTimeService(DateTimeService dateTimeService) { 265 this.dateTimeService = dateTimeService; 266 } 267 268 public void setBatchFileDirectoryName(String batchFileDirectoryName) { 269 this.batchFileDirectoryName = batchFileDirectoryName; 270 } 271 }