/* * 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.module.ld.batch.service.impl; import java.io.File; import java.io.IOException; import java.io.PrintStream; import java.sql.Date; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import org.kuali.kfs.gl.GeneralLedgerConstants; import org.kuali.kfs.gl.businessobject.OriginEntryFull; import org.kuali.kfs.gl.businessobject.OriginEntryGroup; import org.kuali.kfs.gl.report.LedgerSummaryReport; import org.kuali.kfs.gl.service.OriginEntryGroupService; import org.kuali.kfs.module.ld.LaborConstants; import org.kuali.kfs.module.ld.batch.service.LaborNightlyOutService; import org.kuali.kfs.module.ld.businessobject.LaborGeneralLedgerEntry; import org.kuali.kfs.module.ld.businessobject.LaborLedgerPendingEntry; import org.kuali.kfs.module.ld.businessobject.LaborOriginEntry; import org.kuali.kfs.module.ld.dataaccess.LaborClearGeneralLedgerEntryDao; import org.kuali.kfs.module.ld.service.LaborLedgerPendingEntryService; import org.kuali.kfs.sys.KFSConstants; import org.kuali.kfs.sys.ObjectUtil; import org.kuali.kfs.sys.batch.service.WrappingBatchService; import org.kuali.kfs.sys.service.ReportWriterService; import org.kuali.rice.core.api.datetime.DateTimeService; import org.kuali.rice.krad.service.BusinessObjectService; import org.springframework.transaction.annotation.Transactional; /** * The class implements loading and cleanup methods for nightly batch jobs */ @Transactional public class LaborNightlyOutServiceImpl implements LaborNightlyOutService { private static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(LaborNightlyOutServiceImpl.class); protected LaborLedgerPendingEntryService laborLedgerPendingEntryService; protected OriginEntryGroupService originEntryGroupService; protected BusinessObjectService businessObjectService; protected DateTimeService dateTimeService; protected String batchFileDirectoryName; protected String batchGlFileDirectoryName; protected LaborClearGeneralLedgerEntryDao laborClearGeneralLedgerEntryDao; protected ReportWriterService laborPendingEntryLedgerReportWriterService; protected ReportWriterService laborGLEntryReportWriterService; /** * @see org.kuali.kfs.module.ld.batch.service.LaborNightlyOutService#deleteCopiedPendingLedgerEntries() */ @Override public void deleteCopiedPendingLedgerEntries() { laborLedgerPendingEntryService.deleteByFinancialDocumentApprovedCode(KFSConstants.PENDING_ENTRY_APPROVED_STATUS_CODE.PROCESSED); } /** * @see org.kuali.kfs.module.ld.batch.service.LaborNightlyOutService#copyApprovedPendingLedgerEntries() */ @Override public void copyApprovedPendingLedgerEntries() { Date runDate = dateTimeService.getCurrentSqlDate(); String outputFile = batchFileDirectoryName + File.separator + LaborConstants.BatchFileSystem.NIGHTLY_OUT_FILE + GeneralLedgerConstants.BatchFileSystem.EXTENSION; PrintStream outputFilePs; try { outputFilePs = new PrintStream(outputFile); } catch (IOException e) { // FIXME: do whatever is supposed to be done here throw new RuntimeException(e); } //TODO:- might need to change this part to use file not collection Collection<OriginEntryFull> group = new ArrayList(); Iterator<LaborLedgerPendingEntry> pendingEntries = laborLedgerPendingEntryService.findApprovedPendingLedgerEntries(); LedgerSummaryReport nightlyOutLedgerSummaryReport = new LedgerSummaryReport(); while (pendingEntries != null && pendingEntries.hasNext()) { LaborLedgerPendingEntry pendingEntry = pendingEntries.next(); LaborOriginEntry entry = new LaborOriginEntry(pendingEntry); // copy the pending entry to labor origin entry table // TODO:- do we need it??? // boolean isSaved = saveAsLaborOriginEntry(pendingEntry, group); boolean isSaved = true; try { outputFilePs.printf("%s\n", entry.getLine()); nightlyOutLedgerSummaryReport.summarizeEntry(entry); } catch (Exception e) { throw new RuntimeException(e); } if (isSaved) { // update the pending entry to indicate it has been copied pendingEntry.setFinancialDocumentApprovedCode(KFSConstants.PENDING_ENTRY_APPROVED_STATUS_CODE.PROCESSED); pendingEntry.setTransactionDate(runDate); businessObjectService.save(pendingEntry); } } outputFilePs.close(); //create done file String doneFileName = outputFile.replace(GeneralLedgerConstants.BatchFileSystem.EXTENSION, GeneralLedgerConstants.BatchFileSystem.DONE_FILE_EXTENSION); File doneFile = new File (doneFileName); if (!doneFile.exists()){ try { doneFile.createNewFile(); } catch (IOException e) { throw new RuntimeException(); } } try { ((WrappingBatchService)laborPendingEntryLedgerReportWriterService).initialize(); nightlyOutLedgerSummaryReport.writeReport(laborPendingEntryLedgerReportWriterService); } finally { ((WrappingBatchService)laborPendingEntryLedgerReportWriterService).destroy(); } } /** * @see org.kuali.kfs.module.ld.batch.service.LaborNightlyOutService#deleteCopiedLaborGenerealLedgerEntries() */ @Override public void deleteCopiedLaborGenerealLedgerEntries() { laborClearGeneralLedgerEntryDao.deleteCopiedLaborGenerealLedgerEntries(); } /** * @see org.kuali.kfs.module.ld.batch.service.LaborNightlyOutService#copyLaborGenerealLedgerEntries() */ @Override public void copyLaborGenerealLedgerEntries() { String outputFile = batchGlFileDirectoryName + File.separator + LaborConstants.BatchFileSystem.LABOR_GL_ENTRY_FILE + GeneralLedgerConstants.BatchFileSystem.EXTENSION; PrintStream outputFilePs; try { outputFilePs = new PrintStream(outputFile); } catch (IOException e) { // FIXME: do whatever is supposed to be done here throw new RuntimeException(e); } // copy the labor general ledger entry to origin entry table Collection<LaborGeneralLedgerEntry> generalLedgerEntries = businessObjectService.findAll(LaborGeneralLedgerEntry.class); int numberOfGLEntries = generalLedgerEntries.size(); LedgerSummaryReport laborGLSummaryReport = new LedgerSummaryReport(); for (LaborGeneralLedgerEntry entry : generalLedgerEntries) { OriginEntryFull originEntry = new OriginEntryFull(); ObjectUtil.buildObject(originEntry, entry); //write to file try { outputFilePs.printf("%s\n", originEntry.getLine()); laborGLSummaryReport.summarizeEntry(originEntry); } catch (Exception e) { throw new RuntimeException(e); } //boolean isSaved = saveAsGLOriginEntry(entry, group); } outputFilePs.close(); //create done file String doneFileName = outputFile.replace(GeneralLedgerConstants.BatchFileSystem.EXTENSION, GeneralLedgerConstants.BatchFileSystem.DONE_FILE_EXTENSION); File doneFile = new File (doneFileName); if (!doneFile.exists()){ try { doneFile.createNewFile(); } catch (IOException e) { throw new RuntimeException(); } } try { ((WrappingBatchService)laborGLEntryReportWriterService).initialize(); laborGLSummaryReport.writeReport(laborGLEntryReportWriterService); } finally { ((WrappingBatchService)laborGLEntryReportWriterService).destroy(); } } /* * save the given pending ledger entry as a labor origin entry */ protected boolean saveAsLaborOriginEntry(LaborLedgerPendingEntry pendingEntry, OriginEntryGroup group) { try { LaborOriginEntry originEntry = new LaborOriginEntry(); ObjectUtil.buildObject(originEntry, pendingEntry); originEntry.setTransactionPostingDate(group.getDate()); originEntry.setEntryGroupId(group.getId()); businessObjectService.save(originEntry); } catch (Exception e) { if (LOG.isDebugEnabled()) { LOG.debug("Fail to copy the pending entry as origin entry" + e); } return false; } return true; } /* * save the given pending ledger entry as a labor origin entry */ protected boolean saveAsLaborOriginEntry(LaborLedgerPendingEntry pendingEntry) { try { LaborOriginEntry originEntry = new LaborOriginEntry(); ObjectUtil.buildObject(originEntry, pendingEntry); //originEntry.setTransactionPostingDate(group.getDate()); //originEntry.setEntryGroupId(group.getId()); businessObjectService.save(originEntry); } catch (Exception e) { if (LOG.isDebugEnabled()) { LOG.debug("Fail to copy the pending entry as origin entry" + e); } return false; } return true; } /* * save the given pending ledger entry as a labor origin entry */ protected boolean saveAsGLOriginEntry(LaborGeneralLedgerEntry entry, OriginEntryGroup group) { try { OriginEntryFull originEntry = new OriginEntryFull(); ObjectUtil.buildObject(originEntry, entry); originEntry.setEntryGroupId(group.getId()); businessObjectService.save(originEntry); } catch (Exception e) { if (LOG.isDebugEnabled()) { LOG.debug("Fail to copy the labor GL entry as an origin entry" + e); } return false; } return true; } /** * Sets the businessObjectService attribute value. * * @param businessObjectService The businessObjectService to set. */ public void setBusinessObjectService(BusinessObjectService businessObjectService) { this.businessObjectService = businessObjectService; } /** * Sets the dateTimeService attribute value. * * @param dateTimeService The dateTimeService to set. */ public void setDateTimeService(DateTimeService dateTimeService) { this.dateTimeService = dateTimeService; } /** * Sets the laborLedgerPendingEntryService attribute value. * * @param laborLedgerPendingEntryService The laborLedgerPendingEntryService to set. */ public void setLaborLedgerPendingEntryService(LaborLedgerPendingEntryService laborLedgerPendingEntryService) { this.laborLedgerPendingEntryService = laborLedgerPendingEntryService; } /** * Sets the originEntryGroupService attribute value. * * @param originEntryGroupService The originEntryGroupService to set. */ public void setOriginEntryGroupService(OriginEntryGroupService originEntryGroupService) { this.originEntryGroupService = originEntryGroupService; } public void setBatchFileDirectoryName(String batchFileDirectoryName) { this.batchFileDirectoryName = batchFileDirectoryName; } public void setBatchGlFileDirectoryName(String batchGlFileDirectoryName) { this.batchGlFileDirectoryName = batchGlFileDirectoryName; } /** * Sets the laborPendingEntryLedgerReportWriterService attribute value. * @param laborPendingEntryLedgerReportWriterService The laborPendingEntryLedgerReportWriterService to set. */ public void setLaborPendingEntryLedgerReportWriterService(ReportWriterService laborPendingEntryLedgerReportWriterService) { this.laborPendingEntryLedgerReportWriterService = laborPendingEntryLedgerReportWriterService; } /** * Sets the laborGLEntryReportWriterService attribute value. * @param laborGLEntryReportWriterService The laborGLEntryReportWriterService to set. */ public void setLaborGLEntryReportWriterService(ReportWriterService laborGLEntryReportWriterService) { this.laborGLEntryReportWriterService = laborGLEntryReportWriterService; } /** * Gets the laborClearGeneralLedgerEntryDao attribute. * * @return Returns the laborClearGeneralLedgerEntryDao. */ protected LaborClearGeneralLedgerEntryDao getLaborClearGeneralLedgerEntryDao() { return laborClearGeneralLedgerEntryDao; } /** * Sets the laborClearGeneralLedgerEntryDao attribute value. * * @param laborClearGeneralLedgerEntryDao The laborClearGeneralLedgerEntryDao to set. */ public void setLaborClearGeneralLedgerEntryDao(LaborClearGeneralLedgerEntryDao laborClearGeneralLedgerEntryDao) { this.laborClearGeneralLedgerEntryDao = laborClearGeneralLedgerEntryDao; } }