/*
* 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.gl.batch;
import java.util.Calendar;
import java.util.GregorianCalendar;
import org.kuali.kfs.gl.batch.service.EncumbranceClosingOriginEntryGenerationService;
import org.kuali.kfs.gl.batch.service.impl.OriginEntryOffsetPair;
import org.kuali.kfs.gl.businessobject.Encumbrance;
import org.kuali.kfs.gl.businessobject.OriginEntryTestBase;
import org.kuali.kfs.sys.ConfigureContext;
import org.kuali.kfs.sys.KFSConstants;
import org.kuali.kfs.sys.context.SpringContext;
import org.kuali.kfs.sys.context.TestUtils;
import org.kuali.rice.core.api.util.type.KualiDecimal;
/**
* Tests that the forward encumbrance process is generating cost share encumbrance forwarding origin entries correctly
*/
@ConfigureContext
public class ForwardEncumbranceTest extends OriginEntryTestBase {
private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(ForwardEncumbranceTest.class);
/**
* An enum with a set of encumbrances to test; here, we've only got one encumbrance, an encumbrance
* that should force forward encumbrances to generate a cost share forwarding entry/offset pair
*/
enum ENCUMBRANCE_FIXTURE {
COST_SHARE_ENCUMBRANCE("BL", "4531413", "CS001", "7100", "EX", "EE");
// to find account: select ca_prior_yr_acct_t.fin_coa_cd, ca_prior_yr_acct_t.ACCOUNT_NBR, CA_A21_SUB_ACCT_T.sub_acct_nbr
// from (ca_prior_yr_acct_t join ca_sub_fund_grp_t on ca_prior_yr_acct_t.SUB_FUND_GRP_CD =
// ca_sub_fund_grp_t.SUB_FUND_GRP_CD) join CA_A21_SUB_ACCT_T on CA_PRIOR_YR_ACCT_T.fin_coa_cd = CA_A21_SUB_ACCT_T.fin_coa_cd
// and CA_PRIOR_YR_ACCT_T.account_nbr = CA_A21_SUB_ACCT_T.account_nbr where ca_sub_fund_grp_t.FUND_GRP_CD = 'CG' and
// CA_A21_SUB_ACCT_T.sub_acct_typ_cd = 'CS'
// this was a rough one, it needed a cost share sub account and a CG sub fund group fund group type
private String chart;
private String accountNumber;
private String subAccountNumber;
private String objectCode;
private String balanceType;
private String objectTypeCode;
/**
* Constructs a ForwardEncumbranceTest.ENCUMBRANCE_FIXTURE
* @param chart the chart of the encumbrance
* @param accountNumber the account of the encumbrance
* @param subAccountNumber the sub account of the encumbrance
* @param objectCode the object code of the encumbrance
* @param balanceType the balance type code of the encumbrance
* @param objectTypeCode the object type code of the encumbrance
*/
private ENCUMBRANCE_FIXTURE(String chart, String accountNumber, String subAccountNumber, String objectCode, String balanceType, String objectTypeCode) {
this.chart = chart;
this.accountNumber = accountNumber;
this.subAccountNumber = subAccountNumber;
this.objectCode = objectCode;
this.balanceType = balanceType;
this.objectTypeCode = objectTypeCode;
}
/**
* Converts one of the members of this enum to an actual Encumbrance
*
* @return a real encumbrance!
*/
public Encumbrance convertToEncumbrance() {
Encumbrance e = new Encumbrance();
Integer fy = TestUtils.getFiscalYearForTesting().intValue() - 1;
e.setUniversityFiscalYear(fy);
e.setChartOfAccountsCode(chart);
e.setAccountNumber(accountNumber);
e.setSubAccountNumber(subAccountNumber);
e.setObjectCode(objectCode);
e.setSubObjectCode(KFSConstants.getDashFinancialSubObjectCode());
e.setBalanceTypeCode(balanceType);
e.setDocumentTypeCode("EXEN"); // we don't need this field
e.setOriginCode("EP");
e.setDocumentNumber("000001"); // we don't need this field
GregorianCalendar lastYear = new GregorianCalendar();
lastYear.set(Calendar.YEAR, (TestUtils.getFiscalYearForTesting().intValue() - 1));
e.setTransactionEncumbranceDate(new java.sql.Date(lastYear.getTimeInMillis()));
e.setTransactionEncumbranceDescription("MONKEYS-R-US IS THE NEWEST AND GREATEST STORE IN THE ENTIRE TRI-STATE AREA");
e.setAccountLineEncumbranceAmount(new KualiDecimal(1000));
e.setAccountLineEncumbranceClosedAmount(KualiDecimal.ZERO);
return e;
}
/**
* Returns the object type code of this enum
*
* @return this enum's object type code
*/
public String getObjectType() {
return this.objectTypeCode;
}
}
/**
* Tests that the expected encumbrance fixtures would be selected by the forward encumbrance process
*/
public void testEncumbranceSelection() {
final EncumbranceClosingOriginEntryGenerationService encumbranceClosingOriginEntryGenerationService = SpringContext.getBean(EncumbranceClosingOriginEntryGenerationService.class);
assertTrue(encumbranceClosingOriginEntryGenerationService.shouldForwardEncumbrance(ENCUMBRANCE_FIXTURE.COST_SHARE_ENCUMBRANCE.convertToEncumbrance()));
}
/**
* Tests that the expted fixtures would be selected for cost share entry/offset generation by the forward encumbrance process
*
* @throws Exception thrown if something goes wrong
*/
public void testCostShareSelection() throws Exception {
final EncumbranceClosingOriginEntryGenerationService encumbranceClosingOriginEntryGenerationService = SpringContext.getBean(EncumbranceClosingOriginEntryGenerationService.class);
Encumbrance encumbrance = ENCUMBRANCE_FIXTURE.COST_SHARE_ENCUMBRANCE.convertToEncumbrance();
final Integer postingYear = new Integer(TestUtils.getFiscalYearForTesting().intValue() - 1);
OriginEntryOffsetPair entryPair = encumbranceClosingOriginEntryGenerationService.createBeginningBalanceEntryOffsetPair(encumbrance, postingYear, new java.sql.Date(new GregorianCalendar().getTimeInMillis()));
assertTrue(encumbranceClosingOriginEntryGenerationService.shouldForwardCostShareForEncumbrance(entryPair.getEntry(), entryPair.getOffset(), encumbrance, ENCUMBRANCE_FIXTURE.COST_SHARE_ENCUMBRANCE.getObjectType()));
OriginEntryOffsetPair costShareEntryPair = encumbranceClosingOriginEntryGenerationService.createCostShareBeginningBalanceEntryOffsetPair(encumbrance, new java.sql.Date(new GregorianCalendar().getTimeInMillis()));
assertFalse( "Should not have had a fatal error: " + costShareEntryPair, costShareEntryPair.isFatalErrorFlag() );
LOG.info(costShareEntryPair.getEntry().getLine());
LOG.info(costShareEntryPair.getOffset().getLine());
assertTrue(costShareEntryPair.getOffset().getLine().indexOf("GENERATED") >= 0);
}
}