package org.kuali.kfs.module.ar.businessobject; import org.apache.commons.lang.StringUtils; import org.junit.Assert; import org.kuali.kfs.coa.businessobject.AccountingPeriod; import org.kuali.kfs.coa.service.AccountingPeriodService; import org.kuali.kfs.coa.service.impl.AccountingPeriodServiceImpl; import org.kuali.kfs.sys.util.KfsDateUtils; import java.sql.Date; import java.util.Calendar; /** * Created by smith750 on 5/5/2015. */ public class BillingPeriodTest { protected void verifyBillingPeriodPriorTo(String awardStartDate, String currentDate, String lastBilledDate, String expectedBillingPeriodStart, String expectedBillingPeriodEnd, boolean expectedBillable, String billingFrequencyCode) { Date lastBilledDateAsDate = nullSafeDateFromString(lastBilledDate); AccountingPeriodService accountingPeriodService = getMockAccountingPeriodService(); BillingPeriod priorBillingPeriod = BillingPeriod.determineBillingPeriodPriorTo(Date.valueOf(awardStartDate), Date.valueOf(currentDate), lastBilledDateAsDate, billingFrequencyCode, accountingPeriodService); Date expectedStartDate = nullSafeDateFromString(expectedBillingPeriodStart); Assert.assertEquals("Billing period start wasn't what we thought it was going to be", expectedStartDate, priorBillingPeriod.getStartDate()); Date expectedEndDate = nullSafeDateFromString(expectedBillingPeriodEnd); Assert.assertEquals("Billing period end wasn't what we thought it was going to be", expectedEndDate, priorBillingPeriod.getEndDate()); Assert.assertEquals("Billing period billable wasn't what we thought it was going to be", expectedBillable, priorBillingPeriod.isBillable()); } protected AccountingPeriodServiceImpl getMockAccountingPeriodService() { return new AccountingPeriodServiceImpl() { @Override public AccountingPeriod getByDate(final Date currentDate) { return new AccountingPeriod() { @Override public Date getUniversityFiscalPeriodEndDate() { Calendar cal = Calendar.getInstance(); cal.setTime(currentDate); final int lastDayOfMonth = cal.getActualMaximum(Calendar.DAY_OF_MONTH); cal.set(Calendar.DAY_OF_MONTH, lastDayOfMonth); return new Date(cal.getTimeInMillis()); } @Override public Integer getUniversityFiscalYear() { Calendar cal = Calendar.getInstance(); cal.setTime(currentDate); if (KfsDateUtils.isSameDayOrEarlier(currentDate, Date.valueOf(cal.get(Calendar.YEAR) + "-06-30"))) { return cal.get(Calendar.YEAR); } return cal.get(Calendar.YEAR)+1; } @Override public String getUniversityFiscalPeriodCode() { Calendar cal = Calendar.getInstance(); cal.setTime(currentDate); final int month = (cal.get(Calendar.MONTH) + 7) % 12; if (month == 0) { return "12"; } else if (month < 10) { return "0"+month; } else { return ""+month; } } }; } @Override public AccountingPeriod getByPeriod(final String periodCode, final Integer fiscalYear) { return new AccountingPeriod() { @Override public Date getUniversityFiscalPeriodEndDate() { int periodCodeMonth = Integer.parseInt(periodCode) - 7; if (periodCodeMonth < 0) { periodCodeMonth += 12; } int year = (periodCodeMonth >= 7) ? fiscalYear - 1 : fiscalYear; Calendar cal = Calendar.getInstance(); cal.set(Calendar.MONTH, periodCodeMonth); cal.set(Calendar.YEAR, year); cal.set(Calendar.DAY_OF_MONTH,1); final int lastDayOfMonth = cal.getActualMaximum(Calendar.DAY_OF_MONTH); cal.set(Calendar.DAY_OF_MONTH, lastDayOfMonth); return KfsDateUtils.clearTimeFields(new Date(cal.getTimeInMillis())); } @Override public Integer getUniversityFiscalYear() { return fiscalYear; } @Override public String getUniversityFiscalPeriodCode() { return periodCode; } }; } }; } protected Date nullSafeDateFromString(String date) { return (StringUtils.isBlank(date)) ? null : Date.valueOf(date); } }