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.module.ld.batch.service.impl;
017
018 import java.io.File;
019 import java.io.IOException;
020 import java.io.PrintStream;
021 import java.sql.Date;
022 import java.util.ArrayList;
023 import java.util.Collection;
024 import java.util.Iterator;
025
026 import org.kuali.kfs.gl.GeneralLedgerConstants;
027 import org.kuali.kfs.gl.businessobject.OriginEntryFull;
028 import org.kuali.kfs.gl.businessobject.OriginEntryGroup;
029 import org.kuali.kfs.gl.report.LedgerSummaryReport;
030 import org.kuali.kfs.gl.service.OriginEntryGroupService;
031 import org.kuali.kfs.module.ld.LaborConstants;
032 import org.kuali.kfs.module.ld.batch.service.LaborNightlyOutService;
033 import org.kuali.kfs.module.ld.businessobject.LaborGeneralLedgerEntry;
034 import org.kuali.kfs.module.ld.businessobject.LaborLedgerPendingEntry;
035 import org.kuali.kfs.module.ld.businessobject.LaborOriginEntry;
036 import org.kuali.kfs.module.ld.dataaccess.LaborClearGeneralLedgerEntryDao;
037 import org.kuali.kfs.module.ld.service.LaborLedgerPendingEntryService;
038 import org.kuali.kfs.sys.KFSConstants;
039 import org.kuali.kfs.sys.ObjectUtil;
040 import org.kuali.kfs.sys.batch.service.WrappingBatchService;
041 import org.kuali.kfs.sys.service.ReportWriterService;
042 import org.kuali.rice.kns.service.BusinessObjectService;
043 import org.kuali.rice.kns.service.DateTimeService;
044 import org.kuali.rice.kns.util.ObjectUtils;
045 import org.springframework.transaction.annotation.Transactional;
046
047 /**
048 * The class implements loading and cleanup methods for nightly batch jobs
049 */
050 @Transactional
051 public class LaborNightlyOutServiceImpl implements LaborNightlyOutService {
052 private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(LaborNightlyOutServiceImpl.class);
053
054 private LaborLedgerPendingEntryService laborLedgerPendingEntryService;
055 private OriginEntryGroupService originEntryGroupService;
056
057 private BusinessObjectService businessObjectService;
058 private DateTimeService dateTimeService;
059 private String batchFileDirectoryName;
060 private String batchGlFileDirectoryName;
061
062 private LaborClearGeneralLedgerEntryDao laborClearGeneralLedgerEntryDao;
063
064 private ReportWriterService laborPendingEntryLedgerReportWriterService;
065 private ReportWriterService laborGLEntryReportWriterService;
066
067 /**
068 * @see org.kuali.kfs.module.ld.batch.service.LaborNightlyOutService#deleteCopiedPendingLedgerEntries()
069 */
070 public void deleteCopiedPendingLedgerEntries() {
071 laborLedgerPendingEntryService.deleteByFinancialDocumentApprovedCode(KFSConstants.PENDING_ENTRY_APPROVED_STATUS_CODE.PROCESSED);
072 }
073
074 /**
075 * @see org.kuali.kfs.module.ld.batch.service.LaborNightlyOutService#copyApprovedPendingLedgerEntries()
076 */
077 public void copyApprovedPendingLedgerEntries() {
078 Date runDate = dateTimeService.getCurrentSqlDate();
079
080 String outputFile = batchFileDirectoryName + File.separator + LaborConstants.BatchFileSystem.NIGHTLY_OUT_FILE + GeneralLedgerConstants.BatchFileSystem.EXTENSION;
081 PrintStream outputFilePs;
082
083 try {
084 outputFilePs = new PrintStream(outputFile);
085 }
086 catch (IOException e) {
087 // FIXME: do whatever is supposed to be done here
088 throw new RuntimeException(e);
089 }
090
091 //TODO:- might need to change this part to use file not collection
092 Collection<OriginEntryFull> group = new ArrayList();
093 Iterator<LaborLedgerPendingEntry> pendingEntries = laborLedgerPendingEntryService.findApprovedPendingLedgerEntries();
094
095 LedgerSummaryReport nightlyOutLedgerSummaryReport = new LedgerSummaryReport();
096 while (pendingEntries != null && pendingEntries.hasNext()) {
097 LaborLedgerPendingEntry pendingEntry = pendingEntries.next();
098 LaborOriginEntry entry = new LaborOriginEntry(pendingEntry);
099 // copy the pending entry to labor origin entry table
100 // TODO:- do we need it???
101 // boolean isSaved = saveAsLaborOriginEntry(pendingEntry, group);
102 boolean isSaved = true;
103
104 try {
105 outputFilePs.printf("%s\n", entry.getLine());
106 nightlyOutLedgerSummaryReport.summarizeEntry(entry);
107 } catch (Exception e) {
108 throw new RuntimeException(e);
109 }
110
111 if (isSaved) {
112 // update the pending entry to indicate it has been copied
113 pendingEntry.setFinancialDocumentApprovedCode(KFSConstants.PENDING_ENTRY_APPROVED_STATUS_CODE.PROCESSED);
114 pendingEntry.setTransactionDate(runDate);
115 businessObjectService.save(pendingEntry);
116 }
117 }
118
119 outputFilePs.close();
120
121 //create done file
122 String doneFileName = outputFile.replace(GeneralLedgerConstants.BatchFileSystem.EXTENSION, GeneralLedgerConstants.BatchFileSystem.DONE_FILE_EXTENSION);
123 File doneFile = new File (doneFileName);
124 if (!doneFile.exists()){
125 try {
126 doneFile.createNewFile();
127 } catch (IOException e) {
128 throw new RuntimeException();
129 }
130 }
131
132 try {
133 ((WrappingBatchService)laborPendingEntryLedgerReportWriterService).initialize();
134 nightlyOutLedgerSummaryReport.writeReport(laborPendingEntryLedgerReportWriterService);
135 } finally {
136 ((WrappingBatchService)laborPendingEntryLedgerReportWriterService).destroy();
137 }
138 }
139
140 /**
141 * @see org.kuali.kfs.module.ld.batch.service.LaborNightlyOutService#deleteCopiedLaborGenerealLedgerEntries()
142 */
143 public void deleteCopiedLaborGenerealLedgerEntries() {
144 laborClearGeneralLedgerEntryDao.deleteCopiedLaborGenerealLedgerEntries();
145 }
146
147 /**
148 * @see org.kuali.kfs.module.ld.batch.service.LaborNightlyOutService#copyLaborGenerealLedgerEntries()
149 */
150 public void copyLaborGenerealLedgerEntries() {
151 String outputFile = batchGlFileDirectoryName + File.separator + LaborConstants.BatchFileSystem.LABOR_GL_ENTRY_FILE + GeneralLedgerConstants.BatchFileSystem.EXTENSION;
152 PrintStream outputFilePs;
153
154 try {
155 outputFilePs = new PrintStream(outputFile);
156 }
157 catch (IOException e) {
158 // FIXME: do whatever is supposed to be done here
159 throw new RuntimeException(e);
160 }
161
162 // copy the labor general ledger entry to origin entry table
163 Collection<LaborGeneralLedgerEntry> generalLedgerEntries = businessObjectService.findAll(LaborGeneralLedgerEntry.class);
164 int numberOfGLEntries = generalLedgerEntries.size();
165
166 LedgerSummaryReport laborGLSummaryReport = new LedgerSummaryReport();
167 for (LaborGeneralLedgerEntry entry : generalLedgerEntries) {
168 OriginEntryFull originEntry = new OriginEntryFull();
169 ObjectUtil.buildObject(originEntry, entry);
170
171 //write to file
172 try {
173 outputFilePs.printf("%s\n", originEntry.getLine());
174 laborGLSummaryReport.summarizeEntry(originEntry);
175 } catch (Exception e) {
176 throw new RuntimeException(e);
177 }
178 //boolean isSaved = saveAsGLOriginEntry(entry, group);
179 }
180
181 outputFilePs.close();
182
183 //create done file
184 String doneFileName = outputFile.replace(GeneralLedgerConstants.BatchFileSystem.EXTENSION, GeneralLedgerConstants.BatchFileSystem.DONE_FILE_EXTENSION);
185 File doneFile = new File (doneFileName);
186 if (!doneFile.exists()){
187 try {
188 doneFile.createNewFile();
189 } catch (IOException e) {
190 throw new RuntimeException();
191 }
192 }
193
194 try {
195 ((WrappingBatchService)laborGLEntryReportWriterService).initialize();
196 laborGLSummaryReport.writeReport(laborGLEntryReportWriterService);
197 } finally {
198 ((WrappingBatchService)laborGLEntryReportWriterService).destroy();
199 }
200 }
201
202 /*
203 * save the given pending ledger entry as a labor origin entry
204 */
205 protected boolean saveAsLaborOriginEntry(LaborLedgerPendingEntry pendingEntry, OriginEntryGroup group) {
206 try {
207 LaborOriginEntry originEntry = new LaborOriginEntry();
208 ObjectUtil.buildObject(originEntry, pendingEntry);
209
210 originEntry.setTransactionPostingDate(group.getDate());
211 originEntry.setEntryGroupId(group.getId());
212
213 businessObjectService.save(originEntry);
214 }
215 catch (Exception e) {
216 LOG.debug("Fail to copy the pending entry as origin entry" + e);
217 return false;
218 }
219 return true;
220 }
221
222 /*
223 * save the given pending ledger entry as a labor origin entry
224 */
225 protected boolean saveAsLaborOriginEntry(LaborLedgerPendingEntry pendingEntry) {
226 try {
227 LaborOriginEntry originEntry = new LaborOriginEntry();
228 ObjectUtil.buildObject(originEntry, pendingEntry);
229
230 //originEntry.setTransactionPostingDate(group.getDate());
231 //originEntry.setEntryGroupId(group.getId());
232
233 businessObjectService.save(originEntry);
234 }
235 catch (Exception e) {
236 LOG.debug("Fail to copy the pending entry as origin entry" + e);
237 return false;
238 }
239 return true;
240 }
241
242 /*
243 * save the given pending ledger entry as a labor origin entry
244 */
245 protected boolean saveAsGLOriginEntry(LaborGeneralLedgerEntry entry, OriginEntryGroup group) {
246 try {
247 OriginEntryFull originEntry = new OriginEntryFull();
248 ObjectUtil.buildObject(originEntry, entry);
249
250 originEntry.setEntryGroupId(group.getId());
251 businessObjectService.save(originEntry);
252 }
253 catch (Exception e) {
254 LOG.debug("Fail to copy the labor GL entry as an origin entry" + e);
255 return false;
256 }
257 return true;
258 }
259
260 /**
261 * Sets the businessObjectService attribute value.
262 *
263 * @param businessObjectService The businessObjectService to set.
264 */
265 public void setBusinessObjectService(BusinessObjectService businessObjectService) {
266 this.businessObjectService = businessObjectService;
267 }
268
269 /**
270 * Sets the dateTimeService attribute value.
271 *
272 * @param dateTimeService The dateTimeService to set.
273 */
274 public void setDateTimeService(DateTimeService dateTimeService) {
275 this.dateTimeService = dateTimeService;
276 }
277
278 /**
279 * Sets the laborLedgerPendingEntryService attribute value.
280 *
281 * @param laborLedgerPendingEntryService The laborLedgerPendingEntryService to set.
282 */
283 public void setLaborLedgerPendingEntryService(LaborLedgerPendingEntryService laborLedgerPendingEntryService) {
284 this.laborLedgerPendingEntryService = laborLedgerPendingEntryService;
285 }
286
287 /**
288 * Sets the originEntryGroupService attribute value.
289 *
290 * @param originEntryGroupService The originEntryGroupService to set.
291 */
292 public void setOriginEntryGroupService(OriginEntryGroupService originEntryGroupService) {
293 this.originEntryGroupService = originEntryGroupService;
294 }
295
296 public void setBatchFileDirectoryName(String batchFileDirectoryName) {
297 this.batchFileDirectoryName = batchFileDirectoryName;
298 }
299
300 public void setBatchGlFileDirectoryName(String batchGlFileDirectoryName) {
301 this.batchGlFileDirectoryName = batchGlFileDirectoryName;
302 }
303
304 /**
305 * Sets the laborPendingEntryLedgerReportWriterService attribute value.
306 * @param laborPendingEntryLedgerReportWriterService The laborPendingEntryLedgerReportWriterService to set.
307 */
308 public void setLaborPendingEntryLedgerReportWriterService(ReportWriterService laborPendingEntryLedgerReportWriterService) {
309 this.laborPendingEntryLedgerReportWriterService = laborPendingEntryLedgerReportWriterService;
310 }
311
312 /**
313 * Sets the laborGLEntryReportWriterService attribute value.
314 * @param laborGLEntryReportWriterService The laborGLEntryReportWriterService to set.
315 */
316 public void setLaborGLEntryReportWriterService(ReportWriterService laborGLEntryReportWriterService) {
317 this.laborGLEntryReportWriterService = laborGLEntryReportWriterService;
318 }
319
320 /**
321 * Gets the laborClearGeneralLedgerEntryDao attribute.
322 *
323 * @return Returns the laborClearGeneralLedgerEntryDao.
324 */
325 protected LaborClearGeneralLedgerEntryDao getLaborClearGeneralLedgerEntryDao() {
326 return laborClearGeneralLedgerEntryDao;
327 }
328
329 /**
330 * Sets the laborClearGeneralLedgerEntryDao attribute value.
331 *
332 * @param laborClearGeneralLedgerEntryDao The laborClearGeneralLedgerEntryDao to set.
333 */
334 public void setLaborClearGeneralLedgerEntryDao(LaborClearGeneralLedgerEntryDao laborClearGeneralLedgerEntryDao) {
335 this.laborClearGeneralLedgerEntryDao = laborClearGeneralLedgerEntryDao;
336 }
337
338
339 }