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.validation.impl;
017
018 import org.apache.commons.lang.StringUtils;
019 import org.kuali.kfs.fp.businessobject.DisbursementVoucherPayeeDetail;
020 import org.kuali.kfs.fp.document.DisbursementVoucherConstants;
021 import org.kuali.kfs.fp.document.DisbursementVoucherDocument;
022 import org.kuali.kfs.fp.document.service.DisbursementVoucherPayeeService;
023 import org.kuali.kfs.fp.document.service.DisbursementVoucherPaymentReasonService;
024 import org.kuali.kfs.sys.KFSKeyConstants;
025 import org.kuali.kfs.sys.KFSPropertyConstants;
026 import org.kuali.kfs.sys.context.SpringContext;
027 import org.kuali.kfs.sys.document.AccountingDocument;
028 import org.kuali.kfs.sys.document.validation.GenericValidation;
029 import org.kuali.kfs.sys.document.validation.event.AttributedDocumentEvent;
030 import org.kuali.kfs.vnd.businessobject.VendorDetail;
031 import org.kuali.kfs.vnd.document.service.VendorService;
032 import org.kuali.rice.kns.service.ParameterEvaluator;
033 import org.kuali.rice.kns.service.ParameterService;
034 import org.kuali.rice.kns.util.GlobalVariables;
035 import org.kuali.rice.kns.util.KualiDecimal;
036 import org.kuali.rice.kns.util.MessageMap;
037
038 public class DisbursementVoucherPaymentReasonValidation extends GenericValidation implements DisbursementVoucherConstants {
039 private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(DisbursementVoucherPaymentReasonValidation.class);
040
041 private ParameterService parameterService;
042 private AccountingDocument accountingDocumentForValidation;
043 private DisbursementVoucherPaymentReasonService disbursementVoucherPaymentReasonService;
044 private DisbursementVoucherPayeeService disbursementVoucherPayeeService;
045
046 public static final String DV_PAYMENT_REASON_PROPERTY_PATH = KFSPropertyConstants.DV_PAYEE_DETAIL + "." + KFSPropertyConstants.DISB_VCHR_PAYMENT_REASON_CODE;
047 public static final String DV_PAYEE_ID_NUMBER_PROPERTY_PATH = KFSPropertyConstants.DV_PAYEE_DETAIL + "." + KFSPropertyConstants.DISB_VCHR_PAYEE_ID_NUMBER;
048
049 /**
050 * @see org.kuali.kfs.sys.document.validation.Validation#validate(org.kuali.kfs.sys.document.validation.event.AttributedDocumentEvent)
051 */
052 public boolean validate(AttributedDocumentEvent event) {
053 LOG.debug("validate start");
054
055 boolean isValid = true;
056
057 DisbursementVoucherDocument document = (DisbursementVoucherDocument) accountingDocumentForValidation;
058 DisbursementVoucherPayeeDetail dvPayeeDetail = document.getDvPayeeDetail();
059 String paymentReasonCode = dvPayeeDetail.getDisbVchrPaymentReasonCode();
060
061 boolean isVendor = dvPayeeDetail.isVendor();
062 boolean isEmployee = dvPayeeDetail.isEmployee();
063
064 MessageMap errors = GlobalVariables.getMessageMap();
065 int initialErrorCount = errors.getErrorCount();
066 errors.addToErrorPath(KFSPropertyConstants.DOCUMENT);
067
068 /* check payment reason is allowed for payee type */
069 ParameterEvaluator paymentReasonsByTypeEvaluator = parameterService.getParameterEvaluator(DisbursementVoucherDocument.class, DisbursementVoucherConstants.VALID_PAYEE_TYPES_BY_PAYMENT_REASON_PARM, DisbursementVoucherConstants.INVALID_PAYEE_TYPES_BY_PAYMENT_REASON_PARM, paymentReasonCode, dvPayeeDetail.getDisbursementVoucherPayeeTypeCode());
070 paymentReasonsByTypeEvaluator.evaluateAndAddError(document.getClass(), DV_PAYMENT_REASON_PROPERTY_PATH);
071
072 // restrictions on payment reason when alien indicator is checked
073 if (dvPayeeDetail.isDisbVchrAlienPaymentCode()) {
074 ParameterEvaluator alienPaymentReasonsEvaluator = parameterService.getParameterEvaluator(DisbursementVoucherDocument.class, ALIEN_PAYMENT_REASONS_PARM_NM, paymentReasonCode);
075 alienPaymentReasonsEvaluator.evaluateAndAddError(document.getClass(), DV_PAYMENT_REASON_PROPERTY_PATH);
076 }
077
078 /* for vendors with a payee type of revolving fund, the payment reason must be a revolving fund payment reason */
079 final boolean isRevolvingFundPaymentReason = disbursementVoucherPaymentReasonService.isRevolvingFundPaymentReason(paymentReasonCode);
080 if (isVendor) {
081 final boolean isRevolvingFundCodeVendor = SpringContext.getBean(VendorService.class).isRevolvingFundCodeVendor(dvPayeeDetail.getDisbVchrVendorHeaderIdNumberAsInteger());
082 if (isRevolvingFundCodeVendor) {
083 ParameterEvaluator revolvingFundPaymentReasonCodeEvaluator = parameterService.getParameterEvaluator(DisbursementVoucherDocument.class, REVOLVING_FUND_PAYMENT_REASONS_PARM_NM, paymentReasonCode);
084 revolvingFundPaymentReasonCodeEvaluator.evaluateAndAddError(document.getClass(), DV_PAYMENT_REASON_PROPERTY_PATH);
085 } else if (isRevolvingFundPaymentReason) {
086 errors.putError(DV_PAYEE_ID_NUMBER_PROPERTY_PATH, KFSKeyConstants.ERROR_DV_REVOLVING_PAYMENT_REASON, paymentReasonCode);
087 isValid = false;
088 }
089 }
090 if (!isVendor && isRevolvingFundPaymentReason) {
091 errors.putError(DV_PAYEE_ID_NUMBER_PROPERTY_PATH, KFSKeyConstants.ERROR_DV_REVOLVING_PAYMENT_REASON, paymentReasonCode);
092 isValid = false;
093 }
094
095 // if payment reason is moving, payee must be an employee or have vendor ownership type I (individual)
096 boolean isMovingPaymentReason = disbursementVoucherPaymentReasonService.isMovingPaymentReason(paymentReasonCode);
097 if (isMovingPaymentReason) {
098 // only need to review this rule if the payee is a vendor; NOTE that a vendor can be an employee also
099 if (isVendor && !isEmployee) {
100 boolean isPayeeIndividualVendor = disbursementVoucherPayeeService.isPayeeIndividualVendor(dvPayeeDetail);
101
102 // only vendors who are individuals can be paid moving expenses
103 if (!isPayeeIndividualVendor) {
104 errors.putError(DV_PAYEE_ID_NUMBER_PROPERTY_PATH, KFSKeyConstants.ERROR_DV_MOVING_PAYMENT_PAYEE);
105 isValid = false;
106 }
107 }
108 }
109
110 // for research payments over a certain limit the payee must be a vendor
111 boolean isResearchPaymentReason = disbursementVoucherPaymentReasonService.isResearchPaymentReason(paymentReasonCode);
112 if (isResearchPaymentReason) {
113 String researchPayLimit = disbursementVoucherPaymentReasonService.getReserchNonVendorPayLimit();
114
115 if (StringUtils.isNotBlank(researchPayLimit)) {
116 KualiDecimal payLimit = new KualiDecimal(researchPayLimit);
117
118 if (!isVendor && document.getDisbVchrCheckTotalAmount().isGreaterEqual(payLimit)) {
119 errors.putError(DV_PAYEE_ID_NUMBER_PROPERTY_PATH, KFSKeyConstants.ERROR_DV_RESEARCH_PAYMENT_PAYEE, researchPayLimit);
120 isValid = false;
121 }
122 }
123 }
124
125 errors.removeFromErrorPath(KFSPropertyConstants.DOCUMENT);
126
127 isValid = initialErrorCount == errors.getErrorCount();
128 return isValid;
129 }
130
131 /**
132 * Retrieves the VendorDetail object from the vendor id number.
133 *
134 * @param vendorIdNumber vendor ID number
135 * @param vendorDetailIdNumber vendor detail ID number
136 * @return <code>VendorDetail</code>
137 */
138 protected VendorDetail retrieveVendorDetail(Integer vendorIdNumber, Integer vendorDetailIdNumber) {
139 return SpringContext.getBean(VendorService.class).getVendorDetail(vendorIdNumber, vendorDetailIdNumber);
140 }
141
142 /**
143 * Gets the parameterService attribute.
144 * @return Returns the parameterService.
145 */
146 public ParameterService getParameterService() {
147 return parameterService;
148 }
149
150 /**
151 * Gets the disbursementVoucherPaymentReasonService attribute.
152 * @return Returns the disbursementVoucherPaymentReasonService.
153 */
154 public DisbursementVoucherPaymentReasonService getDisbursementVoucherPaymentReasonService() {
155 return disbursementVoucherPaymentReasonService;
156 }
157
158 /**
159 * Gets the disbursementVoucherPayeeService attribute.
160 * @return Returns the disbursementVoucherPayeeService.
161 */
162 public DisbursementVoucherPayeeService getDisbursementVoucherPayeeService() {
163 return disbursementVoucherPayeeService;
164 }
165
166 /**
167 * Sets the accountingDocumentForValidation attribute value.
168 *
169 * @param accountingDocumentForValidation The accountingDocumentForValidation to set.
170 */
171 public void setAccountingDocumentForValidation(AccountingDocument accountingDocumentForValidation) {
172 this.accountingDocumentForValidation = accountingDocumentForValidation;
173 }
174
175 /**
176 * Sets the parameterService attribute value.
177 *
178 * @param parameterService The parameterService to set.
179 */
180 public void setParameterService(ParameterService parameterService) {
181 this.parameterService = parameterService;
182 }
183
184 /**
185 * Gets the accountingDocumentForValidation attribute.
186 *
187 * @return Returns the accountingDocumentForValidation.
188 */
189 public AccountingDocument getAccountingDocumentForValidation() {
190 return accountingDocumentForValidation;
191 }
192
193 /**
194 * Sets the disbursementVoucherPaymentReasonService attribute value.
195 *
196 * @param disbursementVoucherPaymentReasonService The disbursementVoucherPaymentReasonService to set.
197 */
198 public void setDisbursementVoucherPaymentReasonService(DisbursementVoucherPaymentReasonService disbursementVoucherPaymentReasonService) {
199 this.disbursementVoucherPaymentReasonService = disbursementVoucherPaymentReasonService;
200 }
201
202 /**
203 * Sets the disbursementVoucherPayeeService attribute value.
204 *
205 * @param disbursementVoucherPayeeService The disbursementVoucherPayeeService to set.
206 */
207 public void setDisbursementVoucherPayeeService(DisbursementVoucherPayeeService disbursementVoucherPayeeService) {
208 this.disbursementVoucherPayeeService = disbursementVoucherPayeeService;
209 }
210 }