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.KFSKeyConstants;
023    import org.kuali.kfs.sys.KFSPropertyConstants;
024    import org.kuali.kfs.sys.context.SpringContext;
025    import org.kuali.kfs.sys.document.AccountingDocument;
026    import org.kuali.kfs.sys.document.validation.GenericValidation;
027    import org.kuali.kfs.sys.document.validation.event.AttributedDocumentEvent;
028    import org.kuali.kfs.vnd.businessobject.VendorDetail;
029    import org.kuali.kfs.vnd.document.service.VendorService;
030    import org.kuali.rice.kim.bo.Person;
031    import org.kuali.rice.kim.service.PersonService;
032    import org.kuali.rice.kim.util.KimConstants;
033    import org.kuali.rice.kns.util.GlobalVariables;
034    import org.kuali.rice.kns.util.MessageMap;
035    
036    public class DisbursementVoucherPayeeInitiatorValidation extends GenericValidation implements DisbursementVoucherConstants{
037        private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(DisbursementVoucherPayeeInitiatorValidation.class);
038        
039        private AccountingDocument accountingDocumentForValidation;
040        
041        public static final String DV_PAYEE_ID_NUMBER_PROPERTY_PATH = KFSPropertyConstants.DV_PAYEE_DETAIL + "." + KFSPropertyConstants.DISB_VCHR_PAYEE_ID_NUMBER;
042    
043        /**
044         * @see org.kuali.kfs.sys.document.validation.Validation#validate(org.kuali.kfs.sys.document.validation.event.AttributedDocumentEvent)
045         */
046        public boolean validate(AttributedDocumentEvent event) {
047            LOG.debug("validate start");        
048            boolean isValid = true;
049            
050            DisbursementVoucherDocument document = (DisbursementVoucherDocument) accountingDocumentForValidation;
051            DisbursementVoucherPayeeDetail payeeDetail = document.getDvPayeeDetail();
052            
053            MessageMap errors = GlobalVariables.getMessageMap();
054            errors.addToErrorPath(KFSPropertyConstants.DOCUMENT);
055    
056            String uuid = null;
057            // If payee is a vendor, then look up SSN and look for SSN in the employee table
058            if (payeeDetail.isVendor() && StringUtils.isNotBlank(payeeDetail.getDisbVchrVendorHeaderIdNumber())) {
059                VendorDetail dvVendor = retrieveVendorDetail(payeeDetail.getDisbVchrVendorHeaderIdNumberAsInteger(), payeeDetail.getDisbVchrVendorDetailAssignedIdNumberAsInteger());
060                // if the vendor tax type is SSN, then check the tax number
061                if (dvVendor != null && TAX_TYPE_SSN.equals(dvVendor.getVendorHeader().getVendorTaxTypeCode())) {
062                    // check ssn against employee table
063                    Person user = retrieveEmployeeBySSN(dvVendor.getVendorHeader().getVendorTaxNumber());
064                    if (user != null) {
065                        uuid = user.getPrincipalId();
066                    }
067                }
068            }
069            // If payee is an employee, then pull payee from employee table
070            else if(payeeDetail.isEmployee()) {
071                uuid = payeeDetail.getDisbVchrEmployeeIdNumber();
072            }
073    
074            // If a uuid was found for payee, check it against the initiator uuid
075            if (StringUtils.isNotBlank(uuid)) {
076                Person initUser = getInitiator(document);
077                if (uuid.equals(initUser.getPrincipalId())) {
078                    errors.putError(DV_PAYEE_ID_NUMBER_PROPERTY_PATH, KFSKeyConstants.ERROR_PAYEE_INITIATOR);
079                    isValid = false;
080                }
081            }
082            
083            errors.removeFromErrorPath(KFSPropertyConstants.DOCUMENT);   
084            
085            return isValid;
086        }
087    
088        /**
089         * Retrieves the VendorDetail object from the vendor id number.
090         * 
091         * @param vendorIdNumber vendor ID number
092         * @param vendorDetailIdNumber vendor detail ID number
093         * @return <code>VendorDetail</code>
094         */
095        protected VendorDetail retrieveVendorDetail(Integer vendorIdNumber, Integer vendorDetailIdNumber) {
096            return SpringContext.getBean(VendorService.class).getVendorDetail(vendorIdNumber, vendorDetailIdNumber);
097        }
098    
099        /**
100         * Retrieves Person from SSN
101         * 
102         * @param ssnNumber social security number
103         * @return <code>Person</code>
104         */
105        protected Person retrieveEmployeeBySSN(String ssnNumber) {
106            Person person = (Person) SpringContext.getBean(PersonService.class).getPersonByExternalIdentifier(KimConstants.PersonExternalIdentifierTypes.TAX, ssnNumber).get(0);
107            if (person == null) {
108                LOG.error("User Not Found");
109            }
110            return person;
111        }
112        
113        /**
114         * Returns the initiator of the document as a KualiUser
115         * 
116         * @param document submitted document
117         * @return <code>KualiUser</code>
118         */
119        protected Person getInitiator(AccountingDocument document) {
120            Person initUser = SpringContext.getBean(PersonService.class).getPersonByPrincipalName(document.getDocumentHeader().getWorkflowDocument().getInitiatorNetworkId());
121            if (initUser == null) {
122                throw new RuntimeException("Document Initiator not found");
123            }
124    
125            return initUser;
126        }
127        
128        /**
129         * Sets the accountingDocumentForValidation attribute value.
130         * @param accountingDocumentForValidation The accountingDocumentForValidation to set.
131         */
132        public void setAccountingDocumentForValidation(AccountingDocument accountingDocumentForValidation) {
133            this.accountingDocumentForValidation = accountingDocumentForValidation;
134        }
135    
136        /**
137         * Gets the accountingDocumentForValidation attribute. 
138         * @return Returns the accountingDocumentForValidation.
139         */
140        public AccountingDocument getAccountingDocumentForValidation() {
141            return accountingDocumentForValidation;
142        }
143    
144    }
145