001 /* 002 * Copyright 2011 The Kuali Foundation. 003 * 004 * Licensed under the Educational Community License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.opensource.org/licenses/ecl2.php 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 package org.kuali.kfs.fp.document.service.impl; 017 018 import java.util.ArrayList; 019 import java.util.HashMap; 020 import java.util.List; 021 import java.util.Map; 022 023 import org.apache.commons.lang.StringUtils; 024 import org.kuali.kfs.fp.businessobject.DisbursementPayee; 025 import org.kuali.kfs.fp.businessobject.PaymentReasonCode; 026 import org.kuali.kfs.fp.document.DisbursementVoucherConstants; 027 import org.kuali.kfs.fp.document.DisbursementVoucherDocument; 028 import org.kuali.kfs.fp.document.service.DisbursementVoucherPayeeService; 029 import org.kuali.kfs.fp.document.service.DisbursementVoucherPaymentReasonService; 030 import org.kuali.kfs.sys.KFSConstants; 031 import org.kuali.kfs.sys.KFSKeyConstants; 032 import org.kuali.kfs.sys.KFSPropertyConstants; 033 import org.kuali.kfs.sys.context.SpringContext; 034 import org.kuali.kfs.vnd.businessobject.VendorDetail; 035 import org.kuali.kfs.vnd.document.service.VendorService; 036 import org.kuali.rice.kns.service.BusinessObjectService; 037 import org.kuali.rice.kns.service.ParameterService; 038 import org.kuali.rice.kns.util.ErrorMap; 039 import org.kuali.rice.kns.util.MessageList; 040 041 /** 042 * implementing the service methods defined in DisbursementVoucherPaymentReasonService 043 * 044 * @see DisbursementVoucherPaymentReasonService 045 */ 046 public class DisbursementVoucherPaymentReasonServiceImpl implements DisbursementVoucherPaymentReasonService { 047 private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(DisbursementVoucherPaymentReasonServiceImpl.class); 048 049 public ParameterService parameterService; 050 private BusinessObjectService businessObjectService; 051 private DisbursementVoucherPayeeService disbursementVoucherPayeeService; 052 053 /** 054 * @see org.kuali.kfs.fp.document.service.DisbursementVoucherPaymentReasonService#isPayeeQualifiedForPayment(org.kuali.kfs.fp.businessobject.DisbursementPayee, 055 * java.lang.String) 056 */ 057 public boolean isPayeeQualifiedForPayment(DisbursementPayee payee, String paymentReasonCode) { 058 List<String> payeeTypeCodes = this.getPayeeTypesByPaymentReason(paymentReasonCode); 059 return this.isPayeeQualifiedForPayment(payee, paymentReasonCode, payeeTypeCodes); 060 } 061 062 /** 063 * @see org.kuali.kfs.fp.document.service.DisbursementVoucherPaymentReasonService#isPayeeQualifiedForPayment(org.kuali.kfs.fp.businessobject.DisbursementPayee, 064 * java.lang.String, java.util.List) 065 */ 066 public boolean isPayeeQualifiedForPayment(DisbursementPayee payee, String paymentReasonCode, List<String> payeeTypeCodes) { 067 if (payeeTypeCodes == null || payeeTypeCodes.isEmpty()) { 068 return false; 069 } 070 071 String payeeTypeCode = payee.getPayeeTypeCode(); 072 if (!payeeTypeCodes.contains(payeeTypeCode)) { 073 return false; 074 } 075 076 if (disbursementVoucherPayeeService.isVendor(payee)) { 077 List<String> vendorOwnershipTypeCodes = this.getVendorOwnershipTypesByPaymentReason(paymentReasonCode); 078 079 if (vendorOwnershipTypeCodes != null && !vendorOwnershipTypeCodes.isEmpty()) { 080 String vendorOwnershipTypeCodeOfPayee = disbursementVoucherPayeeService.getVendorOwnershipTypeCode(payee); 081 return vendorOwnershipTypeCodes.contains(vendorOwnershipTypeCodeOfPayee); 082 } 083 } 084 085 if (this.isPrepaidTravelPaymentReason(paymentReasonCode)) { 086 boolean isActiveVendorEmployee = payee.isActive(); 087 isActiveVendorEmployee &= disbursementVoucherPayeeService.isVendor(payee); 088 isActiveVendorEmployee &= disbursementVoucherPayeeService.isEmployee(payee); 089 090 // Active vendor employees cannot be paid for prepaid travel 091 return !isActiveVendorEmployee; 092 } 093 094 return true; 095 } 096 097 /** 098 * @see org.kuali.kfs.fp.document.service.DisbursementVoucherPaymentReasonService#isMovingPaymentReason(java.lang.String) 099 */ 100 public boolean isMovingPaymentReason(String paymentReasonCode) { 101 String typeParameterName = DisbursementVoucherConstants.MOVING_PAYMENT_REASONS_PARM_NM; 102 return this.isPaymentReasonOfType(typeParameterName, paymentReasonCode); 103 } 104 105 /** 106 * @see org.kuali.kfs.fp.document.service.DisbursementVoucherPaymentReasonService#isPrepaidTravelPaymentReason(java.lang.String) 107 */ 108 public boolean isPrepaidTravelPaymentReason(String paymentReasonCode) { 109 String typeParameterName = DisbursementVoucherConstants.PREPAID_TRAVEL_PAYMENT_REASONS_PARM_NM; 110 return this.isPaymentReasonOfType(typeParameterName, paymentReasonCode); 111 } 112 113 /** 114 * @see org.kuali.kfs.fp.document.service.DisbursementVoucherPaymentReasonService#isNonEmployeeTravelPaymentReason(java.lang.String) 115 */ 116 public boolean isNonEmployeeTravelPaymentReason(String paymentReasonCode) { 117 String typeParameterName = DisbursementVoucherConstants.NONEMPLOYEE_TRAVEL_PAY_REASONS_PARM_NM; 118 return this.isPaymentReasonOfType(typeParameterName, paymentReasonCode); 119 } 120 121 /** 122 * @see org.kuali.kfs.fp.document.service.DisbursementVoucherPaymentReasonService#isResearchPaymentReason(java.lang.String) 123 */ 124 public boolean isResearchPaymentReason(String paymentReasonCode) { 125 String typeParameterName = DisbursementVoucherConstants.RESEARCH_PAYMENT_REASONS_PARM_NM; 126 return this.isPaymentReasonOfType(typeParameterName, paymentReasonCode); 127 } 128 129 /** 130 * @see org.kuali.kfs.fp.document.service.DisbursementVoucherPaymentReasonService#isRevolvingFundPaymentReason(java.lang.String) 131 */ 132 public boolean isRevolvingFundPaymentReason(String paymentReasonCode) { 133 String typeParameterName = DisbursementVoucherConstants.REVOLVING_FUND_PAYMENT_REASONS_PARM_NM; 134 return this.isPaymentReasonOfType(typeParameterName, paymentReasonCode); 135 } 136 137 /** 138 * @see org.kuali.kfs.fp.document.service.DisbursementVoucherPaymentReasonService#isDecedentCompensationPaymentReason(java.lang.String) 139 */ 140 public boolean isDecedentCompensationPaymentReason(String paymentReasonCode) { 141 String typeParameterName = DisbursementVoucherConstants.DECEDENT_COMPENSATION_PAYMENT_REASONS_PARM_NM; 142 return this.isPaymentReasonOfType(typeParameterName, paymentReasonCode); 143 } 144 145 /** 146 * @see org.kuali.kfs.fp.document.service.DisbursementVoucherPaymentReasonService#isPaymentReasonOfType(java.lang.String, 147 * java.lang.String) 148 */ 149 public boolean isPaymentReasonOfType(String typeParameterName, String paymentReasonCode) { 150 return parameterService.getParameterEvaluator(DisbursementVoucherDocument.class, typeParameterName, paymentReasonCode).evaluationSucceeds(); 151 } 152 153 /** 154 * @see org.kuali.kfs.fp.document.service.DisbursementVoucherPaymentReasonService#getReserchNonVendorPayLimit() 155 */ 156 public String getReserchNonVendorPayLimit() { 157 return parameterService.getParameterValue(DisbursementVoucherDocument.class, DisbursementVoucherConstants.RESEARCH_NON_VENDOR_PAY_LIMIT_AMOUNT_PARM_NM); 158 } 159 160 /** 161 * @see org.kuali.kfs.fp.document.service.DisbursementVoucherPaymentReasonService#getPayeeTypesByPaymentReason(java.lang.String) 162 */ 163 public List<String> getPayeeTypesByPaymentReason(String paymentReasonCode) { 164 return parameterService.getParameterValues(DisbursementVoucherDocument.class, DisbursementVoucherConstants.VALID_PAYEE_TYPES_BY_PAYMENT_REASON_PARM, paymentReasonCode); 165 } 166 167 /** 168 * @see org.kuali.kfs.fp.document.service.DisbursementVoucherPaymentReasonService#getVendorOwnershipTypesByPaymentReason(java.lang.String) 169 */ 170 public List<String> getVendorOwnershipTypesByPaymentReason(String paymentReasonCode) { 171 return parameterService.getParameterValues(DisbursementVoucherDocument.class, DisbursementVoucherConstants.VALID_VENDOR_OWNERSHIP_TYPES_BY_PAYMENT_REASON, paymentReasonCode); 172 } 173 174 /** 175 * @see org.kuali.kfs.fp.document.service.DisbursementVoucherPaymentReasonService#getPaymentReasonByPrimaryId(java.lang.String) 176 */ 177 public PaymentReasonCode getPaymentReasonByPrimaryId(String paymentReasonCode) { 178 Map<String, Object> primaryKeys = new HashMap<String, Object>(); 179 primaryKeys.put(KFSPropertyConstants.CODE, paymentReasonCode); 180 181 return (PaymentReasonCode) businessObjectService.findByPrimaryKey(PaymentReasonCode.class, primaryKeys); 182 } 183 184 /** 185 * @see org.kuali.kfs.fp.document.service.DisbursementVoucherPaymentReasonService#isTaxReviewRequired(java.lang.String) 186 */ 187 public boolean isTaxReviewRequired(String paymentReasonCode) { 188 String parameterName = DisbursementVoucherConstants.PAYMENT_REASONS_REQUIRING_TAX_REVIEW_PARM_NM; 189 List<String> values = parameterService.getParameterValues(DisbursementVoucherDocument.class, parameterName); 190 191 return values != null && values.contains(paymentReasonCode); 192 } 193 194 /** 195 * @see org.kuali.kfs.fp.document.service.DisbursementVoucherPaymentReasonService#postPaymentReasonCodeUsage(java.lang.String, 196 * org.kuali.rice.kns.util.MessageList) 197 */ 198 public void postPaymentReasonCodeUsage(String paymentReasonCode, MessageList messageList) { 199 List<String> payeeTypeCodes = this.getPayeeTypesByPaymentReason(paymentReasonCode); 200 if (payeeTypeCodes == null || payeeTypeCodes.isEmpty()) { 201 return; 202 } 203 204 String descriptivePayeeTypes = this.getDescriptivePayeeTypesAsString(payeeTypeCodes); 205 String descriptivePaymentReason = this.getPaymentReasonByPrimaryId(paymentReasonCode).getCodeAndDescription(); 206 if (payeeTypeCodes.size() > 1) { 207 String messageKey = KFSKeyConstants.WARNING_DV_PAYMENT_REASON_VALID_FOR_MULTIPLE_PAYEE_TYPES; 208 messageList.add(messageKey, descriptivePaymentReason, descriptivePayeeTypes); 209 } 210 else if (payeeTypeCodes.size() == 1) { 211 String messageKey = KFSKeyConstants.WARNING_DV_PAYMENT_REASON_VALID_FOR_SINGEL_PAYEE_TYPE; 212 messageList.add(messageKey, descriptivePaymentReason, descriptivePayeeTypes); 213 } 214 215 if (this.isResearchPaymentReason(paymentReasonCode)) { 216 String payLimit = this.getReserchNonVendorPayLimit(); 217 String messageKey = KFSKeyConstants.WARNING_DV_REASERCH_PAYMENT_REASON; 218 219 List<String> vendorTypeCodes = new ArrayList<String>(); 220 vendorTypeCodes.addAll(payeeTypeCodes); 221 vendorTypeCodes.remove(DisbursementVoucherConstants.DV_PAYEE_TYPE_EMPLOYEE); 222 String vendorTypes = this.getDescriptivePayeeTypesAsString(vendorTypeCodes); 223 224 messageList.add(messageKey, descriptivePaymentReason, descriptivePayeeTypes, vendorTypes, payLimit); 225 } 226 227 if (this.isMovingPaymentReason(paymentReasonCode)) { 228 List<String> individualOwnerShipTypeCodes = parameterService.getParameterValues(DisbursementVoucherDocument.class, DisbursementVoucherConstants.INDIVIDUAL_OWNERSHIP_TYPES_PARM_NM); 229 String ownerShipTypeAsString = this.convertListToString(individualOwnerShipTypeCodes); 230 231 String messageKey = KFSKeyConstants.WARNING_DV_MOVING_PAYMENT_REASON; 232 messageList.add(messageKey, ownerShipTypeAsString); 233 } 234 235 if (this.isPrepaidTravelPaymentReason(paymentReasonCode)) { 236 String messageKey = KFSKeyConstants.WARNING_DV_PREPAID_TRAVEL_PAYMENT_REASON; 237 messageList.add(messageKey, descriptivePaymentReason, descriptivePayeeTypes); 238 } 239 } 240 241 // get and concatenate the descriptive payee types of the given codes 242 protected String getDescriptivePayeeTypesAsString(List<String> payeeTypeCodes) { 243 List<String> payeeTypeDescriptions = new ArrayList<String>(); 244 245 for (String payeeTypeCode : payeeTypeCodes) { 246 String description = SpringContext.getBean(DisbursementVoucherPayeeService.class).getPayeeTypeDescription(payeeTypeCode); 247 payeeTypeDescriptions.add(description); 248 } 249 250 return this.convertListToString(payeeTypeDescriptions); 251 } 252 253 protected String convertListToString(List<String> list) { 254 if (list == null || list.isEmpty()) { 255 return StringUtils.EMPTY; 256 } 257 258 String oneSpace = " "; 259 StringBuilder listAsString = new StringBuilder(); 260 for (int index = 0; index < list.size(); index++) { 261 String emlement = list.get(index); 262 263 if (index == 0) { 264 listAsString.append(emlement); 265 } 266 else if (index < list.size() - 1) { 267 listAsString.append(KFSConstants.COMMA).append(oneSpace).append(emlement); 268 } 269 else if (index == list.size() - 1) { 270 listAsString.append(oneSpace).append(KFSConstants.AND).append(oneSpace).append(emlement); 271 } 272 } 273 274 return listAsString.toString(); 275 } 276 277 /** 278 * Sets the parameterService attribute value. 279 * 280 * @param parameterService The parameterService to set. 281 */ 282 public void setParameterService(ParameterService parameterService) { 283 this.parameterService = parameterService; 284 } 285 286 /** 287 * Sets the businessObjectService attribute value. 288 * 289 * @param businessObjectService The businessObjectService to set. 290 */ 291 public void setBusinessObjectService(BusinessObjectService businessObjectService) { 292 this.businessObjectService = businessObjectService; 293 } 294 295 /** 296 * Sets the disbursementVoucherPayeeService attribute value. 297 * 298 * @param disbursementVoucherPayeeService The disbursementVoucherPayeeService to set. 299 */ 300 public void setDisbursementVoucherPayeeService(DisbursementVoucherPayeeService disbursementVoucherPayeeService) { 301 this.disbursementVoucherPayeeService = disbursementVoucherPayeeService; 302 } 303 }