/*
* 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.tem.document.validation.impl;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.kuali.kfs.coa.businessobject.Account;
import org.kuali.kfs.module.tem.TemKeyConstants;
import org.kuali.kfs.module.tem.TemPropertyConstants;
import org.kuali.kfs.module.tem.businessobject.AccountingDistribution;
import org.kuali.kfs.module.tem.businessobject.TemDistributionAccountingLine;
import org.kuali.kfs.module.tem.document.validation.event.AddDistributionAccountingLineValidationEvent;
import org.kuali.kfs.module.tem.document.validation.event.AssignDistributionAccountingLinesEvent;
import org.kuali.kfs.module.tem.document.web.bean.TravelMvcWrapperBean;
import org.kuali.kfs.module.tem.service.AccountingDistributionService;
import org.kuali.kfs.sys.KFSPropertyConstants;
import org.kuali.kfs.sys.context.SpringContext;
import org.kuali.kfs.sys.document.validation.GenericValidation;
import org.kuali.kfs.sys.document.validation.event.AttributedDocumentEvent;
import org.kuali.rice.core.api.util.RiceKeyConstants;
import org.kuali.rice.core.api.util.type.KualiDecimal;
import org.kuali.rice.krad.service.BusinessObjectService;
import org.kuali.rice.krad.service.DictionaryValidationService;
import org.kuali.rice.krad.util.GlobalVariables;
public class TravelDocumentDistributionAccountingLinesValidation extends GenericValidation {
protected DictionaryValidationService dictionaryValidationService;
protected BusinessObjectService businessObjectService;
protected AccountingDistributionService accountingDistributionService;
/**
* @see org.kuali.kfs.sys.document.validation.Validation#validate(org.kuali.kfs.sys.document.validation.event.AttributedDocumentEvent)
*/
@Override
public boolean validate(AttributedDocumentEvent event) {
boolean success = true;
if (event instanceof AddDistributionAccountingLineValidationEvent){
AddDistributionAccountingLineValidationEvent distributionEvent = (AddDistributionAccountingLineValidationEvent) event;
TravelMvcWrapperBean wrapper = distributionEvent.getTravelForm();
//Check data dictionary validations
success = getDictionaryValidationService().isBusinessObjectValid(wrapper.getAccountDistributionnewSourceLine(), "");
TemDistributionAccountingLine line = wrapper.getAccountDistributionnewSourceLine();
List<TemDistributionAccountingLine> lines = wrapper.getAccountDistributionsourceAccountingLines();
if (success){
//Does account exist?
Map<String,String> fieldValues = new HashMap<String, String>();
fieldValues.put(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE, line.getChartOfAccountsCode());
fieldValues.put(KFSPropertyConstants.ACCOUNT_NUMBER, line.getAccountNumber());
Account account = getBusinessObjectService().findByPrimaryKey(Account.class, fieldValues);
if (account == null){
GlobalVariables.getMessageMap().putError(KFSPropertyConstants.ACCOUNT_NUMBER,
RiceKeyConstants.ERROR_EXISTENCE, "Account Number");
return false;
}
if (line.getAccountLinePercent() == null){
line.setAccountLinePercent(new BigDecimal(0));
}
if (line.getAmount() == null){
line.setAmount(KualiDecimal.ZERO);
}
if (line.getAmount().isLessThan(KualiDecimal.ZERO)){
GlobalVariables.getMessageMap().putError(KFSPropertyConstants.AMOUNT,
TemKeyConstants.ERROR_TEM_DISTRIBUTION_ACCOUNTING_LINES_AMOUNT_OR_PERCENT, "Amount");
success = false;
}
if (line.getAccountLinePercent().doubleValue() < 0){
GlobalVariables.getMessageMap().putError(TemPropertyConstants.ACCOUNT_LINE_PERCENT,
TemKeyConstants.ERROR_TEM_DISTRIBUTION_ACCOUNTING_LINES_AMOUNT_OR_PERCENT, "Percent");
success = false;
}
if (line.getAccountLinePercent().doubleValue() == 0 && line.getAmount().isLessThan(KualiDecimal.ZERO)){
GlobalVariables.getMessageMap().putError(KFSPropertyConstants.AMOUNT,
TemKeyConstants.ERROR_TEM_DISTRIBUTION_ACCOUNTING_LINES_AMOUNT_OR_PERCENT, "Amount");
GlobalVariables.getMessageMap().putError(TemPropertyConstants.ACCOUNT_LINE_PERCENT,
TemKeyConstants.ERROR_TEM_DISTRIBUTION_ACCOUNTING_LINES_AMOUNT_OR_PERCENT, "Percent");
return false;
}
}
}
else if (event instanceof AssignDistributionAccountingLinesEvent){
GlobalVariables.getMessageMap().clearErrorPath();
AssignDistributionAccountingLinesEvent distributionEvent = (AssignDistributionAccountingLinesEvent) event;
TravelMvcWrapperBean wrapper = distributionEvent.getTravelForm();
if (!getAccountingDistributionService().getTotalAmount(wrapper.getAccountDistributionsourceAccountingLines()).equals(wrapper.getDistributionRemainingAmount(true))
|| getAccountingDistributionService().getTotalPercent(wrapper.getAccountDistributionsourceAccountingLines()).compareTo(new BigDecimal(100)) != 0){
GlobalVariables.getMessageMap().putError(TemPropertyConstants.ACCOUNT_DISTRIBUTION_SRC_LINES + "[0]." + TemPropertyConstants.ACCOUNT_LINE_PERCENT,
TemKeyConstants.ERROR_TEM_DISTRIBUTION_ACCOUNTING_LINES_TOTAL, wrapper.getDistributionRemainingAmount(true).toString());
success = false;
}
if (wrapper.getDistribution() != null && !wrapper.getDistribution().isEmpty() && wrapper.getTravelDocument().getExpenseLimit() != null && wrapper.getTravelDocument().getExpenseLimit().isLessThan(wrapper.getDistributionRemainingAmount(true))) {
// we have an expense limit...do we have more than one selected distribution targets
int distributionTargetCount = 0;
for (AccountingDistribution distribution : wrapper.getDistribution()) {
if (distribution.getSelected()) {
distributionTargetCount += 1;
}
}
if (distributionTargetCount > 1) {
GlobalVariables.getMessageMap().putError(TemKeyConstants.TRVL_ACCOUNT_DIST, TemKeyConstants.ERROR_TEM_DISTRIBUTION_TOO_MANY_DISTRIBUTION_TARGETS_WITH_EXPENSE_LIMIT, Integer.toString(distributionTargetCount), wrapper.getTravelDocument().getExpenseLimit().toString());
success = false;
}
}
}
return success;
}
public DictionaryValidationService getDictionaryValidationService() {
return SpringContext.getBean(DictionaryValidationService.class);
}
public void setDictionaryValidationService(DictionaryValidationService dictionaryValidationService) {
this.dictionaryValidationService = dictionaryValidationService;
}
public void setBusinessObjectService(BusinessObjectService businessObjectService) {
this.businessObjectService = businessObjectService;
}
public void setAccountingDistributionService(AccountingDistributionService accountingDistributionService) {
this.accountingDistributionService = accountingDistributionService;
}
public AccountingDistributionService getAccountingDistributionService() {
return SpringContext.getBean(AccountingDistributionService.class);
}
public BusinessObjectService getBusinessObjectService() {
return SpringContext.getBean(BusinessObjectService.class);
}
}