package org.kuali.kfs.module.ar.businessobject;
import org.apache.commons.lang.StringUtils;
import org.kuali.kfs.coa.businessobject.AccountingPeriod;
import org.kuali.kfs.coa.service.AccountingPeriodService;
import org.kuali.kfs.module.ar.ArConstants;
import java.sql.Date;
public class TimeBasedBillingPeriod extends BillingPeriod {
public TimeBasedBillingPeriod(String billingFrequency, Date awardStartDate, Date currentDate, Date lastBilledDate, AccountingPeriodService accountingPeriodService) {
super(billingFrequency, awardStartDate, currentDate, lastBilledDate, accountingPeriodService);
}
@Override
protected Date determineEndDateByFrequency() {
final AccountingPeriod accountingPeriod = findPreviousAccountingPeriod(currentDate);
return accountingPeriod.getUniversityFiscalPeriodEndDate();
}
protected Integer calculatePreviousPeriodByFrequency(Integer currentAccountingPeriodCode, int periodsInBillingFrequency) {
Integer previousAccountingPeriodCode;
final int subAmt = (currentAccountingPeriodCode % periodsInBillingFrequency) == 0 ? periodsInBillingFrequency : currentAccountingPeriodCode % periodsInBillingFrequency;
previousAccountingPeriodCode = currentAccountingPeriodCode - subAmt;
return previousAccountingPeriodCode;
}
@Override
protected boolean canThisBeBilledByBillingFrequency() {
if (StringUtils.equals(billingFrequency, ArConstants.ANNUALLY_BILLING_SCHEDULE_CODE) && accountingPeriodService.getByDate(lastBilledDate).getUniversityFiscalYear() >= accountingPeriodService.getByDate(currentDate).getUniversityFiscalYear()) {
return false;
} else if (StringUtils.equals(findPreviousAccountingPeriod(currentDate).getUniversityFiscalPeriodCode(), findPreviousAccountingPeriod(lastBilledDate).getUniversityFiscalPeriodCode()) &&
accountingPeriodService.getByDate(lastBilledDate).getUniversityFiscalYear().equals(accountingPeriodService.getByDate(currentDate).getUniversityFiscalYear())) {
return false;
}
return true;
}
@Override
protected Date determineStartDateByFrequency() {
AccountingPeriod lastBilledDateAccountingPeriod = findPreviousAccountingPeriod(lastBilledDate);
return calculateNextDay(lastBilledDateAccountingPeriod.getUniversityFiscalPeriodEndDate());
}
protected AccountingPeriod findPreviousAccountingPeriod(final Date date) {
final AccountingPeriod currentAccountingPeriod = findAccountingPeriodBy(date);
final Integer currentAccountingPeriodCode = Integer.parseInt(currentAccountingPeriod.getUniversityFiscalPeriodCode());
Integer previousAccountingPeriodCode;
previousAccountingPeriodCode = findPreviousAccountingPeriodCode(currentAccountingPeriodCode);
Integer currentFiscalYear = currentAccountingPeriod.getUniversityFiscalYear();
if (previousAccountingPeriodCode == 0) {
previousAccountingPeriodCode = 12;
currentFiscalYear -=1;
}
String periodCode;
if (previousAccountingPeriodCode < 10) {
periodCode = "0" + previousAccountingPeriodCode;
} else {
periodCode = "" + previousAccountingPeriodCode;
}
final AccountingPeriod previousAccountingPeriod = accountingPeriodService.getByPeriod(periodCode, currentFiscalYear);
return previousAccountingPeriod;
}
protected Integer findPreviousAccountingPeriodCode(Integer currentAccountingPeriodCode) {
Integer previousAccountingPeriodCode;
if (StringUtils.equals(billingFrequency, ArConstants.MONTHLY_BILLING_SCHEDULE_CODE) ||
StringUtils.equals(billingFrequency, ArConstants.MILESTONE_BILLING_SCHEDULE_CODE) ||
StringUtils.equals(billingFrequency, ArConstants.PREDETERMINED_BILLING_SCHEDULE_CODE)) {
previousAccountingPeriodCode = calculatePreviousPeriodByFrequency(currentAccountingPeriodCode, 1);
} else if (StringUtils.equals(billingFrequency, ArConstants.QUATERLY_BILLING_SCHEDULE_CODE)) {
previousAccountingPeriodCode = calculatePreviousPeriodByFrequency(currentAccountingPeriodCode, 3);
} else if (StringUtils.equals(billingFrequency, ArConstants.SEMI_ANNUALLY_BILLING_SCHEDULE_CODE)){
previousAccountingPeriodCode = calculatePreviousPeriodByFrequency(currentAccountingPeriodCode, 6);
} else {
previousAccountingPeriodCode = calculatePreviousPeriodByFrequency(currentAccountingPeriodCode, 12);
}
return previousAccountingPeriodCode;
}
}