/*
* 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.fp.document.service.impl;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import org.kuali.kfs.fp.businessobject.DisbursementPayee;
import org.kuali.kfs.fp.businessobject.PaymentReasonCode;
import org.kuali.kfs.fp.document.DisbursementVoucherConstants;
import org.kuali.kfs.fp.document.DisbursementVoucherDocument;
import org.kuali.kfs.fp.document.service.DisbursementVoucherPayeeService;
import org.kuali.kfs.fp.document.service.DisbursementVoucherPaymentReasonService;
import org.kuali.kfs.sys.KFSConstants;
import org.kuali.kfs.sys.KFSKeyConstants;
import org.kuali.kfs.sys.KFSPropertyConstants;
import org.kuali.kfs.sys.context.SpringContext;
import org.kuali.rice.core.api.parameter.ParameterEvaluatorService;
import org.kuali.rice.coreservice.framework.parameter.ParameterService;
import org.kuali.rice.kns.util.MessageList;
import org.kuali.rice.krad.service.BusinessObjectService;
/**
* implementing the service methods defined in DisbursementVoucherPaymentReasonService
*
* @see DisbursementVoucherPaymentReasonService
*/
public class DisbursementVoucherPaymentReasonServiceImpl implements DisbursementVoucherPaymentReasonService {
private static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(DisbursementVoucherPaymentReasonServiceImpl.class);
protected ParameterService parameterService;
protected BusinessObjectService businessObjectService;
protected DisbursementVoucherPayeeService disbursementVoucherPayeeService;
/**
* @see org.kuali.kfs.fp.document.service.DisbursementVoucherPaymentReasonService#isPayeeQualifiedForPayment(org.kuali.kfs.fp.businessobject.DisbursementPayee,
* java.lang.String)
*/
@Override
public boolean isPayeeQualifiedForPayment(DisbursementPayee payee, String paymentReasonCode) {
Collection<String> payeeTypeCodes = this.getPayeeTypesByPaymentReason(paymentReasonCode);
return this.isPayeeQualifiedForPayment(payee, paymentReasonCode, payeeTypeCodes);
}
/**
* @see org.kuali.kfs.fp.document.service.DisbursementVoucherPaymentReasonService#isPayeeQualifiedForPayment(org.kuali.kfs.fp.businessobject.DisbursementPayee,
* java.lang.String, java.util.List)
*/
@Override
public boolean isPayeeQualifiedForPayment(DisbursementPayee payee, String paymentReasonCode, Collection<String> payeeTypeCodes) {
if (payeeTypeCodes == null || payeeTypeCodes.isEmpty()) {
return false;
}
String payeeTypeCode = payee.getPayeeTypeCode();
if (!payeeTypeCodes.contains(payeeTypeCode)) {
return false;
}
if (disbursementVoucherPayeeService.isVendor(payee)) {
Collection<String> vendorOwnershipTypeCodes = this.getVendorOwnershipTypesByPaymentReason(paymentReasonCode);
if (vendorOwnershipTypeCodes != null && !vendorOwnershipTypeCodes.isEmpty()) {
String vendorOwnershipTypeCodeOfPayee = disbursementVoucherPayeeService.getVendorOwnershipTypeCode(payee);
return vendorOwnershipTypeCodes.contains(vendorOwnershipTypeCodeOfPayee);
}
}
if (this.isPrepaidTravelPaymentReason(paymentReasonCode)) {
boolean isActiveVendorEmployee = payee.isActive();
isActiveVendorEmployee &= disbursementVoucherPayeeService.isVendor(payee);
isActiveVendorEmployee &= disbursementVoucherPayeeService.isEmployee(payee);
// Active vendor employees cannot be paid for prepaid travel
return !isActiveVendorEmployee;
}
return true;
}
/**
* @see org.kuali.kfs.fp.document.service.DisbursementVoucherPaymentReasonService#isMovingPaymentReason(java.lang.String)
*/
@Override
public boolean isMovingPaymentReason(String paymentReasonCode) {
String typeParameterName = DisbursementVoucherConstants.MOVING_PAYMENT_REASONS_PARM_NM;
return this.isPaymentReasonOfType(typeParameterName, paymentReasonCode);
}
/**
* @see org.kuali.kfs.fp.document.service.DisbursementVoucherPaymentReasonService#isPrepaidTravelPaymentReason(java.lang.String)
*/
@Override
public boolean isPrepaidTravelPaymentReason(String paymentReasonCode) {
String typeParameterName = DisbursementVoucherConstants.PREPAID_TRAVEL_PAYMENT_REASONS_PARM_NM;
return this.isPaymentReasonOfType(typeParameterName, paymentReasonCode);
}
/**
* @see org.kuali.kfs.fp.document.service.DisbursementVoucherPaymentReasonService#isNonEmployeeTravelPaymentReason(java.lang.String)
*/
@Override
public boolean isNonEmployeeTravelPaymentReason(String paymentReasonCode) {
String typeParameterName = DisbursementVoucherConstants.NONEMPLOYEE_TRAVEL_PAY_REASONS_PARM_NM;
return this.isPaymentReasonOfType(typeParameterName, paymentReasonCode);
}
/**
* @see org.kuali.kfs.fp.document.service.DisbursementVoucherPaymentReasonService#isResearchPaymentReason(java.lang.String)
*/
@Override
public boolean isResearchPaymentReason(String paymentReasonCode) {
String typeParameterName = DisbursementVoucherConstants.RESEARCH_PAYMENT_REASONS_PARM_NM;
return this.isPaymentReasonOfType(typeParameterName, paymentReasonCode);
}
/**
* @see org.kuali.kfs.fp.document.service.DisbursementVoucherPaymentReasonService#isRevolvingFundPaymentReason(java.lang.String)
*/
@Override
public boolean isRevolvingFundPaymentReason(String paymentReasonCode) {
String typeParameterName = DisbursementVoucherConstants.REVOLVING_FUND_PAYMENT_REASONS_PARM_NM;
return this.isPaymentReasonOfType(typeParameterName, paymentReasonCode);
}
/**
* @see org.kuali.kfs.fp.document.service.DisbursementVoucherPaymentReasonService#isDecedentCompensationPaymentReason(java.lang.String)
*/
@Override
public boolean isDecedentCompensationPaymentReason(String paymentReasonCode) {
String typeParameterName = DisbursementVoucherConstants.DECEDENT_COMPENSATION_PAYMENT_REASONS_PARM_NM;
return this.isPaymentReasonOfType(typeParameterName, paymentReasonCode);
}
/**
* @see org.kuali.kfs.fp.document.service.DisbursementVoucherPaymentReasonService#isPaymentReasonOfType(java.lang.String,
* java.lang.String)
*/
@Override
public boolean isPaymentReasonOfType(String typeParameterName, String paymentReasonCode) {
return /*REFACTORME*/SpringContext.getBean(ParameterEvaluatorService.class).getParameterEvaluator(DisbursementVoucherDocument.class, typeParameterName, paymentReasonCode).evaluationSucceeds();
}
/**
* @see org.kuali.kfs.fp.document.service.DisbursementVoucherPaymentReasonService#getReserchNonVendorPayLimit()
*/
@Override
public String getReserchNonVendorPayLimit() {
return parameterService.getParameterValueAsString(DisbursementVoucherDocument.class, DisbursementVoucherConstants.RESEARCH_NON_VENDOR_PAY_LIMIT_AMOUNT_PARM_NM);
}
/**
* @see org.kuali.kfs.fp.document.service.DisbursementVoucherPaymentReasonService#getPayeeTypesByPaymentReason(java.lang.String)
*/
@Override
public Collection<String> getPayeeTypesByPaymentReason(String paymentReasonCode) {
return parameterService.getSubParameterValuesAsString(DisbursementVoucherDocument.class, DisbursementVoucherConstants.VALID_PAYEE_TYPES_BY_PAYMENT_REASON_PARM, paymentReasonCode);
}
/**
* @see org.kuali.kfs.fp.document.service.DisbursementVoucherPaymentReasonService#getVendorOwnershipTypesByPaymentReason(java.lang.String)
*/
@Override
public Collection<String> getVendorOwnershipTypesByPaymentReason(String paymentReasonCode) {
return parameterService.getSubParameterValuesAsString(DisbursementVoucherDocument.class, DisbursementVoucherConstants.VALID_VENDOR_OWNERSHIP_TYPES_BY_PAYMENT_REASON, paymentReasonCode);
}
/**
* @see org.kuali.kfs.fp.document.service.DisbursementVoucherPaymentReasonService#getPaymentReasonByPrimaryId(java.lang.String)
*/
@Override
public PaymentReasonCode getPaymentReasonByPrimaryId(String paymentReasonCode) {
Map<String, Object> primaryKeys = new HashMap<String, Object>();
primaryKeys.put(KFSPropertyConstants.CODE, paymentReasonCode);
return businessObjectService.findByPrimaryKey(PaymentReasonCode.class, primaryKeys);
}
/**
* @see org.kuali.kfs.fp.document.service.DisbursementVoucherPaymentReasonService#isTaxReviewRequired(java.lang.String)
*/
@Override
public boolean isTaxReviewRequired(String paymentReasonCode) {
String parameterName = DisbursementVoucherConstants.PAYMENT_REASONS_REQUIRING_TAX_REVIEW_PARM_NM;
List<String> values = new ArrayList<String>( parameterService.getParameterValuesAsString(DisbursementVoucherDocument.class, parameterName) );
return values != null && values.contains(paymentReasonCode);
}
/**
* @see org.kuali.kfs.fp.document.service.DisbursementVoucherPaymentReasonService#postPaymentReasonCodeUsage(java.lang.String,
* org.kuali.rice.kns.util.MessageList)
*/
@Override
public void postPaymentReasonCodeUsage(String paymentReasonCode, MessageList messageList) {
Collection<String> payeeTypeCodes = this.getPayeeTypesByPaymentReason(paymentReasonCode);
if (payeeTypeCodes == null || payeeTypeCodes.isEmpty()) {
return;
}
String descriptivePayeeTypes = this.getDescriptivePayeeTypesAsString(payeeTypeCodes);
String descriptivePaymentReason = this.getPaymentReasonByPrimaryId(paymentReasonCode).getCodeAndDescription();
if (payeeTypeCodes.size() > 1) {
String messageKey = KFSKeyConstants.WARNING_DV_PAYMENT_REASON_VALID_FOR_MULTIPLE_PAYEE_TYPES;
messageList.add(messageKey, descriptivePaymentReason, descriptivePayeeTypes);
}
else if (payeeTypeCodes.size() == 1) {
String messageKey = KFSKeyConstants.WARNING_DV_PAYMENT_REASON_VALID_FOR_SINGEL_PAYEE_TYPE;
messageList.add(messageKey, descriptivePaymentReason, descriptivePayeeTypes);
}
if (this.isResearchPaymentReason(paymentReasonCode)) {
String payLimit = this.getReserchNonVendorPayLimit();
String messageKey = KFSKeyConstants.WARNING_DV_REASERCH_PAYMENT_REASON;
List<String> vendorTypeCodes = new ArrayList<String>();
vendorTypeCodes.addAll(payeeTypeCodes);
vendorTypeCodes.remove(KFSConstants.PaymentPayeeTypes.EMPLOYEE);
String vendorTypes = this.getDescriptivePayeeTypesAsString(vendorTypeCodes);
messageList.add(messageKey, descriptivePaymentReason, descriptivePayeeTypes, vendorTypes, payLimit);
}
if (this.isMovingPaymentReason(paymentReasonCode)) {
List<String> individualOwnerShipTypeCodes = new ArrayList<String>( parameterService.getParameterValuesAsString(DisbursementVoucherDocument.class, DisbursementVoucherConstants.INDIVIDUAL_OWNERSHIP_TYPES_PARM_NM) );
String ownerShipTypeAsString = this.convertListToString(individualOwnerShipTypeCodes);
String messageKey = KFSKeyConstants.WARNING_DV_MOVING_PAYMENT_REASON;
messageList.add(messageKey, ownerShipTypeAsString);
}
if (this.isPrepaidTravelPaymentReason(paymentReasonCode)) {
String messageKey = KFSKeyConstants.WARNING_DV_PREPAID_TRAVEL_PAYMENT_REASON;
messageList.add(messageKey, descriptivePaymentReason, descriptivePayeeTypes);
}
}
// get and concatenate the descriptive payee types of the given codes
protected String getDescriptivePayeeTypesAsString(Collection<String> payeeTypeCodes) {
List<String> payeeTypeDescriptions = new ArrayList<String>();
for (String payeeTypeCode : payeeTypeCodes) {
String description = SpringContext.getBean(DisbursementVoucherPayeeService.class).getPayeeTypeDescription(payeeTypeCode);
payeeTypeDescriptions.add(description);
}
return this.convertListToString(payeeTypeDescriptions);
}
protected String convertListToString(List<String> list) {
if (list == null || list.isEmpty()) {
return StringUtils.EMPTY;
}
String oneSpace = " ";
StringBuilder listAsString = new StringBuilder();
for (int index = 0; index < list.size(); index++) {
String emlement = list.get(index);
if (index == 0) {
listAsString.append(emlement);
}
else if (index < list.size() - 1) {
listAsString.append(KFSConstants.COMMA).append(oneSpace).append(emlement);
}
else if (index == list.size() - 1) {
listAsString.append(oneSpace).append(KFSConstants.AND).append(oneSpace).append(emlement);
}
}
return listAsString.toString();
}
/**
* Sets the parameterService attribute value.
*
* @param parameterService The parameterService to set.
*/
public void setParameterService(ParameterService parameterService) {
this.parameterService = parameterService;
}
/**
* Sets the businessObjectService attribute value.
*
* @param businessObjectService The businessObjectService to set.
*/
public void setBusinessObjectService(BusinessObjectService businessObjectService) {
this.businessObjectService = businessObjectService;
}
/**
* Sets the disbursementVoucherPayeeService attribute value.
*
* @param disbursementVoucherPayeeService The disbursementVoucherPayeeService to set.
*/
public void setDisbursementVoucherPayeeService(DisbursementVoucherPayeeService disbursementVoucherPayeeService) {
this.disbursementVoucherPayeeService = disbursementVoucherPayeeService;
}
}