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.pdp.businessobject.lookup;
017    
018    import java.util.ArrayList;
019    import java.util.Collections;
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.lookup.DisbursementPayeeLookupableHelperServiceImpl;
026    import org.kuali.kfs.pdp.PdpConstants;
027    import org.kuali.kfs.pdp.PdpKeyConstants;
028    import org.kuali.kfs.pdp.businessobject.ACHPayee;
029    import org.kuali.kfs.sys.KFSKeyConstants;
030    import org.kuali.kfs.sys.KFSPropertyConstants;
031    import org.kuali.kfs.vnd.businessobject.VendorDetail;
032    import org.kuali.rice.kim.bo.Person;
033    import org.kuali.rice.kim.util.KIMPropertyConstants;
034    import org.kuali.rice.kns.bo.BusinessObject;
035    import org.kuali.rice.kns.exception.ValidationException;
036    import org.kuali.rice.kns.lookup.CollectionIncomplete;
037    import org.kuali.rice.kns.util.BeanPropertyComparator;
038    import org.kuali.rice.kns.util.GlobalVariables;
039    import org.kuali.rice.kns.web.ui.ResultRow;
040    
041    /**
042     * Payee lookupable for PDP Payee ACH. Builds off of DV Payee lookup by taking off payment reason code, and adding adding entity id
043     * to search and return url
044     */
045    public class ACHPayeeLookupableHelperServiceImpl extends DisbursementPayeeLookupableHelperServiceImpl {
046    
047        /**
048         * @see org.kuali.kfs.fp.businessobject.lookup.DisbursementPayeeLookupableHelperServiceImpl#getSearchResults(java.util.Map)
049         */
050        @Override
051        public List<? extends BusinessObject> getSearchResults(Map<String, String> fieldValues) {
052            List<DisbursementPayee> searchResults = new ArrayList<DisbursementPayee>();
053    
054            String payeeTypeCode = fieldValues.get(KFSPropertyConstants.PAYEE_TYPE_CODE);
055            if (StringUtils.isBlank(payeeTypeCode)) {
056                GlobalVariables.getMessageMap().putInfo(KFSPropertyConstants.PAYEE_TYPE_CODE, PdpKeyConstants.MESSAGE_PDP_ACH_PAYEE_LOOKUP_NO_PAYEE_TYPE);
057            }
058            
059            if (StringUtils.isNotBlank(fieldValues.get(KFSPropertyConstants.VENDOR_NUMBER)) || StringUtils.isNotBlank(fieldValues.get(KFSPropertyConstants.VENDOR_NAME)) || (StringUtils.isNotBlank(payeeTypeCode) && PdpConstants.PayeeIdTypeCodes.VENDOR_ID.equals(payeeTypeCode))) {
060                searchResults.addAll(this.getVendorsAsPayees(fieldValues));
061            }
062            else if (StringUtils.isNotBlank(fieldValues.get(KIMPropertyConstants.Person.EMPLOYEE_ID)) || StringUtils.isNotBlank(fieldValues.get(KIMPropertyConstants.Person.ENTITY_ID)) || (StringUtils.isNotBlank(payeeTypeCode) && (PdpConstants.PayeeIdTypeCodes.EMPLOYEE.equals(payeeTypeCode) || PdpConstants.PayeeIdTypeCodes.ENTITY.equals(payeeTypeCode)))) {
063                searchResults.addAll(this.getPersonAsPayees(fieldValues));
064            }
065            else {
066                searchResults.addAll(this.getVendorsAsPayees(fieldValues));
067                searchResults.addAll(this.getPersonAsPayees(fieldValues));
068            }
069    
070            CollectionIncomplete results = new CollectionIncomplete(searchResults, Long.valueOf(searchResults.size()));
071    
072            // sort list if default sort column given
073            List<String> defaultSortColumns = getDefaultSortColumns();
074            if (defaultSortColumns.size() > 0) {
075                Collections.sort(results, new BeanPropertyComparator(getDefaultSortColumns(), true));
076            }
077    
078            return results;
079        }
080    
081    
082        /**
083         * Override to set entity id as the payee id and set the pdp payee type
084         * 
085         * @see org.kuali.kfs.fp.businessobject.lookup.DisbursementPayeeLookupableHelperServiceImpl#getPayeeFromPerson(org.kuali.rice.kim.bo.Person,
086         *      java.util.Map)
087         */
088        @Override
089        protected DisbursementPayee getPayeeFromPerson(Person personDetail, Map<String, String> fieldValues) {
090            DisbursementPayee payee = super.getPayeeFromPerson(personDetail, fieldValues);
091    
092            String payeeTypeCode = (String) fieldValues.get(KFSPropertyConstants.PAYEE_TYPE_CODE);
093    
094            ACHPayee achPayee = new ACHPayee();
095    
096            if (PdpConstants.PayeeIdTypeCodes.ENTITY.equals(payeeTypeCode)) {
097                achPayee.setPayeeIdNumber(personDetail.getEntityId());
098                achPayee.setPayeeTypeCode(PdpConstants.PayeeIdTypeCodes.ENTITY);
099            }
100            else {
101                achPayee.setPayeeIdNumber(personDetail.getEmployeeId());
102                achPayee.setPayeeTypeCode(PdpConstants.PayeeIdTypeCodes.EMPLOYEE);
103            }
104            
105            achPayee.setPayeeName(payee.getPayeeName());
106            achPayee.setPrincipalId(payee.getPrincipalId());
107            achPayee.setTaxNumber(payee.getTaxNumber());
108            achPayee.setAddress(payee.getAddress());
109            achPayee.setActive(payee.isActive());
110    
111            return achPayee;
112        }
113    
114    
115        /**
116         * @see org.kuali.kfs.fp.businessobject.lookup.DisbursementPayeeLookupableHelperServiceImpl#getPayeeFromVendor(org.kuali.kfs.vnd.businessobject.VendorDetail,
117         *      java.util.Map)
118         */
119        @Override
120        protected DisbursementPayee getPayeeFromVendor(VendorDetail vendorDetail, Map<String, String> fieldValues) {
121            DisbursementPayee payee = super.getPayeeFromVendor(vendorDetail, fieldValues);
122    
123            ACHPayee achPayee = new ACHPayee();
124    
125            achPayee.setPayeeIdNumber(payee.getPayeeIdNumber());
126            achPayee.setPayeeTypeCode(PdpConstants.PayeeIdTypeCodes.VENDOR_ID);
127            achPayee.setPayeeName(payee.getPayeeName());
128            achPayee.setPrincipalId(payee.getPrincipalId());
129            achPayee.setTaxNumber(payee.getTaxNumber());
130            achPayee.setAddress(payee.getAddress());
131            achPayee.setActive(payee.isActive());
132    
133            return achPayee;
134        }
135    
136    
137        /**
138         * @see org.kuali.kfs.fp.businessobject.lookup.DisbursementPayeeLookupableHelperServiceImpl#validateSearchParameters(java.util.Map)
139         */
140        @Override
141        public void validateSearchParameters(Map fieldValues) {
142            super.validateSearchParameters(fieldValues);
143    
144            String vendorName = (String) fieldValues.get(KFSPropertyConstants.VENDOR_NAME);
145            String vendorNumber = (String) fieldValues.get(KFSPropertyConstants.VENDOR_NUMBER);
146            String employeeId = (String) fieldValues.get(KIMPropertyConstants.Person.EMPLOYEE_ID);
147            String entityId = (String) fieldValues.get(KIMPropertyConstants.Person.ENTITY_ID);
148            String payeeTypeCode = (String) fieldValues.get(KFSPropertyConstants.PAYEE_TYPE_CODE);
149    
150            // only can use the vendor name and vendor number fields or the employee id field, but not both.
151            boolean isVendorInfoEntered = StringUtils.isNotBlank(vendorName) || StringUtils.isNotBlank(vendorNumber);
152            if (StringUtils.isNotBlank(entityId) && isVendorInfoEntered) {
153                String messageKey = KFSKeyConstants.ERROR_DV_VENDOR_EMPLOYEE_CONFUSION;
154    
155                String vendorNameLabel = this.getAttributeLabel(KFSPropertyConstants.VENDOR_NAME);
156                String vendorNumberLabel = this.getAttributeLabel(KFSPropertyConstants.VENDOR_NUMBER);
157                String entityIdLabel = this.getAttributeLabel(KIMPropertyConstants.Person.ENTITY_ID);
158    
159                GlobalVariables.getMessageMap().putError(KIMPropertyConstants.Person.ENTITY_ID, messageKey, entityIdLabel, vendorNameLabel, vendorNumberLabel);
160            }
161    
162            boolean isEmployeeInfoEntered = StringUtils.isNotBlank(employeeId) || StringUtils.isNotBlank(entityId);
163            boolean payeeTypeEntered = StringUtils.isNotBlank(payeeTypeCode);
164    
165            if (payeeTypeEntered && PdpConstants.PayeeIdTypeCodes.VENDOR_ID.equals(payeeTypeCode) && isEmployeeInfoEntered) {
166                String messageKey = PdpKeyConstants.ERROR_PAYEE_LOOKUP_VENDOR_EMPLOYEE_CONFUSION;
167    
168                String employeeIdLabel = this.getAttributeLabel(KIMPropertyConstants.Person.EMPLOYEE_ID);
169                String entityIdLabel = this.getAttributeLabel(KIMPropertyConstants.Person.ENTITY_ID);
170                String payeeTypeLabel = this.getAttributeLabel(KFSPropertyConstants.PAYEE_TYPE_CODE);
171    
172                GlobalVariables.getMessageMap().putError(KFSPropertyConstants.PAYEE_TYPE_CODE, messageKey, payeeTypeLabel, payeeTypeCode, employeeIdLabel, entityIdLabel);
173            }
174            else if (payeeTypeEntered && (PdpConstants.PayeeIdTypeCodes.EMPLOYEE.equals(payeeTypeCode) || PdpConstants.PayeeIdTypeCodes.ENTITY.equals(payeeTypeCode)) && isVendorInfoEntered) {
175                String messageKey = PdpKeyConstants.ERROR_PAYEE_LOOKUP_VENDOR_EMPLOYEE_CONFUSION;
176    
177                String vendorNameLabel = this.getAttributeLabel(KFSPropertyConstants.VENDOR_NAME);
178                String vendorNumberLabel = this.getAttributeLabel(KFSPropertyConstants.VENDOR_NUMBER);
179                String payeeTypeLabel = this.getAttributeLabel(KFSPropertyConstants.PAYEE_TYPE_CODE);
180    
181                GlobalVariables.getMessageMap().putError(KFSPropertyConstants.PAYEE_TYPE_CODE, messageKey, payeeTypeLabel, payeeTypeCode, vendorNameLabel, vendorNumberLabel);
182            }
183    
184            if (GlobalVariables.getMessageMap().hasErrors()) {
185                throw new ValidationException("errors in search criteria");
186            }
187        }
188    
189        /**
190         * Override to not filter rows based on payment reason
191         * 
192         * @see org.kuali.kfs.fp.businessobject.lookup.DisbursementPayeeLookupableHelperServiceImpl#filterReturnUrl(java.util.List,
193         *      java.util.List, java.lang.String)
194         */
195        @Override
196        protected void filterReturnUrl(List<ResultRow> resultRowList, List<DisbursementPayee> payeeList, String paymentReasonCode) {
197        }
198    
199    }