/*
* 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.sql.Date;
import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.kuali.kfs.coa.businessobject.A21SubAccount;
import org.kuali.kfs.coa.businessobject.OffsetDefinition;
import org.kuali.kfs.coa.service.A21SubAccountService;
import org.kuali.kfs.coa.service.ObjectTypeService;
import org.kuali.kfs.coa.service.OrganizationReversionService;
import org.kuali.kfs.coa.service.PriorYearAccountService;
import org.kuali.kfs.fp.businessobject.OffsetAccount;
import org.kuali.kfs.gl.GeneralLedgerConstants;
import org.kuali.kfs.gl.batch.service.EncumbranceClosingOriginEntryGenerationService;
import org.kuali.kfs.gl.batch.service.OrganizationReversionProcess;
import org.kuali.kfs.gl.batch.service.OrganizationReversionProcessService;
import org.kuali.kfs.gl.batch.service.OrganizationReversionUnitOfWorkService;
import org.kuali.kfs.gl.batch.service.impl.CashOrganizationReversionCategoryLogic;
import org.kuali.kfs.gl.batch.service.impl.OrganizationReversionMockServiceImpl;
import org.kuali.kfs.gl.batch.service.impl.OriginEntryOffsetPair;
import org.kuali.kfs.gl.batch.service.impl.exception.FatalErrorException;
import org.kuali.kfs.gl.businessobject.Balance;
import org.kuali.kfs.gl.businessobject.Encumbrance;
import org.kuali.kfs.gl.businessobject.OriginEntryFull;
import org.kuali.kfs.gl.businessobject.OriginEntryInformation;
import org.kuali.kfs.gl.businessobject.OriginEntryTestBase;
import org.kuali.kfs.gl.service.BalanceService;
import org.kuali.kfs.sys.ConfigureContext;
import org.kuali.kfs.sys.KFSConstants;
import org.kuali.kfs.sys.businessobject.SystemOptions;
import org.kuali.kfs.sys.context.SpringContext;
import org.kuali.kfs.sys.context.TestUtils;
import org.kuali.kfs.sys.service.OptionsService;
import org.kuali.kfs.sys.service.UniversityDateService;
import org.kuali.kfs.sys.service.impl.KfsParameterConstants;
import org.kuali.rice.core.api.datetime.DateTimeService;
import org.kuali.rice.core.api.util.type.KualiDecimal;
import org.kuali.rice.coreservice.framework.parameter.ParameterService;
import org.kuali.rice.krad.service.BusinessObjectService;
/*
* Unit tests to verify that flexible offsets are being added to year end origin entries correctly
*/
@ConfigureContext
public class YearEndFlexibleOffsetTest extends OriginEntryTestBase {
private static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(YearEndFlexibleOffsetTest.class);
public static final String DEFAULT_FLEXIBLE_BALANCE_CHART = "BL";
public static final String DEFAULT_FLEXIBLE_BALANCE_ACCOUNT_NBR = "1031400";
public static final String DEFAULT_NO_FLEXIBLE_BALANCE_CHART = "BL";
public static final String DEFAULT_NO_FLEXIBLE_BALANCE_ACCOUNT_NBR = "1031420";
public static final String DEFAULT_FLEXIBLE_ENCUMBRANCE_CHART = "BL";
public static final String DEFAULT_FLEXIBLE_ENCUMBRANCE_ACCOUNT_NBR = "4531402";
public static String DEFAULT_FLEXIBLE_ENCUMBRANCE_SUB_ACCT_NBR;
public static final String DEFAULT_NO_FLEXIBLE_ENCUMBRANCE_CHART = "BL";
public static final String DEFAULT_NO_FLEXIBLE_ENCUMBRANCE_ACCOUNT_NBR = "4531403";
public static String DEFAULT_NO_FLEXIBLE_ENCUMBRANCE_SUB_ACCT_NBR;
public static final String CS_FLEXIBLE_ENCUMBRANCE_CHART = "BL";
public static final String CS_FLEXIBLE_ENCUMBRANCE_ACCOUNT_NBR = "4031418";
public static final String CS_FLEXIBLE_ENCUMBRANCE_SUB_ACCT_NBR = "CS001";
public static final String CS_NO_FLEXIBLE_ENCUMBRANCE_CHART = "BL";
public static final String CS_NO_FLEXIBLE_ENCUMBRANCE_ACCOUNT_NBR = "4431423";
public static final String CS_NO_FLEXIBLE_ENCUMBRANCE_SUB_ACCT_NBR = "CS001";
public static final KualiDecimal DEFAULT_FIXTURE_AMOUNT = new KualiDecimal(3000);
public static final String DEFAULT_EXPENSE_OBJECT_CODE = "4680";
public static final String DEFAULT_NOMINAL_ACTIVITY_OFFSET_OBJECT_CODE = "9899";
public static final String DEFAULT_ENCUMBRANCE_OFFSET_OBJECT_CODE = "9892";
public static final String DEFAULT_COST_SHARE_ENCUMBRANCE_OFFSET_OBJECT_CODE = "9893";
public static final String DEFAULT_ENCUMBRANCE_BALANCE_TYPE_CODE = "EX";
public static final String DEFAULT_OFFSET_CHART = "BL";
public static final String DEFAULT_OFFSET_ACCOUNT_NBR = "0211201";
public static final String ORG_REVERSION_CASH_OBJECT_CODE = "8000";
private BusinessObjectService boService;
private ParameterService parameterService;
private ObjectTypeService objectTypeService;
private Integer fiscalYear;
private Date transactionDate;
enum NOMINAL_ACTIVITY_BALANCE_FIXTURE {
FLEXIBLE_NOMINAL_ACTIVITY_BALANCE(DEFAULT_FLEXIBLE_BALANCE_CHART, DEFAULT_FLEXIBLE_BALANCE_ACCOUNT_NBR),
INFLEXIBLE_NOMINAL_ACTIVITY_BALANCE(DEFAULT_NO_FLEXIBLE_BALANCE_CHART, DEFAULT_NO_FLEXIBLE_BALANCE_ACCOUNT_NBR);
private String chartCode;
private String accountNumber;
private KualiDecimal amount;
private Date timestamp;
private static final String DATE_FORMAT = "yyyy-MM-dd";
private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(NOMINAL_ACTIVITY_BALANCE_FIXTURE.class);
private SystemOptions fsOptions = SpringContext.getBean(OptionsService.class).getCurrentYearOptions();
private NOMINAL_ACTIVITY_BALANCE_FIXTURE(String chartCode, String accountNumber) {
this.chartCode = chartCode;
this.accountNumber = accountNumber;
}
/**
* Converts the fixture into a balance to test
*
* @return a balance represented by this fixture
*/
public Balance convertToBalance() {
Balance balance = new Balance();
balance.setUniversityFiscalYear(TestUtils.getFiscalYearForTesting().intValue());
balance.setChartOfAccountsCode(chartCode);
balance.setAccountNumber(accountNumber);
balance.setSubAccountNumber(KFSConstants.getDashSubAccountNumber());
balance.setObjectCode(DEFAULT_EXPENSE_OBJECT_CODE);
balance.setSubObjectCode(KFSConstants.getDashFinancialSubObjectCode());
balance.setBalanceTypeCode(fsOptions.getActualFinancialBalanceTypeCd());
balance.setObjectTypeCode(fsOptions.getFinObjTypeCshNotIncomeCd());
balance.setAccountLineAnnualBalanceAmount(DEFAULT_FIXTURE_AMOUNT);
balance.setBeginningBalanceLineAmount(KualiDecimal.ZERO);
balance.setContractsGrantsBeginningBalanceAmount(KualiDecimal.ZERO);
balance.setMonth1Amount(amount);
balance.setMonth2Amount(KualiDecimal.ZERO);
balance.setMonth3Amount(KualiDecimal.ZERO);
balance.setMonth4Amount(KualiDecimal.ZERO);
balance.setMonth5Amount(KualiDecimal.ZERO);
balance.setMonth6Amount(KualiDecimal.ZERO);
balance.setMonth7Amount(KualiDecimal.ZERO);
balance.setMonth8Amount(KualiDecimal.ZERO);
balance.setMonth9Amount(KualiDecimal.ZERO);
balance.setMonth10Amount(KualiDecimal.ZERO);
balance.setMonth11Amount(KualiDecimal.ZERO);
balance.setMonth12Amount(KualiDecimal.ZERO);
balance.setMonth13Amount(KualiDecimal.ZERO);
try {
SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT);
java.util.Date jud = sdf.parse(SpringContext.getBean(ParameterService.class).getParameterValueAsString(KfsParameterConstants.GENERAL_LEDGER_BATCH.class, GeneralLedgerConstants.ANNUAL_CLOSING_TRANSACTION_DATE_PARM));
balance.setTimestamp(new java.sql.Date(jud.getTime()));
}
catch (ParseException e) {
LOG.debug("Parse date exception while parsing transaction date");
}
balance.refresh();
return balance;
}
};
enum ENCUMBRANCE_FORWARD_FIXTURE {
FLEXIBLE_ENCUMBRANCE(DEFAULT_FLEXIBLE_ENCUMBRANCE_CHART, DEFAULT_FLEXIBLE_ENCUMBRANCE_ACCOUNT_NBR, DEFAULT_FLEXIBLE_ENCUMBRANCE_SUB_ACCT_NBR),
INFLEXIBLE_ENCUMBRANCE(DEFAULT_NO_FLEXIBLE_ENCUMBRANCE_CHART, DEFAULT_NO_FLEXIBLE_ENCUMBRANCE_ACCOUNT_NBR, DEFAULT_NO_FLEXIBLE_ENCUMBRANCE_SUB_ACCT_NBR),
FLEXIBLE_COST_SHARE_ENCUMBRANCE(CS_FLEXIBLE_ENCUMBRANCE_CHART, CS_FLEXIBLE_ENCUMBRANCE_ACCOUNT_NBR, CS_FLEXIBLE_ENCUMBRANCE_SUB_ACCT_NBR),
INFLEXIBLE_COST_SHARE_ENCUMBRANCE(CS_NO_FLEXIBLE_ENCUMBRANCE_CHART, CS_NO_FLEXIBLE_ENCUMBRANCE_ACCOUNT_NBR, CS_NO_FLEXIBLE_ENCUMBRANCE_SUB_ACCT_NBR);
private ENCUMBRANCE_FORWARD_FIXTURE(String chart, String account, String subAccount) {
this.chartOfAccountsCode = chart;
this.accountNumber = account;
this.subAccountNumber = subAccount;
}
private String chartOfAccountsCode;
private String accountNumber;
private String subAccountNumber;
public Encumbrance convertToEncumbrance() {
Encumbrance encumbrance = new Encumbrance();
encumbrance.setUniversityFiscalYear(TestUtils.getFiscalYearForTesting().intValue() - 1);
encumbrance.setChartOfAccountsCode(this.chartOfAccountsCode);
encumbrance.setAccountNumber(this.accountNumber);
encumbrance.setSubAccountNumber(this.subAccountNumber);
encumbrance.setObjectCode(DEFAULT_EXPENSE_OBJECT_CODE);
encumbrance.setSubObjectCode(subAccountNumber);
encumbrance.setBalanceTypeCode(DEFAULT_ENCUMBRANCE_BALANCE_TYPE_CODE);
encumbrance.setDocumentTypeCode("EXEN");
encumbrance.setOriginCode("02");
encumbrance.setDocumentNumber("200200");
encumbrance.setTransactionEncumbranceDescription("Test Encumbrance");
encumbrance.setTransactionEncumbranceDate(getEncumbranceDate());
encumbrance.setAccountLineEncumbranceAmount(DEFAULT_FIXTURE_AMOUNT);
encumbrance.setAccountLineEncumbranceClosedAmount(KualiDecimal.ZERO);
encumbrance.setAccountLineEncumbrancePurgeCode(" ");
encumbrance.setTimestamp(new Timestamp(getEncumbranceDate().getTime()));
return encumbrance;
}
private Date getEncumbranceDate() {
Calendar cal = new GregorianCalendar();
cal.set(Calendar.MONTH, Calendar.JANUARY);
cal.set(Calendar.DAY_OF_MONTH, 1);
cal.set(Calendar.YEAR, ((SpringContext.getBean(UniversityDateService.class).getCurrentFiscalYear()).intValue() - 1));
return new Date(cal.getTimeInMillis());
}
}
enum ORG_REVERSION_BALANCE_FIXTURE {
FLEXIBLE_ORG_REVERSION_BALANCE(DEFAULT_FLEXIBLE_BALANCE_CHART, DEFAULT_FLEXIBLE_BALANCE_ACCOUNT_NBR),
INFLEXIBLE_ORG_REVERSION_BALANCE(DEFAULT_NO_FLEXIBLE_BALANCE_CHART, DEFAULT_NO_FLEXIBLE_BALANCE_ACCOUNT_NBR);
private String chartCode;
private String accountNumber;
private KualiDecimal amount;
private Date timestamp;
private static final String DATE_FORMAT = "yyyy-MM-dd";
private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(NOMINAL_ACTIVITY_BALANCE_FIXTURE.class);
private SystemOptions fsOptions = SpringContext.getBean(OptionsService.class).getCurrentYearOptions();
private ORG_REVERSION_BALANCE_FIXTURE(String chartCode, String accountNumber) {
this.chartCode = chartCode;
this.accountNumber = accountNumber;
}
/**
* Converts the fixture into a balance to test
*
* @return a balance represented by this fixture
*/
public Balance convertToBalance() {
Balance balance = new Balance();
balance.setChartOfAccountsCode(chartCode);
balance.setAccountNumber(accountNumber);
balance.setSubAccountNumber(KFSConstants.getDashSubAccountNumber());
balance.setObjectCode(ORG_REVERSION_CASH_OBJECT_CODE);
balance.setSubObjectCode(KFSConstants.getDashFinancialSubObjectCode());
balance.setBalanceTypeCode(fsOptions.getActualFinancialBalanceTypeCd());
balance.setObjectTypeCode(fsOptions.getFinObjTypeCshNotIncomeCd());
balance.setAccountLineAnnualBalanceAmount(DEFAULT_FIXTURE_AMOUNT);
balance.setBeginningBalanceLineAmount(KualiDecimal.ZERO);
balance.setContractsGrantsBeginningBalanceAmount(KualiDecimal.ZERO);
balance.setMonth1Amount(amount);
balance.setMonth2Amount(KualiDecimal.ZERO);
balance.setMonth3Amount(KualiDecimal.ZERO);
balance.setMonth4Amount(KualiDecimal.ZERO);
balance.setMonth5Amount(KualiDecimal.ZERO);
balance.setMonth6Amount(KualiDecimal.ZERO);
balance.setMonth7Amount(KualiDecimal.ZERO);
balance.setMonth8Amount(KualiDecimal.ZERO);
balance.setMonth9Amount(KualiDecimal.ZERO);
balance.setMonth10Amount(KualiDecimal.ZERO);
balance.setMonth11Amount(KualiDecimal.ZERO);
balance.setMonth12Amount(KualiDecimal.ZERO);
balance.setMonth13Amount(KualiDecimal.ZERO);
try {
SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT);
java.util.Date jud = sdf.parse(SpringContext.getBean(ParameterService.class).getParameterValueAsString(KfsParameterConstants.GENERAL_LEDGER_BATCH.class, GeneralLedgerConstants.ANNUAL_CLOSING_TRANSACTION_DATE_PARM));
balance.setTimestamp(new java.sql.Date(jud.getTime()));
}
catch (ParseException e) {
LOG.debug("Parse date exception while parsing transaction date");
}
balance.refresh();
return balance;
}
};
public enum FLEXIBLE_OFFSET_ACCOUNT_FIXTURE {
FLEXIBLE_ACTIVITY_CLOSING_OFFSET_ACCOUNT(DEFAULT_FLEXIBLE_BALANCE_CHART, DEFAULT_FLEXIBLE_BALANCE_ACCOUNT_NBR, DEFAULT_NOMINAL_ACTIVITY_OFFSET_OBJECT_CODE),
FLEXIBLE_ENCUMBRANCE_FORWARD_OFFSET_ACCOUNT(DEFAULT_FLEXIBLE_ENCUMBRANCE_CHART, DEFAULT_FLEXIBLE_ENCUMBRANCE_ACCOUNT_NBR, DEFAULT_ENCUMBRANCE_OFFSET_OBJECT_CODE),
FLEXIBLE_CS_ENCUMBRANCE_FORWARD_OFFSET_ACCOUNT(DEFAULT_FLEXIBLE_BALANCE_CHART, DEFAULT_FLEXIBLE_BALANCE_ACCOUNT_NBR, DEFAULT_COST_SHARE_ENCUMBRANCE_OFFSET_OBJECT_CODE),
CASH_REVERSION_FORWARD_OFFSET_ACCOUNT(OrganizationReversionMockServiceImpl.DEFAULT_CASH_REVERSION_CHART, OrganizationReversionMockServiceImpl.DEFAULT_CASH_REVERSION_ACCOUNT, DEFAULT_NOMINAL_ACTIVITY_OFFSET_OBJECT_CODE);
private String chartCode;
private String accountNumber;
private String objectCode;
private FLEXIBLE_OFFSET_ACCOUNT_FIXTURE(String chartCode, String accountNumber, String objectCode) {
this.chartCode = chartCode;
this.accountNumber = accountNumber;
this.objectCode = objectCode;
}
public OffsetAccount convertToOffsetAccount() {
OffsetAccount offset = new OffsetAccount();
offset.setChartOfAccountsCode(this.chartCode);
offset.setAccountNumber(this.accountNumber);
offset.setFinancialOffsetObjectCode(this.objectCode);
offset.setFinancialOffsetChartOfAccountCode(DEFAULT_OFFSET_CHART);
offset.setFinancialOffsetAccountNumber(DEFAULT_OFFSET_ACCOUNT_NBR);
return offset;
}
}
/**
* Initialize defaults for each test.
* @see org.kuali.kfs.gl.businessobject.OriginEntryTestBase#setUp()
*/
@Override
public void setUp() throws Exception {
super.setUp();
this.boService = SpringContext.getBean(BusinessObjectService.class);
this.fiscalYear = new Integer((SpringContext.getBean(UniversityDateService.class).getCurrentFiscalYear()).intValue() - 1);
this.transactionDate = new java.sql.Date(new java.util.Date().getTime());
this.parameterService = SpringContext.getBean(ParameterService.class);
this.objectTypeService = SpringContext.getBean(ObjectTypeService.class);
DEFAULT_FLEXIBLE_ENCUMBRANCE_SUB_ACCT_NBR = KFSConstants.getDashSubAccountNumber();
DEFAULT_NO_FLEXIBLE_ENCUMBRANCE_SUB_ACCT_NBR = KFSConstants.getDashSubAccountNumber();
createFlexibleOffsetAccounts();
}
/**
* Test that:
* <ol>
* <li>when flexible offsets are turned on, nominal activity offsets that should get flexible offsets get them</li>
* <li>when flexible offsets are turned on, nominal activity offsets that should not get flexible offsets don't get them</li>
* <li>when flexible offsets are turned on, nominal activity entries do not get flexible offsets</li>
* </ol>
*/
public void testNominalActivityFlexibleOffsetsWhenOffsetsOn() {
try {
NominalActivityClosingHelper closingHelper = new NominalActivityClosingHelper(fiscalYear, transactionDate, parameterService, kualiConfigurationService, objectTypeService);
OriginEntryInformation entry;
// 1. flexible offsets on, flexible offset should be updated
toggleFlexibleOffsets(true);
entry = closingHelper.generateOffset(NOMINAL_ACTIVITY_BALANCE_FIXTURE.FLEXIBLE_NOMINAL_ACTIVITY_BALANCE.convertToBalance(), 1);
assertChartAndAccount(entry, DEFAULT_OFFSET_CHART, DEFAULT_OFFSET_ACCOUNT_NBR);
// 2. flexible offsets on, but balances without matching offsets should not be updated
entry = closingHelper.generateOffset(NOMINAL_ACTIVITY_BALANCE_FIXTURE.INFLEXIBLE_NOMINAL_ACTIVITY_BALANCE.convertToBalance(), 1);
assertChartAndAccount(entry, DEFAULT_NO_FLEXIBLE_BALANCE_CHART, DEFAULT_NO_FLEXIBLE_BALANCE_ACCOUNT_NBR);
// 3. flexible offsets on, but activity offsets stay the same!
entry = closingHelper.generateActivityEntry(NOMINAL_ACTIVITY_BALANCE_FIXTURE.FLEXIBLE_NOMINAL_ACTIVITY_BALANCE.convertToBalance(), 1);
assertChartAndAccount(entry, DEFAULT_FLEXIBLE_BALANCE_CHART, DEFAULT_FLEXIBLE_BALANCE_ACCOUNT_NBR);
} catch (FatalErrorException fee) {
throw new RuntimeException(fee);
}
}
/**
* Test that:
* <ol>
* <li>when flexible offsets are turned off, nominal activity offsets that should get flexible offsets don't get them</li>
* </ol>
*/
public void testNominalActivityFlexibleOffsetsWhenOffsetsOff() {
try {
NominalActivityClosingHelper closingHelper = new NominalActivityClosingHelper(fiscalYear, transactionDate, parameterService, kualiConfigurationService, objectTypeService);
OriginEntryInformation entry;
// 1. flexible offsets off, flexible offset should not be updated
toggleFlexibleOffsets(false);
entry = closingHelper.generateOffset(NOMINAL_ACTIVITY_BALANCE_FIXTURE.FLEXIBLE_NOMINAL_ACTIVITY_BALANCE.convertToBalance(), 1);
assertChartAndAccount(entry, DEFAULT_FLEXIBLE_BALANCE_CHART, DEFAULT_FLEXIBLE_BALANCE_ACCOUNT_NBR);
} catch (FatalErrorException fee) {
throw new RuntimeException(fee);
}
}
/**
* Test that:
* <ol>
* <li>when flexible offsets are turned on, encumbrance forward offsets that should get flexible offsets get them</li>
* <li>when flexible offsets are turned on, encumbrance forward offsets that should not get flexible offsets don't get them</li>
* <li>when flexible offsets are turned on, encumbrance forward entries do not get flexible offsets</li>
* </ol>
*/
public void testEncumbranceForwardFlexibleOffsetsWhenFlexibleOffsetsOn() {
OriginEntryOffsetPair entryPair;
toggleFlexibleOffsets(true);
final EncumbranceClosingOriginEntryGenerationService encumbranceClosingOriginEntryGenerationSerivce = SpringContext.getBean(EncumbranceClosingOriginEntryGenerationService.class);
// 1. when flexible offsets are turned on, encumbrance forward offsets that should get flexible offsets get them
entryPair = encumbranceClosingOriginEntryGenerationSerivce.createBeginningBalanceEntryOffsetPair(ENCUMBRANCE_FORWARD_FIXTURE.FLEXIBLE_ENCUMBRANCE.convertToEncumbrance(), fiscalYear, transactionDate);
assertChartAndAccount(entryPair.getOffset(), DEFAULT_OFFSET_CHART, DEFAULT_OFFSET_ACCOUNT_NBR);
// 2. when flexible offsets are turned on, encumbrance forward entries do not get flexible offsets
assertChartAndAccount(entryPair.getEntry(), DEFAULT_FLEXIBLE_ENCUMBRANCE_CHART, DEFAULT_FLEXIBLE_ENCUMBRANCE_ACCOUNT_NBR);
// 3. when flexible offsets are turned on, encumbrance forward offsets that should not get flexible offsets don't get them
entryPair = encumbranceClosingOriginEntryGenerationSerivce.createBeginningBalanceEntryOffsetPair(ENCUMBRANCE_FORWARD_FIXTURE.INFLEXIBLE_ENCUMBRANCE.convertToEncumbrance(), fiscalYear, transactionDate);
assertChartAndAccount(entryPair.getOffset(), DEFAULT_NO_FLEXIBLE_ENCUMBRANCE_CHART, DEFAULT_NO_FLEXIBLE_ENCUMBRANCE_ACCOUNT_NBR);
}
/**
* Test that:
* <ol>
* <li>when flexible offsets are turned off, encumbrance forward offsets that should get flexible offsets don't get them</li>
* </ol>
*/
public void testEncumbranceForwardFlexibleOffsetsWhenFlexibleOffsetsOff() {
OriginEntryOffsetPair entryPair;
toggleFlexibleOffsets(false);
final EncumbranceClosingOriginEntryGenerationService encumbranceClosingOriginEntryGenerationSerivce = SpringContext.getBean(EncumbranceClosingOriginEntryGenerationService.class);
// 1. when flexible offsets are turned off, encumbrance forward offsets that should get flexible offsets do not get them
entryPair = encumbranceClosingOriginEntryGenerationSerivce.createBeginningBalanceEntryOffsetPair(ENCUMBRANCE_FORWARD_FIXTURE.FLEXIBLE_ENCUMBRANCE.convertToEncumbrance(), fiscalYear, transactionDate);
assertChartAndAccount(entryPair.getEntry(), DEFAULT_FLEXIBLE_ENCUMBRANCE_CHART, DEFAULT_FLEXIBLE_ENCUMBRANCE_ACCOUNT_NBR);
}
/**
* Test that:
* <ul>
* <li>when flexible offsets are turned on, encumbrance forward cost share offsets that should get flexible offsets get them</li>
* <li>when flexible offsets are turned on, encumbrance forward cost share offsets that should not get flexible offsets don't get them</li>
* <li>when flexible offsets are turned on, encumbrance forward cost share entries do not get flexible offsets</li>
* </ul>
*/
public void testEncumbranceForwardCostShareFlexibleOffsetsWhenFlexibleOffsetsOn() {
OriginEntryOffsetPair entryPair;
A21SubAccount a21SubAccount;
toggleFlexibleOffsets(true);
final EncumbranceClosingOriginEntryGenerationService encumbranceClosingOriginEntryGenerationSerivce = SpringContext.getBean(EncumbranceClosingOriginEntryGenerationService.class);
// 1. when flexible offsets are turned on, encumbrance forward cost share offsets that should get flexible offsets get them
a21SubAccount = SpringContext.getBean(A21SubAccountService.class).getByPrimaryKey(CS_FLEXIBLE_ENCUMBRANCE_CHART, CS_FLEXIBLE_ENCUMBRANCE_ACCOUNT_NBR, CS_FLEXIBLE_ENCUMBRANCE_SUB_ACCT_NBR);
entryPair = encumbranceClosingOriginEntryGenerationSerivce.createCostShareBeginningBalanceEntryOffsetPair(ENCUMBRANCE_FORWARD_FIXTURE.FLEXIBLE_COST_SHARE_ENCUMBRANCE.convertToEncumbrance(), transactionDate);
assertChartAndAccount(entryPair.getOffset(), DEFAULT_OFFSET_CHART, DEFAULT_OFFSET_ACCOUNT_NBR);
// 2. when flexible offsets are turned on, encumbrance forward cost share entries do not get flexible offsets
assertChartAndAccount(entryPair.getEntry(), a21SubAccount.getCostShareChartOfAccountCode(), a21SubAccount.getCostShareSourceAccountNumber());
// 3. when flexible offsets are turned on, encumbrance forward cost share offsets that should not get flexible offsets don't get them
a21SubAccount = SpringContext.getBean(A21SubAccountService.class).getByPrimaryKey(CS_NO_FLEXIBLE_ENCUMBRANCE_CHART, CS_NO_FLEXIBLE_ENCUMBRANCE_ACCOUNT_NBR, CS_NO_FLEXIBLE_ENCUMBRANCE_SUB_ACCT_NBR);
entryPair = encumbranceClosingOriginEntryGenerationSerivce.createCostShareBeginningBalanceEntryOffsetPair(ENCUMBRANCE_FORWARD_FIXTURE.INFLEXIBLE_COST_SHARE_ENCUMBRANCE.convertToEncumbrance(), transactionDate);
assertChartAndAccount(entryPair.getOffset(), a21SubAccount.getCostShareChartOfAccountCode(), a21SubAccount.getCostShareSourceAccountNumber());
}
/**
* Test that:
* <ul>
* <li>when flexible offsets are turned off, encumbrance forward cost share offsets that should get flexible offsets don't get them</li>
* </ul>
*/
public void testEncumbranceForwardCostShareFlexibleOffsetsWhenFlexibleOffsetsOff() {
OriginEntryOffsetPair entryPair;
A21SubAccount a21SubAccount;
toggleFlexibleOffsets(false);
final EncumbranceClosingOriginEntryGenerationService encumbranceClosingOriginEntryGenerationSerivce = SpringContext.getBean(EncumbranceClosingOriginEntryGenerationService.class);
// 1. when flexible offsets are turned off, encumbrance forward cost share offsets that should get flexible offsets don't get them
a21SubAccount = SpringContext.getBean(A21SubAccountService.class).getByPrimaryKey(CS_FLEXIBLE_ENCUMBRANCE_CHART, CS_FLEXIBLE_ENCUMBRANCE_ACCOUNT_NBR, CS_FLEXIBLE_ENCUMBRANCE_SUB_ACCT_NBR);
entryPair = encumbranceClosingOriginEntryGenerationSerivce.createCostShareBeginningBalanceEntryOffsetPair(ENCUMBRANCE_FORWARD_FIXTURE.FLEXIBLE_COST_SHARE_ENCUMBRANCE.convertToEncumbrance(), transactionDate);
assertChartAndAccount(entryPair.getEntry(), a21SubAccount.getCostShareChartOfAccountCode(), a21SubAccount.getCostShareSourceAccountNumber());
}
/**
* Test that:
* <ul>
* <li>when flexible offsets are turned on, cash reversion offsets that should get flexible offsets get them</li>
* <li>when flexible offsets are turned on, cash reversion activity offsets that should not get flexible offsets don't get them</li>
* <li>when flexible offsets are turned on, cash reversion activity entries do not get flexible offsets</li>
* </ul>
*/
public void testOrganizationReversionCashFlexibleOffsetsWhenFlexibleOffsetsOn() {
// toggleFlexibleOffsets(true);
// List<Balance> flexibleBalances = new ArrayList<Balance>();
// flexibleBalances.add(ORG_REVERSION_BALANCE_FIXTURE.FLEXIBLE_ORG_REVERSION_BALANCE.convertToBalance());
// flexibleBalances.add(ORG_REVERSION_BALANCE_FIXTURE.INFLEXIBLE_ORG_REVERSION_BALANCE.convertToBalance());
//
// List<OriginEntryFull> resultingEntries = runOrganizationReversion(flexibleBalances);
// assertEquals("Number of generated OriginEntries ", new Integer(8), new Integer(resultingEntries.size()));
// // 1. when flexible offsets are turned on, cash reversion activity entries do not get flexible offsets
// assertChartAndAccount(resultingEntries.get(0), DEFAULT_FLEXIBLE_BALANCE_CHART, DEFAULT_FLEXIBLE_BALANCE_ACCOUNT_NBR);
// assertChartAndAccount(resultingEntries.get(2), OrganizationReversionMockServiceImpl.DEFAULT_CASH_REVERSION_CHART, OrganizationReversionMockServiceImpl.DEFAULT_CASH_REVERSION_ACCOUNT);
// assertChartAndAccount(resultingEntries.get(4), DEFAULT_NO_FLEXIBLE_BALANCE_CHART, DEFAULT_NO_FLEXIBLE_BALANCE_ACCOUNT_NBR);
// assertChartAndAccount(resultingEntries.get(6), OrganizationReversionMockServiceImpl.DEFAULT_CASH_REVERSION_CHART, OrganizationReversionMockServiceImpl.DEFAULT_CASH_REVERSION_ACCOUNT);
// // 2. when flexible offsets are turned on, cash reversion offsets that should get flexible offsets get them
// assertChartAndAccount(resultingEntries.get(1), DEFAULT_OFFSET_CHART, DEFAULT_OFFSET_ACCOUNT_NBR);
// assertChartAndAccount(resultingEntries.get(3), DEFAULT_OFFSET_CHART, DEFAULT_OFFSET_ACCOUNT_NBR);
// assertChartAndAccount(resultingEntries.get(7), DEFAULT_OFFSET_CHART, DEFAULT_OFFSET_ACCOUNT_NBR);
// // 3. when flexible offsets are turned on, cash reversion offsets that should not get flexible offsets don't get them
// assertChartAndAccount(resultingEntries.get(5), DEFAULT_NO_FLEXIBLE_BALANCE_CHART, DEFAULT_NO_FLEXIBLE_BALANCE_ACCOUNT_NBR);
}
/**
* Test that:
* <ul>
* <li>when flexible offsets are turned off, cash reversion activity offsets that should get flexible offsets don't get them</li>
* </ul>
*/
public void testOrganizationReversionCashFlexibleOffsetsWhenFlexibleOffsetsOff() {
// toggleFlexibleOffsets(false);
// List<Balance> flexibleBalances = new ArrayList<Balance>();
// flexibleBalances.add(ORG_REVERSION_BALANCE_FIXTURE.FLEXIBLE_ORG_REVERSION_BALANCE.convertToBalance());
//
// List<OriginEntryFull> resultingEntries = runOrganizationReversion(flexibleBalances);
// assertEquals("Number of generated OriginEntries ", new Integer(4), new Integer(resultingEntries.size()));
// assertChartAndAccount(resultingEntries.get(1), DEFAULT_FLEXIBLE_BALANCE_CHART, DEFAULT_FLEXIBLE_BALANCE_ACCOUNT_NBR);
// assertChartAndAccount(resultingEntries.get(3), OrganizationReversionMockServiceImpl.DEFAULT_CASH_REVERSION_CHART, OrganizationReversionMockServiceImpl.DEFAULT_CASH_REVERSION_ACCOUNT);
}
/**
* Runs the organization service against a given set of balances.
* @param balancesToTest a List of balances to test the organization reversion process against
* @return the list of origin entries generated by the organization reversion process
*/
private List<OriginEntryFull> runOrganizationReversion(List<Balance> balancesToTest) {
OrganizationReversionService organizationReversionService = SpringContext.getBean(OrganizationReversionService.class,"glOrganizationReversionMockService");
DateTimeService dtService = SpringContext.getBean(DateTimeService.class);
BalanceService balanceService = SpringContext.getBean(BalanceService.class);
CashOrganizationReversionCategoryLogic cashOrganizationReversionCategoryLogic = SpringContext.getBean(CashOrganizationReversionCategoryLogic.class);
PriorYearAccountService priorYearAccountService = SpringContext.getBean(PriorYearAccountService.class);
OrganizationReversionUnitOfWorkService orgReversionUnitOfWorkService = SpringContext.getBean(OrganizationReversionUnitOfWorkService.class);
OrganizationReversionProcessService organizationReversionProcessService = SpringContext.getBean(OrganizationReversionProcessService.class);
Map jobParameters = organizationReversionProcessService.getJobParameters();
Integer currentFiscalYear = new Integer(((Number)jobParameters.get(KFSConstants.UNIV_FISCAL_YR)).intValue() + 1);
Integer previousFiscalYear = new Integer(((Number)jobParameters.get(KFSConstants.UNIV_FISCAL_YR)).intValue());
Map<String, Integer> organizationReversionCounts = new HashMap<String, Integer>();
OrganizationReversionProcess orgRevProcess = SpringContext.getBean(OrganizationReversionProcess.class,"glOrganizationReversionTestProcess");
clearGlBalanceTable();
clearBatchFiles();
//we do not need to call clearCache() since no dao and jdbc calls mixted in this method.
//refer to KFSMI-7637
// persistenceService.clearCache();
for (Balance bal : balancesToTest) {
bal.setUniversityFiscalYear(previousFiscalYear);
SpringContext.getBean(BusinessObjectService.class).save(bal);
}
//TODO:- commented out
//OriginEntryGroup outputGroup = organizationReversionProcessService.createOrganizationReversionProcessOriginEntryGroup();
//TODO:- fix
//orgRevProcess.setOutputGroup(outputGroup);
orgRevProcess.setHoldGeneratedOriginEntries(true);
orgRevProcess.organizationReversionProcess(jobParameters, organizationReversionCounts);
// ye olde sanity check
assertEquals("Balances Read", new Integer(balancesToTest.size()), new Integer(orgRevProcess.getBalancesRead()));
// make sure this resulted in one Org Rev origin entry group
//TODO:- commented out
// Collection groups = originEntryGroupService.getAllOriginEntryGroup();
// assertEquals("Origin Entries Group Size", new Integer(1), new Integer(groups.size()));
//
// OriginEntryGroup group = (OriginEntryGroup) groups.iterator().next();
// assertEquals("Origin Entry Group Source Code", OriginEntrySource.YEAR_END_ORG_REVERSION, group.getSourceCode());
return orgRevProcess.getGeneratedOriginEntries();
}
/**
* Asserts that certain fields in the given origin entry equal given parameters
* @param originEntry the actual origin entry
* @param fiscalYear the expected fiscal year
* @param periodCode the expected period code
* @param chart the expected chart
* @param account the expected account
* @param objectCode the expected object code
* @param balanceType the expected balance type
* @param objectType the expected object type
* @param amount the expected amount
*/
private void assertChartAndAccount(OriginEntryInformation originEntry, String chart, String account) {
assertEquals("Origin Entry " + originEntry.toString() + " Chart of Accounts", chart, originEntry.getChartOfAccountsCode());
assertEquals("Origin Entry " + originEntry.toString() + " Account Number", account, originEntry.getAccountNumber());
}
/**
* Turns the flexible offset option on or off
* @param flexibleOffsetsOn whether we should turn the flexible offsets on or off
*/
private void toggleFlexibleOffsets(boolean flexibleOffsetsOn) {
try {
TestUtils.setSystemParameter(OffsetDefinition.class, KFSConstants.SystemGroupParameterNames.FLEXIBLE_OFFSET_ENABLED_FLAG, (flexibleOffsetsOn ? "Y" : "N"));
}
catch (Exception e) {
throw new RuntimeException(e);
}
}
private void createFlexibleOffsetAccounts() {
// clear the flexible offsets table
unitTestSqlDao.sqlCommand("delete from FP_OFST_ACCT_T");
// save our offsets
boService.save(FLEXIBLE_OFFSET_ACCOUNT_FIXTURE.FLEXIBLE_ACTIVITY_CLOSING_OFFSET_ACCOUNT.convertToOffsetAccount());
boService.save(FLEXIBLE_OFFSET_ACCOUNT_FIXTURE.FLEXIBLE_ENCUMBRANCE_FORWARD_OFFSET_ACCOUNT.convertToOffsetAccount());
boService.save(FLEXIBLE_OFFSET_ACCOUNT_FIXTURE.FLEXIBLE_CS_ENCUMBRANCE_FORWARD_OFFSET_ACCOUNT.convertToOffsetAccount());
boService.save(FLEXIBLE_OFFSET_ACCOUNT_FIXTURE.CASH_REVERSION_FORWARD_OFFSET_ACCOUNT.convertToOffsetAccount());
}
}