/*
* 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.service;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import org.kuali.kfs.coa.businessobject.OffsetDefinition;
import org.kuali.kfs.gl.GeneralLedgerConstants;
import org.kuali.kfs.gl.batch.ScrubberStep;
import org.kuali.kfs.gl.batch.service.RunDateService;
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.datetime.DateTimeService;
import org.kuali.rice.core.api.parameter.ParameterEvaluator;
import org.kuali.rice.core.api.parameter.ParameterEvaluatorService;
import org.kuali.rice.coreservice.framework.parameter.ParameterService;
/**
* Test Flexible Offset in the scrubber
*/
@ConfigureContext
public class ScrubberFlexibleOffsetTest extends OriginEntryTestBase {
private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(ScrubberFlexibleOffsetTest.class);
private ScrubberService scrubberService;
/**
* Sets up the services neede for this test and also sets the date/time service's date time to one minute before midnight January 1, 2006
* @see org.kuali.kfs.gl.businessobject.OriginEntryTestBase#setUp()
*/
@Override
protected void setUp() throws Exception {
super.setUp();
scrubberService = SpringContext.getBean(ScrubberService.class);
// scrubberService.setDateTimeService(dateTimeService);
// Get the test date time service so we can specify the date/time of the run
Calendar c = Calendar.getInstance();
c.set(Calendar.DAY_OF_MONTH, 1);
c.set(Calendar.MONTH, Calendar.JANUARY);
c.set(Calendar.YEAR, TestUtils.getFiscalYearForTesting());
// since the cutoff time is set to 10am (KFSP1/Scrubber+cutoff+time+configuration)
// we want to ensure that the time is always after that time so the cutoff algorithm is not invoked
c.set(Calendar.HOUR_OF_DAY, 23);
c.set(Calendar.MINUTE, 59);
c.set(Calendar.SECOND, 59);
date = c.getTime();
dateTimeService.setCurrentDate(date);
}
/**
* @see junit.framework.TestCase#tearDown()
*/
@Override
protected void tearDown() throws Exception {
super.tearDown();
// return the run date to the current date
dateTimeService.setCurrentDate(new java.util.Date());
}
/**
* Test to make sure that flexible offset is off when the flag is off
*
* @throws Exception thrown if any exception is encountered for any reason
*/
public void testNonFlexibleOffsetGeneration() throws Exception {
super.setApplicationConfigurationFlag(OffsetDefinition.class, KFSConstants.SystemGroupParameterNames.FLEXIBLE_OFFSET_ENABLED_FLAG, false);
updateDocTypeForScrubberOffsetGeneration();
setOffsetAccounts();
final java.sql.Date scrubberDate = new java.sql.Date((SpringContext.getBean(RunDateService.class).calculateRunDate(SpringContext.getBean(DateTimeService.class).getCurrentDate())).getTime());
final String formattedRunDate = new SimpleDateFormat("yyyy-MM-dd").format(scrubberDate);
String[] input = new String[] {
TestUtils.getFiscalYearForTesting()+"BA9120656-----4190---ACEX02DI 01NOFLEX001 00000TEST FLEXIBLE OFFSET - NO FLEX 2000.00D"+TestUtils.getFiscalYearForTesting()+"-01-01 ---------- ",
TestUtils.getFiscalYearForTesting()+"BA6044900-----4190---ACEX02DI 01NOFLEX002 00000TEST FLEXIBLE OFFSET - FLEX 1000.00D"+TestUtils.getFiscalYearForTesting()+"-01-01 ---------- ",
TestUtils.getFiscalYearForTesting()+"BL1023200-----4190---ACEX02DI 01NOFLEX003 00000TEST FLEXIBLE OFFSET - FLEX 3000.00D"+TestUtils.getFiscalYearForTesting()+"-01-01 ---------- ",
TestUtils.getFiscalYearForTesting()+"BL1023200-----7030---ACEX02DI 01NOFLEX004 00000TEST FLEXIBLE OFFSET - FLEX 3500.00D"+TestUtils.getFiscalYearForTesting()+"-01-01 ---------- ",
TestUtils.getFiscalYearForTesting()+"BL2331473-----4190---ACEX02DI 01NOFLEX005 00000TEST FLEXIBLE OFFSET - FLEX 4000.00D"+TestUtils.getFiscalYearForTesting()+"-01-01 ---------- ", };
EntryHolder[] output = new EntryHolder[] {
new EntryHolder(GeneralLedgerConstants.BatchFileSystem.SCRUBBER_INPUT_FILE, TestUtils.getFiscalYearForTesting()+"BA9120656-----4190---ACEX02DI 01NOFLEX001 00000TEST FLEXIBLE OFFSET - NO FLEX 2000.00D"+TestUtils.getFiscalYearForTesting()+"-01-01 ---------- "),
new EntryHolder(GeneralLedgerConstants.BatchFileSystem.SCRUBBER_INPUT_FILE, TestUtils.getFiscalYearForTesting()+"BA6044900-----4190---ACEX02DI 01NOFLEX002 00000TEST FLEXIBLE OFFSET - FLEX 1000.00D"+TestUtils.getFiscalYearForTesting()+"-01-01 ---------- "),
new EntryHolder(GeneralLedgerConstants.BatchFileSystem.SCRUBBER_INPUT_FILE, TestUtils.getFiscalYearForTesting()+"BL1023200-----4190---ACEX02DI 01NOFLEX003 00000TEST FLEXIBLE OFFSET - FLEX 3000.00D"+TestUtils.getFiscalYearForTesting()+"-01-01 ---------- "),
new EntryHolder(GeneralLedgerConstants.BatchFileSystem.SCRUBBER_INPUT_FILE, TestUtils.getFiscalYearForTesting()+"BL1023200-----7030---ACEX02DI 01NOFLEX004 00000TEST FLEXIBLE OFFSET - FLEX 3500.00D"+TestUtils.getFiscalYearForTesting()+"-01-01 ---------- "),
new EntryHolder(GeneralLedgerConstants.BatchFileSystem.SCRUBBER_INPUT_FILE, TestUtils.getFiscalYearForTesting()+"BL2331473-----4190---ACEX02DI 01NOFLEX005 00000TEST FLEXIBLE OFFSET - FLEX 4000.00D"+TestUtils.getFiscalYearForTesting()+"-01-01 ---------- "),
new EntryHolder(GeneralLedgerConstants.BatchFileSystem.SCRUBBER_VALID_OUTPUT_FILE, TestUtils.getFiscalYearForTesting()+"BA9120656-----4190---ACEX02DI 01NOFLEX001 00000TEST FLEXIBLE OFFSET - NO FLEX +00000000000002000.00D"+TestUtils.getFiscalYearForTesting()+"-01-01 ---------- "),
new EntryHolder(GeneralLedgerConstants.BatchFileSystem.SCRUBBER_VALID_OUTPUT_FILE, TestUtils.getFiscalYearForTesting()+"BA9120656-----8000---ACAS02DI 01NOFLEX001 00000GENERATED OFFSET +00000000000002000.00C"+formattedRunDate+" ---------- "),
new EntryHolder(GeneralLedgerConstants.BatchFileSystem.SCRUBBER_VALID_OUTPUT_FILE, TestUtils.getFiscalYearForTesting()+"BA6044900-----4190---ACEX02DI 01NOFLEX002 00000TEST FLEXIBLE OFFSET - FLEX +00000000000001000.00D"+TestUtils.getFiscalYearForTesting()+"-01-01 ---------- "),
new EntryHolder(GeneralLedgerConstants.BatchFileSystem.SCRUBBER_VALID_OUTPUT_FILE, TestUtils.getFiscalYearForTesting()+"BA6044900-----8000---ACAS02DI 01NOFLEX002 00000GENERATED OFFSET +00000000000001000.00C"+formattedRunDate+" ---------- "),
new EntryHolder(GeneralLedgerConstants.BatchFileSystem.SCRUBBER_VALID_OUTPUT_FILE, TestUtils.getFiscalYearForTesting()+"BL1023200-----4190---ACEX02DI 01NOFLEX003 00000TEST FLEXIBLE OFFSET - FLEX +00000000000003000.00D"+TestUtils.getFiscalYearForTesting()+"-01-01 ---------- "),
new EntryHolder(GeneralLedgerConstants.BatchFileSystem.SCRUBBER_VALID_OUTPUT_FILE, TestUtils.getFiscalYearForTesting()+"BL1023200-----8000---ACAS02DI 01NOFLEX003 00000GENERATED OFFSET +00000000000003000.00C"+formattedRunDate+" ---------- "),
new EntryHolder(GeneralLedgerConstants.BatchFileSystem.SCRUBBER_VALID_OUTPUT_FILE, TestUtils.getFiscalYearForTesting()+"BL9520004-----8611---ACAS02DI 01NOFLEX004 00000GENERATED CAPITALIZATION +00000000000003500.00D"+TestUtils.getFiscalYearForTesting()+"-01-01 ---------- "),
new EntryHolder(GeneralLedgerConstants.BatchFileSystem.SCRUBBER_VALID_OUTPUT_FILE, TestUtils.getFiscalYearForTesting()+"BL9520004-----9899---ACFB02DI 01NOFLEX004 00000GENERATED CAPITALIZATION +00000000000003500.00C"+TestUtils.getFiscalYearForTesting()+"-01-01 ---------- "),
new EntryHolder(GeneralLedgerConstants.BatchFileSystem.SCRUBBER_VALID_OUTPUT_FILE, TestUtils.getFiscalYearForTesting()+"BL1023200-----7030---ACEX02DI 01NOFLEX004 00000TEST FLEXIBLE OFFSET - FLEX +00000000000003500.00D"+TestUtils.getFiscalYearForTesting()+"-01-01 ---------- "),
new EntryHolder(GeneralLedgerConstants.BatchFileSystem.SCRUBBER_VALID_OUTPUT_FILE, TestUtils.getFiscalYearForTesting()+"BL1023200-----8000---ACAS02DI 01NOFLEX004 00000GENERATED OFFSET +00000000000003500.00C"+formattedRunDate+" ---------- "),
new EntryHolder(GeneralLedgerConstants.BatchFileSystem.SCRUBBER_VALID_OUTPUT_FILE, TestUtils.getFiscalYearForTesting()+"BL2331473-----4190---ACEX02DI 01NOFLEX005 00000TEST FLEXIBLE OFFSET - FLEX +00000000000004000.00D"+TestUtils.getFiscalYearForTesting()+"-01-01 ---------- "),
new EntryHolder(GeneralLedgerConstants.BatchFileSystem.SCRUBBER_VALID_OUTPUT_FILE, TestUtils.getFiscalYearForTesting()+"BL2331473-----8000---ACAS02DI 01NOFLEX005 00000GENERATED OFFSET +00000000000004000.00C"+formattedRunDate+" ---------- "), };
scrub(input);
assertOriginEntries(4, output);
}
/**
* Test it when the flag is on
*
* @throws Exception thrown if any exception is encountered for any reason
*/
public void testFlexibleOffsetGeneration() throws Exception {
resetFlexibleOffsetEnableFlag(true);
updateDocTypeForScrubberOffsetGeneration();
setOffsetAccounts();
final java.sql.Date scrubberDate = new java.sql.Date((SpringContext.getBean(RunDateService.class).calculateRunDate(SpringContext.getBean(DateTimeService.class).getCurrentDate())).getTime());
final String formattedRunDate = new SimpleDateFormat("yyyy-MM-dd").format(scrubberDate);
String[] input = new String[] {
TestUtils.getFiscalYearForTesting()+"BA9120656-----4190---ACEX02DI 01NOFLEX001 00000TEST FLEXIBLE OFFSET - NO FLEX 2000.00D"+TestUtils.getFiscalYearForTesting()+"-01-01 ---------- ",
TestUtils.getFiscalYearForTesting()+"BA6044900-----4190---ACEX02DI 01NOFLEX002 00000TEST FLEXIBLE OFFSET - FLEX 1000.00D"+TestUtils.getFiscalYearForTesting()+"-01-01 ---------- ",
TestUtils.getFiscalYearForTesting()+"BL1023200-----4190---ACEX02DI 01NOFLEX003 00000TEST FLEXIBLE OFFSET - FLEX 3000.00D"+TestUtils.getFiscalYearForTesting()+"-01-01 ---------- ",
TestUtils.getFiscalYearForTesting()+"BL1023200-----7030---ACEX02DI 01NOFLEX004 00000TEST FLEXIBLE OFFSET - FLEX 3500.00D"+TestUtils.getFiscalYearForTesting()+"-01-01 ---------- ",
TestUtils.getFiscalYearForTesting()+"BL2331473-----4190---ACEX02DI 01NOFLEX005 00000TEST FLEXIBLE OFFSET - FLEX 4000.00D"+TestUtils.getFiscalYearForTesting()+"-01-01 ---------- ",
};
EntryHolder[] output = new EntryHolder[] {
new EntryHolder(GeneralLedgerConstants.BatchFileSystem.SCRUBBER_INPUT_FILE, TestUtils.getFiscalYearForTesting()+"BA9120656-----4190---ACEX02DI 01NOFLEX001 00000TEST FLEXIBLE OFFSET - NO FLEX 2000.00D"+TestUtils.getFiscalYearForTesting()+"-01-01 ---------- "),
new EntryHolder(GeneralLedgerConstants.BatchFileSystem.SCRUBBER_INPUT_FILE, TestUtils.getFiscalYearForTesting()+"BA6044900-----4190---ACEX02DI 01NOFLEX002 00000TEST FLEXIBLE OFFSET - FLEX 1000.00D"+TestUtils.getFiscalYearForTesting()+"-01-01 ---------- "),
new EntryHolder(GeneralLedgerConstants.BatchFileSystem.SCRUBBER_INPUT_FILE, TestUtils.getFiscalYearForTesting()+"BL1023200-----4190---ACEX02DI 01NOFLEX003 00000TEST FLEXIBLE OFFSET - FLEX 3000.00D"+TestUtils.getFiscalYearForTesting()+"-01-01 ---------- "),
new EntryHolder(GeneralLedgerConstants.BatchFileSystem.SCRUBBER_INPUT_FILE, TestUtils.getFiscalYearForTesting()+"BL1023200-----7030---ACEX02DI 01NOFLEX004 00000TEST FLEXIBLE OFFSET - FLEX 3500.00D"+TestUtils.getFiscalYearForTesting()+"-01-01 ---------- "),
new EntryHolder(GeneralLedgerConstants.BatchFileSystem.SCRUBBER_INPUT_FILE, TestUtils.getFiscalYearForTesting()+"BL2331473-----4190---ACEX02DI 01NOFLEX005 00000TEST FLEXIBLE OFFSET - FLEX 4000.00D"+TestUtils.getFiscalYearForTesting()+"-01-01 ---------- "),
new EntryHolder(GeneralLedgerConstants.BatchFileSystem.SCRUBBER_VALID_OUTPUT_FILE, TestUtils.getFiscalYearForTesting()+"BA9120656-----4190---ACEX02DI 01NOFLEX001 00000TEST FLEXIBLE OFFSET - NO FLEX +00000000000002000.00D"+TestUtils.getFiscalYearForTesting()+"-01-01 ---------- "),
new EntryHolder(GeneralLedgerConstants.BatchFileSystem.SCRUBBER_VALID_OUTPUT_FILE, TestUtils.getFiscalYearForTesting()+"BA9120656-----8000---ACAS02DI 01NOFLEX001 00000GENERATED OFFSET +00000000000002000.00C"+formattedRunDate+" ---------- "),
new EntryHolder(GeneralLedgerConstants.BatchFileSystem.SCRUBBER_VALID_OUTPUT_FILE, TestUtils.getFiscalYearForTesting()+"BA6044900-----4190---ACEX02DI 01NOFLEX002 00000TEST FLEXIBLE OFFSET - FLEX +00000000000001000.00D"+TestUtils.getFiscalYearForTesting()+"-01-01 ---------- "),
new EntryHolder(GeneralLedgerConstants.BatchFileSystem.SCRUBBER_VALID_OUTPUT_FILE, TestUtils.getFiscalYearForTesting()+"BL2231402-----8000---ACAS02DI 01NOFLEX002 00000GENERATED OFFSET +00000000000001000.00C"+formattedRunDate+" ---------- "),
new EntryHolder(GeneralLedgerConstants.BatchFileSystem.SCRUBBER_VALID_OUTPUT_FILE, TestUtils.getFiscalYearForTesting()+"BL1023200-----4190---ACEX02DI 01NOFLEX003 00000TEST FLEXIBLE OFFSET - FLEX +00000000000003000.00D"+TestUtils.getFiscalYearForTesting()+"-01-01 ---------- "),
new EntryHolder(GeneralLedgerConstants.BatchFileSystem.SCRUBBER_VALID_OUTPUT_FILE, TestUtils.getFiscalYearForTesting()+"BL1023200-----8000---ACAS02DI 01NOFLEX003 00000GENERATED OFFSET +00000000000003000.00C"+formattedRunDate+" ---------- "),
new EntryHolder(GeneralLedgerConstants.BatchFileSystem.SCRUBBER_VALID_OUTPUT_FILE, TestUtils.getFiscalYearForTesting()+"BL9520004-----8611---ACAS02DI 01NOFLEX004 00000GENERATED CAPITALIZATION +00000000000003500.00D"+TestUtils.getFiscalYearForTesting()+"-01-01 ---------- "),
new EntryHolder(GeneralLedgerConstants.BatchFileSystem.SCRUBBER_VALID_OUTPUT_FILE, TestUtils.getFiscalYearForTesting()+"BL2231419-----9899---ACFB02DI 01NOFLEX004 00000GENERATED CAPITALIZATION +00000000000003500.00C"+TestUtils.getFiscalYearForTesting()+"-01-01 ---------- "),
new EntryHolder(GeneralLedgerConstants.BatchFileSystem.SCRUBBER_VALID_OUTPUT_FILE, TestUtils.getFiscalYearForTesting()+"BL1023200-----7030---ACEX02DI 01NOFLEX004 00000TEST FLEXIBLE OFFSET - FLEX +00000000000003500.00D"+TestUtils.getFiscalYearForTesting()+"-01-01 ---------- "),
new EntryHolder(GeneralLedgerConstants.BatchFileSystem.SCRUBBER_VALID_OUTPUT_FILE, TestUtils.getFiscalYearForTesting()+"BL1023200-----8000---ACAS02DI 01NOFLEX004 00000GENERATED OFFSET +00000000000003500.00C"+formattedRunDate+" ---------- "),
new EntryHolder(GeneralLedgerConstants.BatchFileSystem.SCRUBBER_VALID_OUTPUT_FILE, TestUtils.getFiscalYearForTesting()+"BL2331473-----4190---ACEX02DI 01NOFLEX005 00000TEST FLEXIBLE OFFSET - FLEX +00000000000004000.00D"+TestUtils.getFiscalYearForTesting()+"-01-01 ---------- "),
new EntryHolder(GeneralLedgerConstants.BatchFileSystem.SCRUBBER_VALID_OUTPUT_FILE, TestUtils.getFiscalYearForTesting()+"BA9120657-----8000---ACAS02DI 01NOFLEX005 00000GENERATED OFFSET +00000000000004000.00C"+formattedRunDate+" ---------- "),
};
// make sure DI's will generate offsets
TestUtils.setSystemParameter(ScrubberStep.class, GeneralLedgerConstants.GlScrubberGroupRules.DOCUMENT_TYPES_REQUIRING_FLEXIBLE_OFFSET_BALANCING_ENTRIES, "DI");
scrub(input);
assertOriginEntries(4, output);
}
/**
* Updates the DI doc type, so that scrubber offsets are generated
*/
private void updateDocTypeForScrubberOffsetGeneration() {
String docTypeCode = "DI";
final ParameterService parameterService = SpringContext.getBean(ParameterService.class);
final ParameterEvaluator evaluator = /*REFACTORME*/SpringContext.getBean(ParameterEvaluatorService.class).getParameterEvaluator(ScrubberStep.class, GeneralLedgerConstants.GlScrubberGroupRules.OFFSET_DOC_TYPE_CODES, docTypeCode);
final String parameterValue = evaluator.getValue();
if (evaluator.constraintIsAllow()) {
if (!parameterValue.matches("^"+docTypeCode+"$|^"+docTypeCode+";|;"+docTypeCode+";|;"+docTypeCode+"$")) {
final String newParameterValue = parameterValue + ";" + docTypeCode;
TestUtils.setSystemParameter(ScrubberStep.class, GeneralLedgerConstants.GlScrubberGroupRules.OFFSET_DOC_TYPE_CODES, newParameterValue);
}
} else {
if (parameterValue.matches("^"+docTypeCode+"$|^"+docTypeCode+";|;"+docTypeCode+";|;"+docTypeCode+"$")) {
final String newParameterValue = parameterValue.replaceAll("^"+docTypeCode+"$|^"+docTypeCode+";|;"+docTypeCode+";|;"+docTypeCode+"$", ";");
TestUtils.setSystemParameter(ScrubberStep.class, GeneralLedgerConstants.GlScrubberGroupRules.OFFSET_DOC_TYPE_CODES, newParameterValue);
}
}
}
/**
* Creates offset account fixtures for the test
*/
private void setOffsetAccounts() {
unitTestSqlDao.sqlCommand("insert into FP_OFST_ACCT_T (FIN_COA_CD,OBJ_ID,ACCOUNT_NBR,FIN_OFST_OBJ_CD,FIN_OFST_COA_CD,FIN_OFST_ACCT_NBR) values ('BL','" + java.util.UUID.randomUUID().toString() + "','2331473','8000','BA','9120657')");
unitTestSqlDao.sqlCommand("insert into FP_OFST_ACCT_T (FIN_COA_CD,OBJ_ID,ACCOUNT_NBR,FIN_OFST_OBJ_CD,FIN_OFST_COA_CD,FIN_OFST_ACCT_NBR) values ('BA','" + java.util.UUID.randomUUID().toString() + "','6044900','8000','BL','2231402')");
unitTestSqlDao.sqlCommand("insert into FP_OFST_ACCT_T (FIN_COA_CD,OBJ_ID,ACCOUNT_NBR,FIN_OFST_OBJ_CD,FIN_OFST_COA_CD,FIN_OFST_ACCT_NBR) values ('BL','" + java.util.UUID.randomUUID().toString() + "','1023200','9040','BL','2231419')");
unitTestSqlDao.sqlCommand("insert into FP_OFST_ACCT_T (FIN_COA_CD,OBJ_ID,ACCOUNT_NBR,FIN_OFST_OBJ_CD,FIN_OFST_COA_CD,FIN_OFST_ACCT_NBR) values ('BL','" + java.util.UUID.randomUUID().toString() + "','9520004','9899','BL','2231419')");
}
/**
* Runs the scrubber on a given array of transactions
*
* @param inputTransactions String-formatted entries
*/
private void scrub(String[] inputTransactions) {
this.clearBatchFiles();
loadInputTransactions(GeneralLedgerConstants.BatchFileSystem.SCRUBBER_INPUT_FILE, inputTransactions);
//we do not need to call clearCache() since no dao and jdbc calls mixted in this method.
//refer to KFSMI-7637
// persistenceService.clearCache();
scrubberService.scrubEntries();
}
/**
* Resets the parameter which controls flexible offset generation
* @param toggle the value to toggle the parameter to
*/
private void resetFlexibleOffsetEnableFlag(boolean toggle) {
TestUtils.setSystemParameter(OffsetDefinition.class, KFSConstants.SystemGroupParameterNames.FLEXIBLE_OFFSET_ENABLED_FLAG, (toggle ? "Y" : "N"));
}
}