/* * 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.math.BigDecimal; import java.util.Iterator; import java.util.List; import java.util.Map; import org.kuali.kfs.sys.ConfigureContext; import org.kuali.kfs.sys.KFSConstants; import org.kuali.kfs.sys.batch.BatchSpringContext; import org.kuali.kfs.sys.batch.Step; import org.kuali.kfs.sys.context.KualiTestBase; import org.kuali.kfs.sys.context.ProxyUtils; import org.kuali.kfs.sys.context.SpringContext; import org.kuali.kfs.sys.context.TestUtils; import org.kuali.kfs.sys.dataaccess.UnitTestSqlDao; import org.kuali.rice.core.api.datetime.DateTimeService; import org.springframework.aop.support.AopUtils; /** * Tests the PurgeStep */ @ConfigureContext public class PurgeTest extends KualiTestBase { private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(PurgeTest.class); private UnitTestSqlDao unitTestSqlDao; private DateTimeService dateTimeService; /** * Sets up this method by getting the needed services from the SpringContext * @see junit.framework.TestCase#setUp() */ @Override protected void setUp() throws Exception { super.setUp(); unitTestSqlDao = SpringContext.getBean(UnitTestSqlDao.class); dateTimeService = SpringContext.getBean(DateTimeService.class); } /** * Tests that entries created before 2002 are purged * * @throws Exception thrown if something (likely a SQL issue) goes wrong */ public void testPurgeEntry() throws Exception { LOG.debug("testPurgeEntry() started"); final int currentFiscalYear = TestUtils.getFiscalYearForTesting().intValue(); final int pastFiscalYear = currentFiscalYear - 1; // The data keeps changing, so this will make sure the test always succeeds unitTestSqlDao.sqlCommand("delete from GL_ENTRY_T"); // Shouldn't be deleted unitTestSqlDao.sqlCommand("insert into GL_ENTRY_T (UNIV_FISCAL_YR, FIN_COA_CD, ACCOUNT_NBR, SUB_ACCT_NBR, FIN_OBJECT_CD, FIN_SUB_OBJ_CD, FIN_BALANCE_TYP_CD, FIN_OBJ_TYP_CD, UNIV_FISCAL_PRD_CD, FDOC_TYP_CD," + "FS_ORIGIN_CD, FDOC_NBR, TRN_ENTR_SEQ_NBR, TRN_LDGR_ENTR_DESC, TRN_LDGR_ENTR_AMT, TRN_DEBIT_CRDT_CD, TRANSACTION_DT," + "ORG_DOC_NBR, PROJECT_CD, ORG_REFERENCE_ID, FDOC_REF_TYP_CD, FS_REF_ORIGIN_CD, FDOC_REF_NBR, FDOC_REVERSAL_DT, TRN_ENCUM_UPDT_CD, TRN_POST_DT, TIMESTAMP) " + "values ("+currentFiscalYear+", 'BL', '1031400', '-----', '5000', '---', 'AC', 'EX', '01', 'JV', '01', 'XXX', 1,'YYY', 0, 'D', " + unitTestSqlDao.getDbPlatform().getCurTimeFunction() + ", " + "'XX', '----------', 'X', null,null,null,null,' '," + unitTestSqlDao.getDbPlatform().getCurTimeFunction() + "," + unitTestSqlDao.getDbPlatform().getCurTimeFunction() + ")"); // Should be deleted unitTestSqlDao.sqlCommand("insert into GL_ENTRY_T (UNIV_FISCAL_YR, FIN_COA_CD, ACCOUNT_NBR, SUB_ACCT_NBR, FIN_OBJECT_CD, FIN_SUB_OBJ_CD, FIN_BALANCE_TYP_CD, FIN_OBJ_TYP_CD, UNIV_FISCAL_PRD_CD, FDOC_TYP_CD," + "FS_ORIGIN_CD, FDOC_NBR, TRN_ENTR_SEQ_NBR, TRN_LDGR_ENTR_DESC, TRN_LDGR_ENTR_AMT, TRN_DEBIT_CRDT_CD, TRANSACTION_DT," + "ORG_DOC_NBR, PROJECT_CD, ORG_REFERENCE_ID, FDOC_REF_TYP_CD, FS_REF_ORIGIN_CD, FDOC_REF_NBR, FDOC_REVERSAL_DT, TRN_ENCUM_UPDT_CD, TRN_POST_DT, TIMESTAMP) " + "values ("+pastFiscalYear+", 'BL', '1031400', '-----', '5000', '---', 'AC', 'EX', '01', 'JV', '01', 'XXX', 1,'YYY', 0, 'D', " + unitTestSqlDao.getDbPlatform().getCurTimeFunction() + ", " + "'XX', '----------', 'X', null,null,null,null,' '," + unitTestSqlDao.getDbPlatform().getCurTimeFunction() + "," + unitTestSqlDao.getDbPlatform().getCurTimeFunction() + ")"); Step purgeStep = SpringContext.getBean(PurgeEntryStep.class); TestUtils.setSystemParameter(AopUtils.getTargetClass(purgeStep), KFSConstants.SystemGroupParameterNames.PURGE_GL_ENTRY_T_BEFORE_YEAR, Integer.toString(currentFiscalYear)); // Run the purge assertTrue("Should return true", purgeStep.execute(getClass().getName(), dateTimeService.getCurrentDate())); // Check the results (should be 1 row for current fiscal year) List counts = unitTestSqlDao.sqlSelect("select univ_fiscal_yr,count(*) from GL_ENTRY_T group by univ_fiscal_yr order by univ_fiscal_yr"); assertEquals("Wrong number of years found in gl_entry_t", 1, counts.size()); Map count2002 = (Map) counts.get(0); assertEquals("Selected year is wrong", currentFiscalYear, getInt(count2002, "UNIV_FISCAL_YR")); assertEquals("Wrong count for year found", 1, getInt(count2002, "COUNT(*)")); } /** * Tests that balances are purged before 1999 * * @throws Exception thrown if something (likely a SQL issue) goes wrong */ public void testPurgeBalance() throws Exception { LOG.debug("testPurgeBalance() started"); final int currentFiscalYear = TestUtils.getFiscalYearForTesting().intValue(); final int pastFiscalYear = currentFiscalYear - 1; // The data keeps changing, so this will make sure the test always succeeds unitTestSqlDao.sqlCommand("delete from GL_BALANCE_T"); // Should be deleted unitTestSqlDao.sqlCommand("insert into GL_BALANCE_T (UNIV_FISCAL_YR, FIN_COA_CD, ACCOUNT_NBR, SUB_ACCT_NBR, FIN_OBJECT_CD, FIN_SUB_OBJ_CD, FIN_BALANCE_TYP_CD, FIN_OBJ_TYP_CD, " + "ACLN_ANNL_BAL_AMT, FIN_BEG_BAL_LN_AMT, CONTR_GR_BB_AC_AMT, MO1_ACCT_LN_AMT, MO2_ACCT_LN_AMT, MO3_ACCT_LN_AMT, MO4_ACCT_LN_AMT, MO5_ACCT_LN_AMT, MO6_ACCT_LN_AMT, " + "MO7_ACCT_LN_AMT, MO8_ACCT_LN_AMT, MO9_ACCT_LN_AMT, MO10_ACCT_LN_AMT, MO11_ACCT_LN_AMT, MO12_ACCT_LN_AMT, MO13_ACCT_LN_AMT, TIMESTAMP) " + "values ("+pastFiscalYear+", 'BL', '1031400', '-----', '5000', '---', 'AC', 'EX'," + " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, " + unitTestSqlDao.getDbPlatform().getCurTimeFunction() + ")"); // Shouldn't be deleted unitTestSqlDao.sqlCommand("insert into GL_BALANCE_T (UNIV_FISCAL_YR, FIN_COA_CD, ACCOUNT_NBR, SUB_ACCT_NBR, FIN_OBJECT_CD, FIN_SUB_OBJ_CD, FIN_BALANCE_TYP_CD, FIN_OBJ_TYP_CD, " + "ACLN_ANNL_BAL_AMT, FIN_BEG_BAL_LN_AMT, CONTR_GR_BB_AC_AMT, MO1_ACCT_LN_AMT, MO2_ACCT_LN_AMT, MO3_ACCT_LN_AMT, MO4_ACCT_LN_AMT, MO5_ACCT_LN_AMT, MO6_ACCT_LN_AMT, " + "MO7_ACCT_LN_AMT, MO8_ACCT_LN_AMT, MO9_ACCT_LN_AMT, MO10_ACCT_LN_AMT, MO11_ACCT_LN_AMT, MO12_ACCT_LN_AMT, MO13_ACCT_LN_AMT, TIMESTAMP) " + "values ("+currentFiscalYear+", 'BL', '1031400', '-----', '5000', '---', 'AC', 'EX'," + " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, " + unitTestSqlDao.getDbPlatform().getCurTimeFunction() + ")"); Step purgeStep = BatchSpringContext.getStep("purgeBalanceStep"); TestUtils.setSystemParameter(AopUtils.getTargetClass(purgeStep), KFSConstants.SystemGroupParameterNames.PURGE_GL_ENTRY_T_BEFORE_YEAR, Integer.toString(currentFiscalYear)); // Run the purge assertTrue("Should return true", purgeStep.execute(getClass().getName(), dateTimeService.getCurrentDate())); // Check the results (should be 1 row for 1999) List counts = unitTestSqlDao.sqlSelect("select univ_fiscal_yr,count(*) from GL_BALANCE_T group by univ_fiscal_yr order by univ_fiscal_yr"); assertEquals("Wrong number of years found in GL_BALANCE_T", 1, counts.size()); Map count1999 = (Map) counts.get(0); assertEquals("Selected year is wrong", currentFiscalYear, getInt(count1999, "UNIV_FISCAL_YR")); assertEquals("Wrong count for year found", 1, getInt(count1999, "COUNT(*)")); } /** * Tests that account balances are purged before 1999 * * @throws Exception thrown if something (likely a SQL issue) goes wrong */ public void testPurgeAccountBalances() throws Exception { LOG.debug("testPurgeAccountBalances() started"); final int currentFiscalYear = TestUtils.getFiscalYearForTesting().intValue(); final int pastFiscalYear = currentFiscalYear - 1; // Clear out the table to start with unitTestSqlDao.sqlCommand("DELETE FROM GL_ACCT_BALANCES_T"); // Should be deleted unitTestSqlDao.sqlCommand("INSERT INTO GL_ACCT_BALANCES_T (UNIV_FISCAL_YR, FIN_COA_CD, ACCOUNT_NBR, SUB_ACCT_NBR, FIN_OBJECT_CD, FIN_SUB_OBJ_CD, " + "CURR_BDLN_BAL_AMT, ACLN_ACTLS_BAL_AMT, ACLN_ENCUM_BAL_AMT, TIMESTAMP) VALUES ("+pastFiscalYear+", 'BL', '1031400', '-----', '5000', " + "'---'," + " 0, 0, 0, " + unitTestSqlDao.getDbPlatform().getCurTimeFunction() + ")"); // Shouldn't be deleted unitTestSqlDao.sqlCommand("INSERT INTO GL_ACCT_BALANCES_T (UNIV_FISCAL_YR, FIN_COA_CD, ACCOUNT_NBR, SUB_ACCT_NBR, FIN_OBJECT_CD, FIN_SUB_OBJ_CD, " + "CURR_BDLN_BAL_AMT, ACLN_ACTLS_BAL_AMT, ACLN_ENCUM_BAL_AMT, TIMESTAMP) VALUES ("+currentFiscalYear+", 'BL', '1031400', '-----', '5000', " + "'---'," + " 0, 0, 0, " + unitTestSqlDao.getDbPlatform().getCurTimeFunction() + ")"); Step purgeStep = BatchSpringContext.getStep("purgeAccountBalancesStep"); Class purgeStepClass = ProxyUtils.getTargetIfProxied(purgeStep).getClass(); TestUtils.setSystemParameter(purgeStepClass, KFSConstants.SystemGroupParameterNames.PURGE_GL_ENTRY_T_BEFORE_YEAR, Integer.toString(currentFiscalYear)); // Run the purge assertTrue("Should return true", purgeStep.execute(getClass().getName(), dateTimeService.getCurrentDate())); // Check the results (should be 1 row for 1999) List counts = unitTestSqlDao.sqlSelect("select univ_fiscal_yr,count(*) from GL_ACCT_BALANCES_T group by univ_fiscal_yr order by univ_fiscal_yr"); assertEquals("Wrong number of years found in gl_acct_balances_t", 1, counts.size()); Map count1999 = (Map) counts.get(0); assertEquals("Selected year is wrong", currentFiscalYear, getInt(count1999, "UNIV_FISCAL_YR")); assertEquals("Wrong count for year found", 1, getInt(count1999, "COUNT(*)")); } /** * Tests that encumbrances are purged before 2002 * * @throws Exception thrown if something (likely a SQL issue) goes wrong */ public void testPurgeEncumbrance() throws Exception { LOG.debug("testPurgeEncumbrance() started"); final int currentFiscalYear = TestUtils.getFiscalYearForTesting().intValue(); final int pastFiscalYear = currentFiscalYear - 1; // Clear out the table unitTestSqlDao.sqlCommand("DELETE FROM GL_ENCUMBRANCE_T"); // Should be deleted unitTestSqlDao.sqlCommand("insert into GL_ENCUMBRANCE_T (UNIV_FISCAL_YR, FIN_COA_CD, ACCOUNT_NBR, SUB_ACCT_NBR, FIN_OBJECT_CD, FIN_SUB_OBJ_CD, " + "FIN_BALANCE_TYP_CD, FDOC_TYP_CD, FS_ORIGIN_CD, FDOC_NBR, TRN_ENCUM_DESC, TRN_ENCUM_DT, ACLN_ENCUM_AMT, ACLN_ENCUM_CLS_AMT, " + "ACLN_ENCUM_PRG_CD, TIMESTAMP) values ("+pastFiscalYear+", 'BL', '1031400', '-----', '5000', '---', 'AC', 'JV', '01', 'XXX','Desc'," + unitTestSqlDao.getDbPlatform().getCurTimeFunction() + ", 0, 0, 'N', " + unitTestSqlDao.getDbPlatform().getCurTimeFunction() + ")"); // Shouldn't be deleted unitTestSqlDao.sqlCommand("insert into GL_ENCUMBRANCE_T (UNIV_FISCAL_YR, FIN_COA_CD, ACCOUNT_NBR, SUB_ACCT_NBR, FIN_OBJECT_CD, FIN_SUB_OBJ_CD, " + "FIN_BALANCE_TYP_CD, FDOC_TYP_CD, FS_ORIGIN_CD, FDOC_NBR, TRN_ENCUM_DESC, TRN_ENCUM_DT, ACLN_ENCUM_AMT, ACLN_ENCUM_CLS_AMT, " + "ACLN_ENCUM_PRG_CD, TIMESTAMP) values ("+currentFiscalYear+", 'BL', '1031400', '-----', '5000', '---', 'AC', 'JV', '01', 'XXX', 'Desc', " + unitTestSqlDao.getDbPlatform().getCurTimeFunction() + ", " + "0, 0, 'N', " + unitTestSqlDao.getDbPlatform().getCurTimeFunction() + ")"); Step purgeStep = BatchSpringContext.getStep("purgeEncumbranceStep"); Class purgeStepClass = ProxyUtils.getTargetIfProxied(purgeStep).getClass(); TestUtils.setSystemParameter(purgeStepClass, KFSConstants.SystemGroupParameterNames.PURGE_GL_ENTRY_T_BEFORE_YEAR, Integer.toString(currentFiscalYear)); // Run the purge assertTrue("Should return true", purgeStep.execute(getClass().getName(), dateTimeService.getCurrentDate())); // Check the results (should be 1 row for 2002) List counts = unitTestSqlDao.sqlSelect("select univ_fiscal_yr,count(*) from GL_ENCUMBRANCE_T group by univ_fiscal_yr order by univ_fiscal_yr"); assertEquals("Wrong number of years found in gl_encumbrance_t", 1, counts.size()); Map count2002 = (Map) counts.get(0); assertEquals("Selected year is wrong", currentFiscalYear, getInt(count2002, "UNIV_FISCAL_YR")); assertEquals("Wrong count for year found", 1, getInt(count2002, "COUNT(*)")); } /** * Tests that collector details are purged before 2002 * * @throws Exception thrown if something (likely a SQL issue) goes wrong */ public void testPurgeCollectorDetail() throws Exception { LOG.debug("testPurgeCollectorDetail() started"); final int currentFiscalYear = TestUtils.getFiscalYearForTesting().intValue(); final int pastFiscalYear = currentFiscalYear - 1; // Clear out the table unitTestSqlDao.sqlCommand("DELETE FROM GL_ID_BILL_T"); // Should be deleted unitTestSqlDao.sqlCommand("insert into GL_ID_BILL_T (FS_ORIGIN_CD,UNIV_FISCAL_PRD_CD, UNIV_FISCAL_YR, CREATE_DT, FIN_COA_CD, ACCOUNT_NBR, " + "SUB_ACCT_NBR, FIN_OBJECT_CD, FIN_SUB_OBJ_CD, FDOC_IDBIL_SEQ_NBR, FDOC_TYP_CD, FDOC_NBR, OBJ_ID, VER_NBR, FDOC_IDBIL_ITM_AMT, " + "FDOC_IDBIL_NTE_TXT, FIN_OBJ_TYP_CD, FIN_BALANCE_TYP_CD, TRN_ENTR_SEQ_NBR) values ('01','01', "+pastFiscalYear+", " + unitTestSqlDao.getDbPlatform().getCurTimeFunction() + ", 'BL', '1031400', '-----', '5000', '---', '1', 'ID22', 'XXX','" + java.util.UUID.randomUUID().toString() + "', 1, 0, 'x', 'EX', 'AC', 1)"); // Shouldn't be deleted unitTestSqlDao.sqlCommand("insert into GL_ID_BILL_T (FS_ORIGIN_CD,UNIV_FISCAL_PRD_CD, UNIV_FISCAL_YR, CREATE_DT, FIN_COA_CD, ACCOUNT_NBR, " + "SUB_ACCT_NBR, FIN_OBJECT_CD, FIN_SUB_OBJ_CD, FDOC_IDBIL_SEQ_NBR, FDOC_TYP_CD, FDOC_NBR, OBJ_ID, VER_NBR, FDOC_IDBIL_ITM_AMT, " + "FDOC_IDBIL_NTE_TXT, FIN_OBJ_TYP_CD, FIN_BALANCE_TYP_CD, TRN_ENTR_SEQ_NBR) values ('01','01', "+currentFiscalYear+", " + unitTestSqlDao.getDbPlatform().getCurTimeFunction() + ", 'BL', '1031400', '-----', '5000', '---', '1', 'ID22', 'XXX','" + java.util.UUID.randomUUID().toString() + "', 1, 0, 'x', 'EX', 'AC', 2)"); Step purgeStep = BatchSpringContext.getStep("purgeCollectorDetailStep"); Class purgeStepClass = ProxyUtils.getTargetIfProxied(purgeStep).getClass(); TestUtils.setSystemParameter(purgeStepClass, KFSConstants.SystemGroupParameterNames.PURGE_GL_ENTRY_T_BEFORE_YEAR, Integer.toString(currentFiscalYear)); // Run the purge assertTrue("Should return true", purgeStep.execute(getClass().getName(), dateTimeService.getCurrentDate())); // Check the results (should be 1 row for 2002) List counts = unitTestSqlDao.sqlSelect("select univ_fiscal_yr,count(*) from GL_ID_BILL_T group by univ_fiscal_yr order by univ_fiscal_yr"); assertEquals("Wrong number of years found in gl_id_bill_t", 1, counts.size()); Map count2002 = (Map) counts.get(0); assertEquals("Selected year is wrong", currentFiscalYear, getInt(count2002, "UNIV_FISCAL_YR")); assertEquals("Wrong count for year found", 1, getInt(count2002, "COUNT(*)")); } /** * Tests that sufficient funds balances are purged before 1999 * * @throws Exception thrown if something (likely a SQL issue) goes wrong */ public void testPurgeSufficientFundsBalances() throws Exception { LOG.debug("testPurgeSufficientFundsBalances() started"); final int currentFiscalYear = TestUtils.getFiscalYearForTesting().intValue(); final int pastFiscalYear = currentFiscalYear - 1; // Clear out the table unitTestSqlDao.sqlCommand("DELETE FROM GL_SF_BALANCES_T"); // Should be deleted unitTestSqlDao.sqlCommand("insert into GL_SF_BALANCES_T (UNIV_FISCAL_YR, FIN_COA_CD, ACCOUNT_NBR, FIN_OBJECT_CD, ACCT_SF_CD, " + "CURR_BDGT_BAL_AMT, ACCT_ACTL_XPND_AMT, ACCT_ENCUM_AMT, TIMESTAMP) values ("+pastFiscalYear+", 'BL', '1031400', '5000','H', 0, 0, 0, " + unitTestSqlDao.getDbPlatform().getCurTimeFunction() + ")"); // Shouldn't be deleted unitTestSqlDao.sqlCommand("insert into GL_SF_BALANCES_T (UNIV_FISCAL_YR, FIN_COA_CD, ACCOUNT_NBR, FIN_OBJECT_CD, ACCT_SF_CD, " + "CURR_BDGT_BAL_AMT, ACCT_ACTL_XPND_AMT, ACCT_ENCUM_AMT, TIMESTAMP) values ("+currentFiscalYear+", 'BL', '1031400', '5000','H', 0, 0, 0, " + unitTestSqlDao.getDbPlatform().getCurTimeFunction() + ")"); Step purgeStep = BatchSpringContext.getStep("purgeSufficientFundBalancesStep"); Class purgeStepClass = ProxyUtils.getTargetIfProxied(purgeStep).getClass(); TestUtils.setSystemParameter(purgeStepClass, KFSConstants.SystemGroupParameterNames.PURGE_GL_ENTRY_T_BEFORE_YEAR, Integer.toString(currentFiscalYear)); // Run the purge assertTrue("Should return true", purgeStep.execute(getClass().getName(), dateTimeService.getCurrentDate())); // Check the results (should be 1 row for 1999) List counts = unitTestSqlDao.sqlSelect("select univ_fiscal_yr,count(*) from GL_SF_BALANCES_T group by univ_fiscal_yr order by univ_fiscal_yr"); assertEquals("Wrong number of years found in GL_SF_BALANCES_T", 1, counts.size()); Map count1999 = (Map) counts.get(0); assertEquals("Selected year is wrong", currentFiscalYear, getInt(count1999, "UNIV_FISCAL_YR")); assertEquals("Wrong count for year found", 1, getInt(count1999, "COUNT(*)")); } /** * Prints the contents of a List of Maps to System.err * * @param maps a List of Maps */ private void printList(List maps) { for (Iterator iter = maps.iterator(); iter.hasNext();) { Map element = (Map) iter.next(); StringBuffer sb = new StringBuffer(); for (Iterator iterator = element.keySet().iterator(); iterator.hasNext();) { String field = (String) iterator.next(); sb.append(field); sb.append(" = "); sb.append(element.get(field)); sb.append(","); } System.err.println(sb); } } /** * Attempts to convert the value of a MapEntry with the given key into an int * * @param values a Map of values * @param field the key of the value to convert * @return the converted value or -1 if conversion was unsuccessful */ private int getInt(Map values, String field) { Object o = values.get(field); if (o == null) { return -1; } else if (o instanceof BigDecimal) { BigDecimal number = (BigDecimal) o; return number.intValue(); } else if (o instanceof Long) { Long number = (Long) o; return number.intValue(); } else { return -1; } } }