View Javadoc
1   /*
2    * Copyright 2006 The Kuali Foundation
3    * 
4    * Licensed under the Educational Community License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    * 
8    * http://www.opensource.org/licenses/ecl2.php
9    * 
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  package org.kuali.ole.gl.batch.service.impl;
17  
18  import java.io.File;
19  import java.io.FileNotFoundException;
20  import java.io.PrintStream;
21  import java.sql.Date;
22  import java.util.HashMap;
23  import java.util.Iterator;
24  import java.util.Map;
25  import java.util.Set;
26  
27  import org.kuali.ole.coa.service.BalanceTypeService;
28  import org.kuali.ole.coa.service.ObjectTypeService;
29  import org.kuali.ole.coa.service.PriorYearAccountService;
30  import org.kuali.ole.coa.service.SubFundGroupService;
31  import org.kuali.ole.gl.GeneralLedgerConstants;
32  import org.kuali.ole.gl.batch.BalanceForwardRuleHelper;
33  import org.kuali.ole.gl.batch.NominalActivityClosingHelper;
34  import org.kuali.ole.gl.batch.dataaccess.YearEndDao;
35  import org.kuali.ole.gl.batch.service.EncumbranceClosingOriginEntryGenerationService;
36  import org.kuali.ole.gl.batch.service.YearEndService;
37  import org.kuali.ole.gl.batch.service.impl.exception.FatalErrorException;
38  import org.kuali.ole.gl.businessobject.Balance;
39  import org.kuali.ole.gl.businessobject.Encumbrance;
40  import org.kuali.ole.gl.businessobject.OriginEntryFull;
41  import org.kuali.ole.gl.dataaccess.EncumbranceDao;
42  import org.kuali.ole.gl.report.LedgerSummaryReport;
43  import org.kuali.ole.gl.service.BalanceService;
44  import org.kuali.ole.gl.service.OriginEntryGroupService;
45  import org.kuali.ole.gl.service.OriginEntryService;
46  import org.kuali.ole.sys.OLEConstants;
47  import org.kuali.ole.sys.OLEKeyConstants;
48  import org.kuali.ole.sys.service.ReportWriterService;
49  import org.kuali.rice.core.api.config.property.ConfigurationService;
50  import org.kuali.rice.core.api.datetime.DateTimeService;
51  import org.kuali.rice.coreservice.framework.parameter.ParameterService;
52  import org.kuali.rice.krad.service.PersistenceService;
53  import org.springframework.transaction.annotation.Transactional;
54  
55  /**
56   * This class implements the logic to perform year end tasks.
57   */
58  @Transactional
59  public class YearEndServiceImpl implements YearEndService {
60      private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(YearEndServiceImpl.class);
61  
62      private EncumbranceDao encumbranceDao;
63      private OriginEntryService originEntryService;
64      private OriginEntryGroupService originEntryGroupService;
65      private DateTimeService dateTimeService;
66      private BalanceService balanceService;
67      private BalanceTypeService balanceTypeService;
68      private ObjectTypeService objectTypeService;
69      private ParameterService parameterService;
70      private ConfigurationService configurationService;
71      private PriorYearAccountService priorYearAccountService;
72      private SubFundGroupService subFundGroupService;
73      private PersistenceService persistenceService;
74      private YearEndDao yearEndDao;
75      private String batchFileDirectoryName;
76      private EncumbranceClosingOriginEntryGenerationService encumbranceClosingOriginEntryGenerationService;
77      private ReportWriterService nominalActivityClosingReportWriterService;
78      private ReportWriterService balanceForwardReportWriterService;
79      private ReportWriterService encumbranceClosingReportWriterService;
80  
81      public static final String TRANSACTION_DATE_FORMAT_STRING = "yyyy-MM-dd";
82  
83      /**
84       * Constructs a YearEndServiceImpl, and that's about it.
85       */
86      public YearEndServiceImpl() {
87          super();
88      }
89  
90      /**
91       * This class actually generates all the origin entries for nominal activity closing and saves them to the proper origin entry
92       * group. Note: Much (but no longer all) of the original COBOL program this code is based off of is within the comments.
93       * 
94       * @param nominalClosingOriginEntryGroup the origin entry group to save the generated nominal closing entries to
95       * @param nominalClosingJobParameters a map of parameters for the job:
96       * @param nominalClosingCounts various statistical counts
97       * @see org.kuali.ole.gl.batch.service.YearEndService#closeNominalActivity()
98       */
99      public void closeNominalActivity(String nominalClosingFileName, Map nominalClosingJobParameters) {
100 
101         Integer varFiscalYear = (Integer) nominalClosingJobParameters.get(GeneralLedgerConstants.ColumnNames.UNIVERSITY_FISCAL_YEAR);
102         NominalActivityClosingHelper closingHelper = new NominalActivityClosingHelper(varFiscalYear, (Date) nominalClosingJobParameters.get(GeneralLedgerConstants.ColumnNames.UNIV_DT), parameterService, configurationService);
103         
104         closingHelper.addNominalClosingJobParameters(nominalClosingJobParameters);
105 
106         Map<String, Integer> nominalActivityClosingCounts = new HashMap<String, Integer>();
107         
108         nominalActivityClosingCounts.put("globalReadCount", new Integer(balanceService.countBalancesForFiscalYear(varFiscalYear)));
109         Iterator<Balance> balanceIterator = balanceService.findNominalActivityBalancesForFiscalYear(varFiscalYear);
110 
111         String accountNumberHold = null;
112 
113         boolean selectSw = false;
114 
115         nominalActivityClosingCounts.put("globalSelectCount", new Integer(0));
116         nominalActivityClosingCounts.put("sequenceNumber", new Integer(0));
117         nominalActivityClosingCounts.put("sequenceWriteCount", new Integer(0));
118         nominalActivityClosingCounts.put("sequenceCheckCount", new Integer(0));
119 
120         boolean nonFatalErrorFlag = false;
121 
122         //create files
123         File nominalClosingFile = new File(batchFileDirectoryName + File.separator + nominalClosingFileName);
124         PrintStream nominalClosingPs = null;
125         
126         try {
127             nominalClosingPs = new PrintStream(nominalClosingFile);
128         } catch (FileNotFoundException e) {
129             throw new RuntimeException("nominalClosingFile Files doesn't exist " + nominalClosingFileName);
130         }
131         
132         LedgerSummaryReport ledgerReport = new LedgerSummaryReport();
133         
134         while (balanceIterator.hasNext()) {
135 
136             Balance balance = balanceIterator.next();
137             balance.refreshReferenceObject("option");
138 
139             selectSw = true;
140 
141             try {
142                 if (LOG.isDebugEnabled()) {
143                     LOG.debug("Balance selected.");
144                 }
145                 if (balance.getAccountNumber().equals(accountNumberHold)) {
146                     incrementCount(nominalActivityClosingCounts, "sequenceNumber");
147                 }
148                 else {
149                     nominalActivityClosingCounts.put("sequenceNumber", new Integer(1));
150                 }
151                 incrementCount(nominalActivityClosingCounts, "globalSelectCount");
152                 OriginEntryFull activityEntry = closingHelper.generateActivityEntry(balance, new Integer(1));
153                 originEntryService.createEntry(activityEntry, nominalClosingPs);
154                 ledgerReport.summarizeEntry(activityEntry);
155                 incrementCount(nominalActivityClosingCounts, "sequenceWriteCount");
156                 nominalActivityClosingCounts.put("sequenceCheckCount", new Integer(nominalActivityClosingCounts.get("sequenceWriteCount").intValue()));
157                 if (0 == nominalActivityClosingCounts.get("sequenceCheckCount").intValue() % 1000) {
158                     LOG.info(new StringBuffer("  SEQUENTIAL RECORDS WRITTEN = ").append(nominalActivityClosingCounts.get("sequenceCheckCount")).toString());
159                 }
160                 OriginEntryFull offsetEntry = closingHelper.generateOffset(balance, new Integer(1));           
161                 originEntryService.createEntry(offsetEntry, nominalClosingPs);
162                 ledgerReport.summarizeEntry(offsetEntry);
163                 incrementCount(nominalActivityClosingCounts, "sequenceWriteCount");
164                 nominalActivityClosingCounts.put("sequenceCheckCount", new Integer(nominalActivityClosingCounts.get("sequenceWriteCount").intValue()));
165                 if (0 == nominalActivityClosingCounts.get("sequenceCheckCount").intValue() % 1000) {
166                     LOG.info(new StringBuffer(" ORIGIN ENTRIES INSERTED = ").append(nominalActivityClosingCounts.get("sequenceCheckCount")).toString());
167                 }
168                 if (nominalActivityClosingCounts.get("globalSelectCount").intValue() % 1000 == 0) {
169                 //    persistenceService.clearCache();
170                 }
171                 accountNumberHold = balance.getAccountNumber();
172             }
173             catch (FatalErrorException fee) {
174                 LOG.warn("Failed to create entry pair for balance.", fee);
175             }
176         }
177         nominalActivityClosingCounts.put("nonFatalCount", closingHelper.getNonFatalErrorCount());
178         nominalClosingPs.close();
179         
180         // now write parameters
181         for (Object jobParameterKeyAsObject : nominalClosingJobParameters.keySet()) {
182             if (jobParameterKeyAsObject != null) {
183                 final String jobParameterKey = jobParameterKeyAsObject.toString();
184                 getNominalActivityClosingReportWriterService().writeParameterLine("%32s %10s", jobParameterKey, nominalClosingJobParameters.get(jobParameterKey));
185             }
186         }
187         
188         // now write statistics
189         getNominalActivityClosingReportWriterService().writeStatisticLine("NUMBER OF GLBL RECORDS READ       %9d", nominalActivityClosingCounts.get("globalReadCount"));
190         getNominalActivityClosingReportWriterService().writeStatisticLine("NUMBER OF GLBL RECORDS SELECTED   %9d", nominalActivityClosingCounts.get("globalSelectCount"));
191         getNominalActivityClosingReportWriterService().writeStatisticLine("NUMBER OF SEQ RECORDS WRITTEN     %9d", nominalActivityClosingCounts.get("sequenceWriteCount"));
192         getNominalActivityClosingReportWriterService().pageBreak();
193         
194         // finally, put a header on the ledger report and write it
195         getNominalActivityClosingReportWriterService().writeSubTitle(configurationService.getPropertyValueAsString(OLEKeyConstants.MESSAGE_REPORT_YEAR_END_NOMINAL_ACTIVITY_CLOSING_LEDGER_TITLE_LINE));
196         ledgerReport.writeReport(getNominalActivityClosingReportWriterService());
197     }
198 
199     /**
200      * A method that increments a count within a Map by 1
201      * 
202      * @param counts a Map of count statistics
203      * @param countName the name of the specific count ot update
204      * @return the newly incremented amount
205      */
206     protected int incrementCount(Map<String, Integer> counts, String countName) {
207         Integer value = counts.get(countName);
208         int incremented = value.intValue() + 1;
209         counts.put(countName, new Integer(incremented));
210         return incremented;
211     }
212 
213     /**
214      * This method handles executing the loop over all balances, and generating reports on the balance forwarding process as a
215      * whole. This method delegates all of the specific logic in terms of what balances to forward, according to what criteria, how
216      * origin entries are generated, etc. This relationship makes YearEndServiceImpl and BalanceForwardRuleHelper heavily dependent
217      * upon one another in terms of expected behavior.
218      * 
219      * @param balanceForwardsUnclosedPriorYearAccountGroup the origin entry group to save balance forwarding origin entries with
220      *        open accounts
221      * @param balanceForwardsClosedPriorYearAccountGroup the origin entry group to save balance forwarding origin entries with
222      *        closed accounts
223      * @param balanceForwardRuleHelper the BalanceForwardRuleHelper which holds the important state - the job parameters and
224      *        statistics - for the job to run
225      */
226     public void forwardBalances(String balanceForwardsUnclosedFileName, String balanceForwardsclosedFileName, BalanceForwardRuleHelper balanceForwardRuleHelper) {
227         LOG.debug("forwardBalances() started");
228 
229         // The rule helper maintains the state of the overall processing of the entire
230         // set of year end balances. This state is available via balanceForwardRuleHelper.getState().
231         // The helper and this class (YearEndServiceImpl) are heavily dependent upon one
232         // another in terms of expected behavior and shared responsibilities.
233         balanceForwardRuleHelper.setPriorYearAccountService(priorYearAccountService);
234         balanceForwardRuleHelper.setSubFundGroupService(subFundGroupService);
235         balanceForwardRuleHelper.setOriginEntryService(originEntryService);
236         balanceForwardRuleHelper.getState().setGlobalReadCount(balanceService.countBalancesForFiscalYear(balanceForwardRuleHelper.getClosingFiscalYear()));
237 
238         Balance balance;
239 
240         //create files
241         File unclosedOutputFile = new File(batchFileDirectoryName + File.separator + balanceForwardsUnclosedFileName);
242         File closedOutputFile = new File(batchFileDirectoryName + File.separator + balanceForwardsclosedFileName);
243         PrintStream unclosedPs = null;
244         PrintStream closedPs = null;
245         
246         try {
247             unclosedPs = new PrintStream(unclosedOutputFile);
248             closedPs = new PrintStream(closedOutputFile);
249         } catch (FileNotFoundException e) {
250             throw new RuntimeException("balanceForwards Files don't exist " + balanceForwardsUnclosedFileName + " and " + balanceForwardsclosedFileName);
251         }
252         
253         // do the general forwards
254         Iterator<Balance> generalBalances = balanceService.findGeneralBalancesToForwardForFiscalYear(balanceForwardRuleHelper.getClosingFiscalYear());
255         while (generalBalances.hasNext()) {
256             balance = generalBalances.next();
257             balanceForwardRuleHelper.processGeneralForwardBalance(balance, closedPs, unclosedPs);
258             if (balanceForwardRuleHelper.getState().getGlobalSelectCount() % 1000 == 0) {
259               //  persistenceService.clearCache();
260             }
261         }
262 
263         // do the cumulative forwards
264         Iterator<Balance> cumulativeBalances = balanceService.findCumulativeBalancesToForwardForFiscalYear(balanceForwardRuleHelper.getClosingFiscalYear());
265         while (cumulativeBalances.hasNext()) {
266             balance = cumulativeBalances.next();
267             balanceForwardRuleHelper.processCumulativeForwardBalance(balance, closedPs, unclosedPs);
268             if (balanceForwardRuleHelper.getState().getGlobalSelectCount() % 1000 == 0) {
269             //    persistenceService.clearCache();
270             }
271         }
272 
273         // write parameters
274         getBalanceForwardReportWriterService().writeParameterLine("%32s %10s", GeneralLedgerConstants.ANNUAL_CLOSING_TRANSACTION_DATE_PARM, balanceForwardRuleHelper.getTransactionDate().toString());
275         getBalanceForwardReportWriterService().writeParameterLine("%32s %10s", GeneralLedgerConstants.ANNUAL_CLOSING_FISCAL_YEAR_PARM, balanceForwardRuleHelper.getClosingFiscalYear().toString());
276         getBalanceForwardReportWriterService().writeParameterLine("%32s %10s", OLEConstants.SystemGroupParameterNames.GL_ANNUAL_CLOSING_DOC_TYPE, balanceForwardRuleHelper.getAnnualClosingDocType());
277         getBalanceForwardReportWriterService().writeParameterLine("%32s %10s", OLEConstants.SystemGroupParameterNames.GL_ORIGINATION_CODE, balanceForwardRuleHelper.getGlOriginationCode());
278         
279         // write statistics
280         getBalanceForwardReportWriterService().writeStatisticLine("NUMBER OF GLBL RECORDS READ....: %10d", balanceForwardRuleHelper.getState().getGlobalReadCount());
281         getBalanceForwardReportWriterService().writeStatisticLine("NUMBER OF GLBL RECORDS SELECTED: %10d", balanceForwardRuleHelper.getState().getGlobalSelectCount());
282         getBalanceForwardReportWriterService().writeStatisticLine("NUMBER OF SEQ RECORDS WRITTEN..: %10d", balanceForwardRuleHelper.getState().getSequenceWriteCount());
283         getBalanceForwardReportWriterService().writeStatisticLine("RECORDS FOR CLOSED ACCOUNTS....: %10d", balanceForwardRuleHelper.getState().getSequenceClosedCount());
284         getBalanceForwardReportWriterService().pageBreak();
285         
286         // write ledger reports
287         getBalanceForwardReportWriterService().writeSubTitle(configurationService.getPropertyValueAsString(OLEKeyConstants.MESSAGE_REPORT_YEAR_END_BALANCE_FORWARD_OPEN_ACCOUNT_LEDGER_TITLE_LINE));
288         balanceForwardRuleHelper.writeOpenAccountBalanceForwardLedgerSummaryReport(getBalanceForwardReportWriterService());
289         getBalanceForwardReportWriterService().writeNewLines(4);
290         getBalanceForwardReportWriterService().writeSubTitle(configurationService.getPropertyValueAsString(OLEKeyConstants.MESSAGE_REPORT_YEAR_END_BALANCE_FORWARD_CLOSED_ACCOUNT_LEDGER_TITLE_LINE));
291         balanceForwardRuleHelper.writeClosedAccountBalanceForwardLedgerSummaryReport(getBalanceForwardReportWriterService());
292     }
293 
294     /**
295      * Create origin entries to carry forward all open encumbrances from the closing fiscal year into the opening fiscal year.
296      * 
297      * @param originEntryGroup the origin entry group where generated origin entries should be saved
298      * @param jobParameters the parameters necessary to run this job: the fiscal year to close and the university date the job was
299      *        run
300      * @param forwardEncumbrancesCounts the statistical counts generated by this job
301      */
302     public void forwardEncumbrances(String encumbranceForwardFileName, Map jobParameters, Map<String, Integer> counts) {
303         LOG.debug("forwardEncumbrances() started");
304 
305         // counters for the report
306         counts.put("encumbrancesRead", new Integer(0));
307         counts.put("encumbrancesSelected", new Integer(0));
308         counts.put("originEntriesWritten", new Integer(0));
309         
310         LedgerSummaryReport forwardEncumbranceLedgerReport = new LedgerSummaryReport();
311 
312         //create files
313         File encumbranceForwardFile = new File(batchFileDirectoryName + File.separator + encumbranceForwardFileName);
314         PrintStream encumbranceForwardPs = null;
315         
316         try {
317             encumbranceForwardPs = new PrintStream(encumbranceForwardFile);
318         } catch (FileNotFoundException e) {
319             throw new RuntimeException("nominalClosingFile Files doesn't exist " + encumbranceForwardFileName);
320         }
321 
322         // encumbranceDao will return all encumbrances for the fiscal year sorted properly by all of the appropriate keys.
323         Iterator encumbranceIterator = encumbranceDao.getEncumbrancesToClose((Integer) jobParameters.get(GeneralLedgerConstants.ColumnNames.UNIVERSITY_FISCAL_YEAR));
324         while (encumbranceIterator.hasNext()) {
325 
326             Encumbrance encumbrance = (Encumbrance) encumbranceIterator.next();
327             incrementCount(counts, "encumbrancesRead");
328             
329             // if the encumbrance is not completely relieved
330             if (getEncumbranceClosingOriginEntryGenerationService().shouldForwardEncumbrance(encumbrance)) {
331 
332                 incrementCount(counts, "encumbrancesSelected");
333 
334                 // build a pair of origin entries to carry forward the encumbrance.
335                 OriginEntryOffsetPair beginningBalanceEntryPair = getEncumbranceClosingOriginEntryGenerationService().createBeginningBalanceEntryOffsetPair(encumbrance, (Integer) jobParameters.get(GeneralLedgerConstants.ColumnNames.UNIVERSITY_FISCAL_YEAR), (Date) jobParameters.get(GeneralLedgerConstants.ColumnNames.UNIV_DT));
336 
337                 if (beginningBalanceEntryPair.isFatalErrorFlag()) {
338 
339                     continue;
340 
341                 }
342                 else {
343                     // save the entries.
344                     originEntryService.createEntry(beginningBalanceEntryPair.getEntry(), encumbranceForwardPs);
345                     forwardEncumbranceLedgerReport.summarizeEntry(beginningBalanceEntryPair.getEntry());
346                     originEntryService.createEntry(beginningBalanceEntryPair.getOffset(), encumbranceForwardPs);
347                     forwardEncumbranceLedgerReport.summarizeEntry(beginningBalanceEntryPair.getOffset());
348                     incrementCount(counts, "originEntriesWritten");
349                     incrementCount(counts, "originEntriesWritten");
350                     if (0 == counts.get("originEntriesWritten").intValue() % 1000) {
351                         LOG.info(new StringBuffer(" ORIGIN ENTRIES INSERTED = ").append(counts.get("originEntriesWritten")).toString());
352                     }
353                 }
354 
355                 // handle cost sharing if appropriate.
356                 boolean isEligibleForCostShare = false;
357                 try {
358                     isEligibleForCostShare = this.getEncumbranceClosingOriginEntryGenerationService().shouldForwardCostShareForEncumbrance(beginningBalanceEntryPair.getEntry(), beginningBalanceEntryPair.getOffset(), encumbrance, beginningBalanceEntryPair.getEntry().getFinancialObjectTypeCode());
359                 }
360                 catch (FatalErrorException fee) {
361                     LOG.info(fee.getMessage());
362                 }
363 
364                 if (isEligibleForCostShare) {
365                     // build and save an additional pair of origin entries to carry forward the encumbrance.
366                     OriginEntryOffsetPair costShareBeginningBalanceEntryPair = getEncumbranceClosingOriginEntryGenerationService().createCostShareBeginningBalanceEntryOffsetPair(encumbrance, (Date) jobParameters.get(GeneralLedgerConstants.ColumnNames.UNIV_DT));
367                     if (!costShareBeginningBalanceEntryPair.isFatalErrorFlag()) {
368                         // save the cost share entries.
369                         originEntryService.createEntry(costShareBeginningBalanceEntryPair.getEntry(), encumbranceForwardPs);
370                         forwardEncumbranceLedgerReport.summarizeEntry(costShareBeginningBalanceEntryPair.getEntry());
371                         originEntryService.createEntry(costShareBeginningBalanceEntryPair.getOffset(), encumbranceForwardPs);
372                         forwardEncumbranceLedgerReport.summarizeEntry(costShareBeginningBalanceEntryPair.getOffset());
373                         incrementCount(counts, "originEntriesWritten");
374                         incrementCount(counts, "originEntriesWritten");
375                         if (0 == counts.get("originEntriesWritten").intValue() % 1000) {
376                             LOG.info(new StringBuffer(" ORIGIN ENTRIES INSERTED = ").append(counts.get("originEntriesWritten")).toString());
377                         }
378                     }
379                 }
380             }
381             if (counts.get("encumbrancesSelected").intValue() % 1000 == 0) {
382              //   persistenceService.clearCache();
383             }
384         }
385         encumbranceForwardPs.close();
386         
387         // write job parameters
388         for (Object jobParameterKeyAsObject : jobParameters.keySet()) {
389             if (jobParameterKeyAsObject != null) {
390                 final String jobParameterKey = jobParameterKeyAsObject.toString();
391                 getEncumbranceClosingReportWriterService().writeParameterLine("%32s %10s", jobParameterKey, jobParameters.get(jobParameterKey));
392             }
393         }
394         
395         // write statistics
396         getEncumbranceClosingReportWriterService().writeStatisticLine("NUMBER OF ENCUMBRANCE RECORDS READ:     %10d", counts.get("encumbrancesRead"));
397         getEncumbranceClosingReportWriterService().writeStatisticLine("NUMBER OF ENCUMBRANCE RECORDS SELECTED  %10d", counts.get("encumbrancesSelected"));
398         getEncumbranceClosingReportWriterService().writeStatisticLine("NUMBER OF SEQ RECORDS WRITTEN           %10d", counts.get("originEntriesWritten"));
399         getEncumbranceClosingReportWriterService().pageBreak();
400         
401         // write ledger summary report
402         getEncumbranceClosingReportWriterService().writeSubTitle(configurationService.getPropertyValueAsString(OLEKeyConstants.MESSAGE_REPORT_YEAR_END_ENCUMBRANCE_FORWARDS_LEDGER_TITLE_LINE));
403         forwardEncumbranceLedgerReport.writeReport(getEncumbranceClosingReportWriterService());
404     }
405 
406     /**
407      * @param balanceFiscalYear the fiscal year to find balances encumbrances for
408      * @see org.kuali.ole.gl.batch.service.YearEndService#logAllMissingPriorYearAccounts(java.lang.Integer)
409      */
410     public void logAllMissingPriorYearAccounts(Integer fiscalYear) {
411         Set<Map<String, String>> missingPriorYearAccountKeys = yearEndDao.findKeysOfMissingPriorYearAccountsForBalances(fiscalYear);
412         missingPriorYearAccountKeys.addAll(yearEndDao.findKeysOfMissingPriorYearAccountsForOpenEncumbrances(fiscalYear));
413         for (Map<String, String> key : missingPriorYearAccountKeys) {
414             LOG.info("PRIOR YEAR ACCOUNT MISSING FOR " + key.get("chartOfAccountsCode") + "-" + key.get("accountNumber"));
415         }
416     }
417 
418     /**
419      * @param balanceFiscalYear the fiscal year to find balances encumbrances for
420      * @see org.kuali.ole.gl.batch.service.YearEndService#logAllMissingSubFundGroups(java.lang.Integer)
421      */
422     public void logAllMissingSubFundGroups(Integer fiscalYear) {
423         Set missingSubFundGroupKeys = yearEndDao.findKeysOfMissingSubFundGroupsForBalances(fiscalYear);
424         missingSubFundGroupKeys.addAll(yearEndDao.findKeysOfMissingSubFundGroupsForOpenEncumbrances(fiscalYear));
425         for (Object key : missingSubFundGroupKeys) {
426             LOG.info("SUB FUND GROUP MISSING FOR " + (String) ((Map) key).get("subFundGroupCode"));
427         }
428 
429     }
430 
431     /**
432      * Sets the encumbranceDao attribute, allowing the injection of an implementation of the data access object that uses a specific
433      * O/R mechanism.
434      * 
435      * @param encumbranceDao the implementation of encumbranceDao to set
436      * @see org.kuali.ole.gl.dataaccess.EncumbranceDao
437      */
438     public void setEncumbranceDao(EncumbranceDao encumbranceDao) {
439         this.encumbranceDao = encumbranceDao;
440     }
441 
442     /**
443      * Sets the originEntryService attribute, allowing the injection of an implementation of that service
444      * 
445      * @param originEntryService the implementation of originEntryService to set
446      * @see org.kuali.ole.gl.service.OriginEntryService
447      */
448     public void setOriginEntryService(OriginEntryService originEntryService) {
449         this.originEntryService = originEntryService;
450     }
451 
452     public void setDateTimeService(DateTimeService dateTimeService) {
453         this.dateTimeService = dateTimeService;
454     }
455 
456     public void setOriginEntryGroupService(OriginEntryGroupService originEntryGroupService) {
457         this.originEntryGroupService = originEntryGroupService;
458     }
459 
460     public void setBalanceService(BalanceService balanceService) {
461         this.balanceService = balanceService;
462     }
463 
464     public void setBalanceTypeService(BalanceTypeService balanceTypeService) {
465         this.balanceTypeService = balanceTypeService;
466     }
467 
468     public void setObjectTypeService(ObjectTypeService objectTypeService) {
469         this.objectTypeService = objectTypeService;
470     }
471 
472 
473     public void setParameterService(ParameterService parameterService) {
474         this.parameterService = parameterService;
475     }
476 
477     public void setPriorYearAccountService(PriorYearAccountService priorYearAccountService) {
478         this.priorYearAccountService = priorYearAccountService;
479     }
480 
481     public void setSubFundGroupService(SubFundGroupService subFundGroupService) {
482         this.subFundGroupService = subFundGroupService;
483     }
484 
485     /**
486      * Sets the persistenceService attribute value.
487      * 
488      * @param persistenceService The persistenceService to set.
489      */
490     public void setPersistenceService(PersistenceService persistenceService) {
491         this.persistenceService = persistenceService;
492     }
493 
494     public void setYearEndDao(YearEndDao yearEndDao) {
495         this.yearEndDao = yearEndDao;
496     }
497 
498     public void setConfigurationService(ConfigurationService configurationService) {
499         this.configurationService = configurationService;
500     }
501 
502     public void setBatchFileDirectoryName(String batchFileDirectoryName) {
503         this.batchFileDirectoryName = batchFileDirectoryName;
504     }
505 
506     /**
507      * Gets the encumbranceClosingOriginEntryGenerationService attribute. 
508      * @return Returns the encumbranceClosingOriginEntryGenerationService.
509      */
510     public EncumbranceClosingOriginEntryGenerationService getEncumbranceClosingOriginEntryGenerationService() {
511         return encumbranceClosingOriginEntryGenerationService;
512     }
513 
514     /**
515      * Sets the encumbranceClosingOriginEntryGenerationService attribute value.
516      * @param encumbranceClosingOriginEntryGenerationService The encumbranceClosingOriginEntryGenerationService to set.
517      */
518     public void setEncumbranceClosingOriginEntryGenerationService(EncumbranceClosingOriginEntryGenerationService encumbranceClosingOriginEntryGenerationService) {
519         this.encumbranceClosingOriginEntryGenerationService = encumbranceClosingOriginEntryGenerationService;
520     }
521 
522     /**
523      * Gets the nominalActivityClosingReportWriterService attribute. 
524      * @return Returns the nominalActivityClosingReportWriterService.
525      */
526     public ReportWriterService getNominalActivityClosingReportWriterService() {
527         return nominalActivityClosingReportWriterService;
528     }
529 
530     /**
531      * Sets the nominalActivityClosingReportWriterService attribute value.
532      * @param nominalActivityClosingReportWriterService The nominalActivityClosingReportWriterService to set.
533      */
534     public void setNominalActivityClosingReportWriterService(ReportWriterService nominalActivityClosingReportWriterService) {
535         this.nominalActivityClosingReportWriterService = nominalActivityClosingReportWriterService;
536     }
537 
538     /**
539      * Gets the balanceForwardReportWriterService attribute. 
540      * @return Returns the balanceForwardReportWriterService.
541      */
542     public ReportWriterService getBalanceForwardReportWriterService() {
543         return balanceForwardReportWriterService;
544     }
545 
546     /**
547      * Sets the balanceForwardReportWriterService attribute value.
548      * @param balanceForwardReportWriterService The balanceForwardReportWriterService to set.
549      */
550     public void setBalanceForwardReportWriterService(ReportWriterService balanceForwardReportWriterService) {
551         this.balanceForwardReportWriterService = balanceForwardReportWriterService;
552     }
553 
554     /**
555      * Gets the encumbranceClosingReportWriterService attribute. 
556      * @return Returns the encumbranceClosingReportWriterService.
557      */
558     public ReportWriterService getEncumbranceClosingReportWriterService() {
559         return encumbranceClosingReportWriterService;
560     }
561 
562     /**
563      * Sets the encumbranceClosingReportWriterService attribute value.
564      * @param encumbranceClosingReportWriterService The encumbranceClosingReportWriterService to set.
565      */
566     public void setEncumbranceClosingReportWriterService(ReportWriterService encumbranceClosingReportWriterService) {
567         this.encumbranceClosingReportWriterService = encumbranceClosingReportWriterService;
568     }
569 }