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.sys.document; 017 018 import java.sql.Date; 019 020 import org.kuali.kfs.coa.businessobject.AccountingPeriod; 021 import org.kuali.kfs.coa.service.AccountingPeriodService; 022 import org.kuali.kfs.sys.context.SpringContext; 023 import org.kuali.rice.kew.exception.WorkflowException; 024 import org.kuali.rice.kns.service.DataDictionaryService; 025 import org.kuali.rice.kns.service.DateTimeService; 026 import org.kuali.rice.kns.util.ObjectUtils; 027 028 /** 029 * Base implementation for a ledger posting document. 030 */ 031 public class LedgerPostingDocumentBase extends FinancialSystemTransactionalDocumentBase implements LedgerPostingDocument { 032 static protected transient DateTimeService dateTimeService; 033 static protected transient AccountingPeriodService accountingPeriodService; 034 static protected transient DataDictionaryService dataDictionaryService; 035 036 protected AccountingPeriod accountingPeriod; 037 protected Integer postingYear; 038 protected String postingPeriodCode; 039 protected boolean checkPostingYearForCopy; 040 041 /** 042 * Constructs a LedgerPostingDocumentBase.java. 043 */ 044 public LedgerPostingDocumentBase() { 045 super(); 046 createInitialAccountingPeriod(); 047 } 048 049 /** 050 * Used during initialization to provide a base <code>{@link AccountingPeriod}</code>.<br/> 051 * <p> 052 * This is a hack right now because its intended to be set by the 053 * <code>{@link org.kuali.kfs.coa.service.AccountingPeriodService}</code> 054 * 055 * @return AccountingPeriod 056 */ 057 public void createInitialAccountingPeriod() { 058 AccountingPeriod accountingPeriod = retrieveCurrentAccountingPeriod(); 059 setAccountingPeriod(accountingPeriod); 060 } 061 062 /** 063 * Finds the accounting period for the current date 064 * @return the current accounting period 065 */ 066 public AccountingPeriod retrieveCurrentAccountingPeriod() { 067 try { 068 Date date = getDateTimeService().getCurrentSqlDate(); 069 return getAccountingPeriodService().getByDate(date); 070 } catch ( RuntimeException ex ) { 071 // catch and ignore - prevent blowup when called before services initialized 072 return null; 073 } 074 } 075 076 /** 077 * @see org.kuali.kfs.sys.document.LedgerPostingDocument#getPostingYear() 078 */ 079 public Integer getPostingYear() { 080 return postingYear; 081 } 082 083 /** 084 * @see org.kuali.kfs.sys.document.LedgerPostingDocument#setPostingYear(java.lang.Integer) 085 */ 086 public void setPostingYear(Integer postingYear) { 087 this.postingYear = postingYear; 088 } 089 090 /** 091 * @see org.kuali.kfs.sys.document.LedgerPostingDocument#getPostingPeriodCode() 092 */ 093 public String getPostingPeriodCode() { 094 return postingPeriodCode; 095 } 096 097 /** 098 * @see org.kuali.kfs.sys.document.LedgerPostingDocument#setPostingPeriodCode(java.lang.String) 099 */ 100 public void setPostingPeriodCode(String postingPeriodCode) { 101 this.postingPeriodCode = postingPeriodCode; 102 } 103 104 /** 105 * @see org.kuali.kfs.sys.document.LedgerPostingDocument#getAccountingPeriod() 106 */ 107 public AccountingPeriod getAccountingPeriod() { 108 accountingPeriod = getAccountingPeriodService().getByPeriod(postingPeriodCode, postingYear); 109 110 return accountingPeriod; 111 } 112 113 /** 114 * @see org.kuali.kfs.sys.document.LedgerPostingDocument#setAccountingPeriod(AccountingPeriod) 115 */ 116 public void setAccountingPeriod(AccountingPeriod accountingPeriod) { 117 this.accountingPeriod = accountingPeriod; 118 119 if(ObjectUtils.isNotNull(accountingPeriod)) { 120 this.setPostingYear(accountingPeriod.getUniversityFiscalYear()); 121 this.setPostingPeriodCode(accountingPeriod.getUniversityFiscalPeriodCode()); 122 } 123 } 124 125 /** 126 * If we've copied, we need to update the posting period and year 127 * @see org.kuali.rice.kns.document.DocumentBase#toCopy() 128 */ 129 @Override 130 public void toCopy() throws WorkflowException, IllegalStateException { 131 super.toCopy(); 132 setAccountingPeriod(retrieveCurrentAccountingPeriod()); 133 } 134 135 /** 136 * Returns the financial document type code for the given document, using the DataDictionaryService 137 * @return the financial document type code for the given document 138 */ 139 public String getFinancialDocumentTypeCode() { 140 return getDataDictionaryService().getDocumentTypeNameByClass(this.getClass()); 141 } 142 143 144 public static DataDictionaryService getDataDictionaryService() { 145 if ( dataDictionaryService == null ) { 146 dataDictionaryService = SpringContext.getBean(DataDictionaryService.class); 147 } 148 return dataDictionaryService; 149 } 150 151 public static DateTimeService getDateTimeService() { 152 if ( dateTimeService == null ) { 153 dateTimeService = SpringContext.getBean(DateTimeService.class); 154 } 155 return dateTimeService; 156 } 157 158 public static AccountingPeriodService getAccountingPeriodService() { 159 if ( accountingPeriodService == null ) { 160 accountingPeriodService = SpringContext.getBean(AccountingPeriodService.class); 161 } 162 return accountingPeriodService; 163 } 164 }