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.document.validation.impl;
017
018 import java.util.Collection;
019 import java.util.HashMap;
020 import java.util.Map;
021
022 import org.apache.commons.lang.StringUtils;
023 import org.apache.log4j.Logger;
024 import org.kuali.kfs.pdp.PdpConstants;
025 import org.kuali.kfs.pdp.PdpKeyConstants;
026 import org.kuali.kfs.pdp.PdpPropertyConstants;
027 import org.kuali.kfs.pdp.businessobject.CustomerBank;
028 import org.kuali.kfs.pdp.businessobject.CustomerProfile;
029 import org.kuali.kfs.sys.context.SpringContext;
030 import org.kuali.rice.kns.bo.PersistableBusinessObject;
031 import org.kuali.rice.kns.document.MaintenanceDocument;
032 import org.kuali.rice.kns.maintenance.rules.MaintenanceDocumentRuleBase;
033 import org.kuali.rice.kns.service.BusinessObjectService;
034 import org.kuali.rice.kns.util.GlobalVariables;
035 import org.kuali.rice.kns.util.KNSConstants;
036 import org.kuali.rice.kns.util.MessageMap;
037
038 public class CustomerProfileRule extends MaintenanceDocumentRuleBase {
039 protected static Logger LOG = org.apache.log4j.Logger.getLogger(CustomerProfileRule.class);
040
041 /**
042 * @see org.kuali.rice.kns.maintenance.rules.MaintenanceDocumentRuleBase#processCustomAddCollectionLineBusinessRules(org.kuali.rice.kns.document.MaintenanceDocument, java.lang.String, org.kuali.rice.kns.bo.PersistableBusinessObject)
043 */
044 @Override
045 public boolean processCustomAddCollectionLineBusinessRules(MaintenanceDocument document, String collectionName, PersistableBusinessObject line) {
046 boolean isValid = true;
047 isValid &= super.processCustomAddCollectionLineBusinessRules(document, collectionName, line);
048 MessageMap errorMap = GlobalVariables.getMessageMap();
049 isValid &= errorMap.isEmpty();
050
051 if (isValid) {
052 if (collectionName.equals(PdpPropertyConstants.CustomerProfile.CUSTOMER_PROFILE_BANKS)) {
053 CustomerBank newCustomerBank = (CustomerBank) line;
054
055 CustomerProfile customerProfile = (CustomerProfile) document.getNewMaintainableObject().getBusinessObject();
056 for (CustomerBank bank : customerProfile.getCustomerBanks()) {
057 if (bank.getDisbursementTypeCode().equalsIgnoreCase(newCustomerBank.getDisbursementTypeCode())) {
058 errorMap.putError( PdpPropertyConstants.DISBURSEMENT_TYPE_CODE, PdpKeyConstants.ERROR_ONE_BANK_PER_DISBURSEMENT_TYPE_CODE);
059 isValid = false;
060 }
061 }
062 }
063 }
064 return isValid;
065 }
066
067 /**
068 * KFSMI-3771
069 * This method checks if the Disbursement Bank information is provided in the Customer profile.
070 * If Bank information is provided; It's required that a Check bank is present.
071 * If the Customer profile has ACH disbursement type information provided, it should have an ACH bank Information as well.
072 * @see org.kuali.rice.kns.maintenance.rules.MaintenanceDocumentRuleBase#processCustomRouteDocumentBusinessRules(org.kuali.rice.kns.document.MaintenanceDocument)
073 * @param MaintenanceDocument - CustomerProfileMaintenanceDocument
074 * @return boolean - true if business rules are satisfied; false otherwise.
075 */
076 @Override
077 protected boolean processCustomRouteDocumentBusinessRules(MaintenanceDocument document) {
078 boolean isValid =true;
079 isValid &= super.processCustomRouteDocumentBusinessRules(document);
080
081 CustomerProfile customerProfile = (CustomerProfile) document.getNewMaintainableObject().getBusinessObject();
082
083 boolean checkBankPresent = false;
084 boolean ACHBankPresent = false;
085
086 //Check if the customer profile has ACH transaction type information present.
087 boolean customerHasACHType = customerProfile.getAchTransactionType() != null ? true : false;
088
089 //Check if customer profile has bank information
090 if (customerProfile.getCustomerBanks().isEmpty()){
091 putFieldError(KNSConstants.MAINTENANCE_ADD_PREFIX+"customerBanks."+PdpPropertyConstants.DISBURSEMENT_TYPE_CODE, PdpKeyConstants.Format.ErrorMessages.ERROR_FORMAT_BANK_MISSING, customerProfile.getId().toString());
092
093 isValid = false;
094 }else{
095 for (CustomerBank bank : customerProfile.getCustomerBanks()){
096
097 //Check if customer profile has Check type Bank information
098 if(bank.getDisbursementTypeCode().equalsIgnoreCase(PdpConstants.DisbursementTypeCodes.CHECK)){
099 checkBankPresent = true;
100 }
101 //Check if customer profile has ACH type Bank information
102 if(bank.getDisbursementTypeCode().equalsIgnoreCase(PdpConstants.DisbursementTypeCodes.ACH)){
103 ACHBankPresent = true;
104 }
105 if(checkBankPresent && ACHBankPresent){
106 break;
107 }
108 }
109
110 //Generate error message if check bank is not present.
111 if(!checkBankPresent){
112 isValid = false;
113 putFieldError(KNSConstants.MAINTENANCE_ADD_PREFIX+"customerBanks."+PdpPropertyConstants.DISBURSEMENT_TYPE_CODE, PdpKeyConstants.ERROR_PDP_CHECK_BANK_REQUIRED);
114 }
115
116 //Generate error message if ACH bank is not present for profile with ACH disbursement type.
117 if(customerHasACHType && !ACHBankPresent){
118 isValid = false;
119 putFieldError(KNSConstants.MAINTENANCE_ADD_PREFIX+"customerBanks."+PdpPropertyConstants.DISBURSEMENT_TYPE_CODE, PdpKeyConstants.ERROR_PDP_ACH_BANK_REQUIRED);
120 }
121
122 }
123
124 // KFSMI-5158 Uniqueness check only for new Customer Profiles
125 if (document.isNew()) {
126 isValid &= verifyChartUnitSubUnitIsUnique(customerProfile);
127 }
128
129 return isValid;
130 }
131
132 /**
133 * Verifies that the chart/unit/sub-unit combination on this customer profile is unique
134 * @param customerProfile the customer profile to check
135 * @return true if the chart/unit/sub-unit is unique, false otherwise
136 */
137 protected boolean verifyChartUnitSubUnitIsUnique(CustomerProfile customerProfile) {
138 boolean result = true;
139
140 if (!StringUtils.isBlank(customerProfile.getChartCode()) && !StringUtils.isBlank(customerProfile.getUnitCode()) && !StringUtils.isBlank(customerProfile.getSubUnitCode())) {
141 final BusinessObjectService businessObjectService = SpringContext.getBean(BusinessObjectService.class);
142 Map<String, Object> searchKeys = new HashMap<String, Object>();
143 searchKeys.put(PdpPropertyConstants.CustomerProfile.CUSTOMER_PROFILE_CHART_CODE, customerProfile.getChartCode());
144 searchKeys.put(PdpPropertyConstants.CustomerProfile.CUSTOMER_PROFILE_UNIT_CODE, customerProfile.getUnitCode());
145 searchKeys.put(PdpPropertyConstants.CustomerProfile.CUSTOMER_PROFILE_SUB_UNIT_CODE, customerProfile.getSubUnitCode());
146
147 final Collection foundCustomerProfiles = businessObjectService.findMatching(CustomerProfile.class, searchKeys);
148 if (foundCustomerProfiles != null && foundCustomerProfiles.size() > 0) {
149 result = false;
150 putFieldError(PdpPropertyConstants.CustomerProfile.CUSTOMER_PROFILE_UNIT_CODE, PdpKeyConstants.ERROR_CUSTOMER_PROFILE_CHART_UNIT_SUB_UNIT_NOT_UNIQUE, new String[] { customerProfile.getChartCode(), customerProfile.getUnitCode(), customerProfile.getSubUnitCode()});
151 }
152 }
153
154 return result;
155 }
156
157 }