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.sys.KFSConstants;
023 import org.kuali.kfs.sys.KFSKeyConstants;
024 import org.kuali.kfs.sys.KFSPropertyConstants;
025 import org.kuali.kfs.sys.context.SpringContext;
026 import org.kuali.kfs.sys.document.AccountingDocument;
027 import org.kuali.kfs.sys.document.validation.GenericValidation;
028 import org.kuali.kfs.sys.document.validation.event.AttributedDocumentEvent;
029 import org.kuali.kfs.vnd.businessobject.VendorDetail;
030 import org.kuali.kfs.vnd.document.service.VendorService;
031 import org.kuali.rice.kim.bo.Person;
032 import org.kuali.rice.kim.bo.entity.dto.KimEntityInfo;
033 import org.kuali.rice.kim.bo.entity.dto.KimEntityNameInfo;
034 import org.kuali.rice.kim.service.IdentityManagementService;
035 import org.kuali.rice.kim.service.PersonService;
036 import org.kuali.rice.kim.util.KimConstants.PersonExternalIdentifierTypes;
037 import org.kuali.rice.kns.service.DataDictionaryService;
038 import org.kuali.rice.kns.service.ParameterEvaluator;
039 import org.kuali.rice.kns.service.ParameterService;
040 import org.kuali.rice.kns.util.GlobalVariables;
041 import org.kuali.rice.kns.util.MessageMap;
042
043 public class DisbursementVoucherVendorInformationValidation extends GenericValidation implements DisbursementVoucherConstants {
044 private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(DisbursementVoucherPaymentReasonValidation.class);
045
046 private ParameterService parameterService;
047 private AccountingDocument accountingDocumentForValidation;
048
049 public static final String DV_PAYEE_ID_NUMBER_PROPERTY_PATH = KFSPropertyConstants.DV_PAYEE_DETAIL + "." + KFSPropertyConstants.DISB_VCHR_PAYEE_ID_NUMBER;
050
051 /**
052 * @see org.kuali.kfs.sys.document.validation.Validation#validate(org.kuali.kfs.sys.document.validation.event.AttributedDocumentEvent)
053 */
054 public boolean validate(AttributedDocumentEvent event) {
055 LOG.debug("validate start");
056 boolean isValid = true;
057
058 DisbursementVoucherDocument document = (DisbursementVoucherDocument) accountingDocumentForValidation;
059 DisbursementVoucherPayeeDetail payeeDetail = document.getDvPayeeDetail();
060
061 if (!payeeDetail.isVendor()) {
062
063 String initiator = document.getDocumentHeader().getWorkflowDocument().getInitiatorPrincipalId();
064 final KimEntityInfo entityInfo= SpringContext.getBean(IdentityManagementService.class).getEntityInfoByPrincipalId(initiator);
065 String originatorId = entityInfo.getEmploymentInformation().get(0).getEmployeeId();
066 String employeeId = payeeDetail.getDisbVchrEmployeeIdNumber();
067 // verify that originator does not equal payee
068 if (originatorId.equals(employeeId)) {
069 isValid = false;
070 MessageMap errors = GlobalVariables.getMessageMap();
071 errors.addToErrorPath(KFSPropertyConstants.DOCUMENT);
072 String[] errorName = { "Payee ID " + employeeId ," Originator has the same ID ", "name" };
073 errors.putError(DV_PAYEE_ID_NUMBER_PROPERTY_PATH, KFSKeyConstants.ERROR_DV_VENDOR_NAME_PERSON_NAME_CONFUSION, errorName);
074 }
075 return isValid;
076 }
077
078 if (StringUtils.isBlank(payeeDetail.getDisbVchrPayeeIdNumber())) {
079 return false;
080 }
081
082 VendorDetail vendor = retrieveVendorDetail(payeeDetail.getDisbVchrVendorHeaderIdNumberAsInteger(), payeeDetail.getDisbVchrVendorDetailAssignedIdNumberAsInteger());
083
084 MessageMap errors = GlobalVariables.getMessageMap();
085 errors.addToErrorPath(KFSPropertyConstants.DOCUMENT);
086
087 /* Retrieve Vendor */
088 if (vendor == null) {
089 errors.putError(DV_PAYEE_ID_NUMBER_PROPERTY_PATH, KFSKeyConstants.ERROR_EXISTENCE, SpringContext.getBean(DataDictionaryService.class).getAttributeLabel(DisbursementVoucherPayeeDetail.class, KFSPropertyConstants.DISB_VCHR_PAYEE_ID_NUMBER));
090 errors.removeFromErrorPath(KFSPropertyConstants.DOCUMENT);
091 return false;
092 }
093
094 /* DV Vendor Detail must be active */
095 if (!vendor.isActiveIndicator()) {
096 errors.putError(DV_PAYEE_ID_NUMBER_PROPERTY_PATH, KFSKeyConstants.ERROR_INACTIVE, SpringContext.getBean(DataDictionaryService.class).getAttributeLabel(DisbursementVoucherPayeeDetail.class, KFSPropertyConstants.DISB_VCHR_PAYEE_ID_NUMBER));
097 errors.removeFromErrorPath(KFSPropertyConstants.DOCUMENT);
098 return false;
099 }
100
101 /* for vendors with tax type ssn, check employee restrictions */
102 if (TAX_TYPE_SSN.equals(vendor.getVendorHeader().getVendorTaxTypeCode())) {
103 if (isActiveEmployeeSSN(vendor.getVendorHeader().getVendorTaxNumber())) {
104 // determine if the rule is flagged off in the param setting
105 boolean performPrepaidEmployeeInd = parameterService.getIndicatorParameter(DisbursementVoucherDocument.class, PERFORM_PREPAID_EMPL_PARM_NM);
106
107 if (performPrepaidEmployeeInd) {
108 /* active vendor employees cannot be paid for prepaid travel */
109 ParameterEvaluator travelPrepaidPaymentReasonCodeEvaluator = parameterService.getParameterEvaluator(DisbursementVoucherDocument.class, PREPAID_TRAVEL_PAYMENT_REASONS_PARM_NM, payeeDetail.getDisbVchrPaymentReasonCode());
110 if (travelPrepaidPaymentReasonCodeEvaluator.evaluationSucceeds()) {
111 errors.putError(DV_PAYEE_ID_NUMBER_PROPERTY_PATH, KFSKeyConstants.ERROR_DV_ACTIVE_EMPLOYEE_PREPAID_TRAVEL);
112 isValid = false;
113 }
114
115 }
116 }
117
118 else if (isEmployeeSSN(vendor.getVendorHeader().getVendorTaxNumber())) {
119 // check param setting for paid outside payroll check
120 boolean performPaidOutsidePayrollInd = parameterService.getIndicatorParameter(DisbursementVoucherDocument.class, DisbursementVoucherConstants.CHECK_EMPLOYEE_PAID_OUTSIDE_PAYROLL_PARM_NM);
121
122 if (performPaidOutsidePayrollInd) {
123 /* If vendor is type employee, vendor record must be flagged as paid outside of payroll */
124 if (!SpringContext.getBean(VendorService.class).isVendorInstitutionEmployee(vendor.getVendorHeaderGeneratedIdentifier())) {
125 errors.putError(DV_PAYEE_ID_NUMBER_PROPERTY_PATH, KFSKeyConstants.ERROR_DV_EMPLOYEE_PAID_OUTSIDE_PAYROLL);
126 isValid = false;
127 }
128 }
129 }
130 }
131
132 errors.removeFromErrorPath(KFSPropertyConstants.DOCUMENT);
133
134 return isValid;
135 }
136
137 /**
138 * Retrieves the VendorDetail object from the vendor id number.
139 *
140 * @param vendorIdNumber vendor ID number
141 * @param vendorDetailIdNumber vendor detail ID number
142 * @return <code>VendorDetail</code>
143 */
144 protected VendorDetail retrieveVendorDetail(Integer vendorIdNumber, Integer vendorDetailIdNumber) {
145 return SpringContext.getBean(VendorService.class).getVendorDetail(vendorIdNumber, vendorDetailIdNumber);
146 }
147
148 /**
149 * Retrieves Person from SSN
150 *
151 * @param ssnNumber social security number
152 * @return <code>Person</code>
153 */
154 protected Person retrieveEmployeeBySSN(String ssnNumber) {
155 Person person = (Person) SpringContext.getBean(PersonService.class).getPersonByExternalIdentifier(PersonExternalIdentifierTypes.TAX, ssnNumber).get(0);
156 if (person == null) {
157 LOG.error("User Not Found");
158 }
159 return person;
160 }
161
162 /**
163 * Confirms that the SSN provided is associated with an employee.
164 *
165 * @param ssnNumber social security number
166 * @return true if the ssn number is a valid employee ssn
167 */
168 protected boolean isEmployeeSSN(String ssnNumber) {
169 return retrieveEmployeeBySSN(ssnNumber) != null;
170 }
171
172 /**
173 * Performs a lookup on universal users for the given ssn number.
174 *
175 * @param ssnNumber social security number
176 * @return true if the ssn number is a valid employee ssn and the employee is active
177 */
178 protected boolean isActiveEmployeeSSN(String ssnNumber) {
179 Person employee = retrieveEmployeeBySSN(ssnNumber);
180 return employee != null && KFSConstants.EMPLOYEE_ACTIVE_STATUS.equals(employee.getEmployeeStatusCode());
181 }
182
183 /**
184 * Sets the accountingDocumentForValidation attribute value.
185 *
186 * @param accountingDocumentForValidation The accountingDocumentForValidation to set.
187 */
188 public void setAccountingDocumentForValidation(AccountingDocument accountingDocumentForValidation) {
189 this.accountingDocumentForValidation = accountingDocumentForValidation;
190 }
191
192 /**
193 * Sets the parameterService attribute value.
194 * @param parameterService The parameterService to set.
195 */
196 public void setParameterService(ParameterService parameterService) {
197 this.parameterService = parameterService;
198 }
199
200 /**
201 * Gets the accountingDocumentForValidation attribute.
202 * @return Returns the accountingDocumentForValidation.
203 */
204 public AccountingDocument getAccountingDocumentForValidation() {
205 return accountingDocumentForValidation;
206 }
207 }
208