/*
* 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.module.ar.document.service;
import static org.kuali.kfs.sys.fixture.UserNameFixture.khuntley;
import java.sql.Date;
import org.kuali.kfs.coa.businessobject.AccountingPeriod;
import org.kuali.kfs.coa.service.AccountingPeriodService;
import org.kuali.kfs.integration.cg.ContractsAndGrantsBillingAward;
import org.kuali.kfs.module.ar.batch.service.VerifyBillingFrequencyService;
import org.kuali.kfs.module.ar.batch.service.impl.VerifyBillingFrequencyServiceImpl;
import org.kuali.kfs.module.ar.businessobject.BillingPeriod;
import org.kuali.kfs.module.ar.fixture.ARAwardFixture;
import org.kuali.kfs.sys.ConfigureContext;
import org.kuali.kfs.sys.context.KualiTestBase;
import org.kuali.kfs.sys.context.SpringContext;
import org.kuali.kfs.sys.service.ConfigurableDateService;
import org.kuali.kfs.sys.service.UniversityDateService;
import org.kuali.kfs.sys.service.impl.ConfigurableDateTimeServiceImpl;
import org.kuali.rice.core.api.datetime.DateTimeService;
import org.kuali.rice.krad.service.BusinessObjectService;
@ConfigureContext(session = khuntley)
public class VerifyBillingFrequencyServiceTest extends KualiTestBase {
private VerifyBillingFrequencyService verifyBillingFrequencyService;
private AccountingPeriodService accountingPeriodService;
public void setUp() throws Exception {
super.setUp();
verifyBillingFrequencyService = new VerifyBillingFrequencyServiceImpl();
accountingPeriodService = SpringContext.getBean(AccountingPeriodService.class);
((VerifyBillingFrequencyServiceImpl)verifyBillingFrequencyService).setBusinessObjectService(SpringContext.getBean(BusinessObjectService.class));
((VerifyBillingFrequencyServiceImpl)verifyBillingFrequencyService).setAccountingPeriodService(accountingPeriodService);
((VerifyBillingFrequencyServiceImpl)verifyBillingFrequencyService).setUniversityDateService(SpringContext.getBean(UniversityDateService.class));
}
public void testMonthlyNullLastBilledDate() {
runBillingTest("2011-10-31", "2011-01-01", "2011-09-30", ARAwardFixture.CG_AWARD_MONTHLY_BILLED_DATE_NULL, true);
}
public void testMilestoneNullLastBilledDate() {
runBillingTest("2011-10-31", "2011-01-01", "2011-09-30", ARAwardFixture.CG_AWARD_MILESTONE_BILLED_DATE_NULL,true);
}
public void testPredeterminedBillingNullLastBilledDate() {
runBillingTest("2011-10-31", "2011-01-01", "2011-09-30", ARAwardFixture.CG_AWARD_PREDETERMINED_BILLED_DATE_NULL,true);
}
public void testQuarterlyNullLastBilledDate() {
runBillingTest("2011-10-31", "2011-01-01", "2011-09-30", ARAwardFixture.CG_AWARD_QUAR_BILLED_DATE_NULL,true);
}
public void testSemiAnnualNullLastBilledDate() {
runBillingTest("2011-10-31", "2011-01-01", "2011-06-30", ARAwardFixture.CG_AWARD_SEMI_ANN_BILLED_DATE_NULL,true);
}
public void testAnnualNullLastBilledDate() {
runBillingTest("2011-10-31", "2011-01-01", "2011-06-30", ARAwardFixture.CG_AWARD_ANNUAL_BILLED_DATE_NULL,true);
}
public void testMonthValidLastBilledDate() {
runBillingTest("2011-11-01", "2011-09-01", "2011-10-31", ARAwardFixture.CG_AWARD_MONTHLY_BILLED_DATE_VALID,true);
}
public void testMilestoneValidLastBilledDate() {
runBillingTest("2011-11-01", "2011-09-01", "2011-10-31", ARAwardFixture.CG_AWARD_MILESTONE_BILLED_DATE_VALID,true);
}
public void testPredeterminedValidLastBilledDate() {
runBillingTest("2011-11-01", "2011-09-01", "2011-10-31", ARAwardFixture.CG_AWARD_PREDETERMINED_BILLED_DATE_VALID,true);
}
public void testQuarterlyValidLastBilledDate() {
runBillingTest("2011-11-01", "2011-04-01", "2011-09-30", ARAwardFixture.CG_AWARD_QUAR_BILLED_DATE_VALID,true);
}
public void testSemiAnnualBillingValidLastBilledDate() {
runBillingTest("2012-01-01","2011-01-01","2011-12-31",ARAwardFixture.CG_AWARD_SEMI_ANN_BILLED_DATE_VALID,true);
}
public void testAnnualBillingValidLastBilledDate() {
runBillingTest("2011-07-01", "2009-07-01", "2011-06-30", ARAwardFixture.CG_AWARD_ANNUAL_BILLED_DATE_VALID, true);
}
public void testLOCBillingNullLastBilledDate() {
runLOCBillingTest("2011-10-31", "2011-01-01", ARAwardFixture.CG_AWARD_LOCB_BILLED_DATE_NULL);
}
public void testLOCBillingValidLastBilledDate() {
runLOCBillingTest("2011-12-15", "2010-12-13", ARAwardFixture.CG_AWARD_LOCB_BILLED_DATE_VALID);
}
protected void runLOCBillingTest(String currentDate, String startDate, ARAwardFixture awardFixture) {
AccountingPeriod currPeriod = accountingPeriodService.getByDate(Date.valueOf(currentDate));
ContractsAndGrantsBillingAward award = awardFixture.createAward();
DateTimeService dateTimeService = new ConfigurableDateTimeServiceImpl();
((ConfigurableDateTimeServiceImpl)dateTimeService).setCurrentDate(Date.valueOf(currentDate));
((VerifyBillingFrequencyServiceImpl)verifyBillingFrequencyService).setDateTimeService(dateTimeService);
BillingPeriod billingPeriod = verifyBillingFrequencyService.getStartDateAndEndDateOfPreviousBillingPeriod(award, currPeriod);
assertEquals(Date.valueOf(startDate), billingPeriod.getStartDate());
}
protected void runBillingTest(String currentDate, String beginningDate, String endDate, ARAwardFixture awardFixture, boolean expectedWithinGracePeriod) {
Date date = Date.valueOf(currentDate);
AccountingPeriod currPeriod = accountingPeriodService.getByDate(date);
ContractsAndGrantsBillingAward award = awardFixture.createAward();
DateTimeService dateTimeService = new ConfigurableDateTimeServiceImpl();
((ConfigurableDateTimeServiceImpl)dateTimeService).setCurrentDate(Date.valueOf(currentDate));
((VerifyBillingFrequencyServiceImpl)verifyBillingFrequencyService).setDateTimeService(dateTimeService);
BillingPeriod billingPeriod = verifyBillingFrequencyService.getStartDateAndEndDateOfPreviousBillingPeriod(award, currPeriod);
assertEquals(Date.valueOf(beginningDate), billingPeriod.getStartDate());
assertEquals(Date.valueOf(endDate), billingPeriod.getEndDate());
boolean withinGracePeriod = verifyBillingFrequencyService.calculateIfWithinGracePeriod(date, billingPeriod.getEndDate(), billingPeriod.getStartDate(), award.getLastBilledDate(), new Integer(0));
assertEquals(expectedWithinGracePeriod, withinGracePeriod);
}
}