/*
* 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.sys.document;
import java.sql.Date;
import org.apache.commons.lang.StringUtils;
import org.kuali.kfs.coa.businessobject.AccountingPeriod;
import org.kuali.kfs.coa.service.AccountingPeriodService;
import org.kuali.kfs.sys.context.SpringContext;
import org.kuali.rice.core.api.datetime.DateTimeService;
import org.kuali.rice.kew.api.exception.WorkflowException;
import org.kuali.rice.kns.service.DataDictionaryService;
import org.kuali.rice.krad.util.ObjectUtils;
/**
* Base implementation for a ledger posting document.
*/
public class LedgerPostingDocumentBase extends FinancialSystemTransactionalDocumentBase implements LedgerPostingDocument {
static protected transient DateTimeService dateTimeService;
static protected transient AccountingPeriodService accountingPeriodService;
static protected transient DataDictionaryService dataDictionaryService;
protected AccountingPeriod accountingPeriod;
protected Integer postingYear;
protected String postingPeriodCode;
protected boolean checkPostingYearForCopy;
/**
* Constructs a LedgerPostingDocumentBase.java.
*/
public LedgerPostingDocumentBase() {
super();
if ( SpringContext.isInitialized() ) {
createInitialAccountingPeriod();
}
}
/**
* Used during initialization to provide a base <code>{@link AccountingPeriod}</code>.<br/>
* <p>
* This is a hack right now because its intended to be set by the
* <code>{@link org.kuali.kfs.coa.service.AccountingPeriodService}</code>
*
* @return AccountingPeriod
*/
public void createInitialAccountingPeriod() {
AccountingPeriod accountingPeriod = retrieveCurrentAccountingPeriod();
setAccountingPeriod(accountingPeriod);
}
/**
* Finds the accounting period for the current date
* @return the current accounting period
*/
public AccountingPeriod retrieveCurrentAccountingPeriod() {
// CSU 6702 BEGIN
try {
// CSU 6702 END
Date date = getDateTimeService().getCurrentSqlDate();
return getAccountingPeriodService().getByDate(date);
// CSU 6702 BEGIN
} catch ( RuntimeException ex ) {
// catch and ignore - prevent blowup when called before services initialized
return null;
}
// CSU 6702 END
}
/**
* @see org.kuali.kfs.sys.document.LedgerPostingDocument#getPostingYear()
*/
public Integer getPostingYear() {
return postingYear;
}
/**
* @see org.kuali.kfs.sys.document.LedgerPostingDocument#setPostingYear(java.lang.Integer)
*/
public void setPostingYear(Integer postingYear) {
this.postingYear = postingYear;
}
/**
* @see org.kuali.kfs.sys.document.LedgerPostingDocument#getPostingPeriodCode()
*/
public String getPostingPeriodCode() {
return postingPeriodCode;
}
/**
* @see org.kuali.kfs.sys.document.LedgerPostingDocument#setPostingPeriodCode(java.lang.String)
*/
public void setPostingPeriodCode(String postingPeriodCode) {
this.postingPeriodCode = postingPeriodCode;
}
/**
* @see org.kuali.kfs.sys.document.LedgerPostingDocument#getAccountingPeriod()
*/
public AccountingPeriod getAccountingPeriod() {
accountingPeriod = getAccountingPeriodService().getByPeriod(postingPeriodCode, postingYear);
return accountingPeriod;
}
/**
* @see org.kuali.kfs.sys.document.LedgerPostingDocument#setAccountingPeriod(AccountingPeriod)
*/
public void setAccountingPeriod(AccountingPeriod accountingPeriod) {
this.accountingPeriod = accountingPeriod;
if(ObjectUtils.isNotNull(accountingPeriod)) {
this.setPostingYear(accountingPeriod.getUniversityFiscalYear());
this.setPostingPeriodCode(accountingPeriod.getUniversityFiscalPeriodCode());
}
}
/**
* If we've copied, we need to update the posting period and year
* @see org.kuali.rice.krad.document.DocumentBase#toCopy()
*/
@Override
public void toCopy() throws WorkflowException, IllegalStateException {
super.toCopy();
setAccountingPeriod(retrieveCurrentAccountingPeriod());
}
/**
* Returns the financial document type code for the given document, using the DataDictionaryService
* @return the financial document type code for the given document
*/
public String getFinancialDocumentTypeCode() {
return getDataDictionaryService().getDocumentTypeNameByClass(this.getClass());
}
public static DataDictionaryService getDataDictionaryService() {
if ( dataDictionaryService == null ) {
dataDictionaryService = SpringContext.getBean(DataDictionaryService.class);
}
return dataDictionaryService;
}
public static DateTimeService getDateTimeService() {
if ( dateTimeService == null ) {
dateTimeService = SpringContext.getBean(DateTimeService.class);
}
return dateTimeService;
}
public static AccountingPeriodService getAccountingPeriodService() {
if ( accountingPeriodService == null ) {
accountingPeriodService = SpringContext.getBean(AccountingPeriodService.class);
}
return accountingPeriodService;
}
// CSU 6702 BEGIN
// rSmart-jkneal-KFSCSU-199-begin mod for selected accounting period
/**
* Composite of postingPeriodCode and postingYear
* @return Return a composite of postingPeriodCode and postingYear
*/
public String getAccountingPeriodCompositeString() {
return postingPeriodCode + postingYear;
}
/**
* Set accountingPeriod based on incoming paramater.
* @param accountingPeriodString in the form of [period][year]
*/
public void setAccountingPeriodCompositeString(String accountingPeriodString) {
if (StringUtils.isNotBlank(accountingPeriodString)) {
String period = StringUtils.left(accountingPeriodString, 2);
Integer year = new Integer(StringUtils.right(accountingPeriodString, 4));
AccountingPeriod accountingPeriod = getAccountingPeriodService().getByPeriod(period, year);
setAccountingPeriod(accountingPeriod);
}
}
// rSmart-jkneal-KFSCSU-199-end mod for selected accounting period
// CSU 6702 END
}