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.HashMap;
019 import java.util.Map;
020
021 import org.kuali.kfs.pdp.PdpConstants;
022 import org.kuali.kfs.pdp.PdpPropertyConstants;
023 import org.kuali.kfs.pdp.businessobject.PayeeACHAccount;
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.rice.kns.document.MaintenanceDocument;
028 import org.kuali.rice.kns.maintenance.rules.MaintenanceDocumentRuleBase;
029 import org.kuali.rice.kns.service.BusinessObjectService;
030 import org.kuali.rice.kns.util.KualiInteger;
031
032 /**
033 * Performs business rules for the Payee ACH Account maintenance document
034 */
035 public class PayeeAchAccountRule extends MaintenanceDocumentRuleBase {
036 protected static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(PayeeACHAccount.class);
037
038 protected PayeeACHAccount oldPayeeAchAccount;
039 protected PayeeACHAccount newPayeeAchAccount;
040
041 /**
042 * @see org.kuali.rice.kns.maintenance.rules.MaintenanceDocumentRuleBase#setupConvenienceObjects()
043 */
044 public void setupConvenienceObjects() {
045 LOG.info("setupConvenienceObjects called");
046
047 // setup oldPayeeAchAccount convenience objects, make sure all possible sub-objects are populated
048 oldPayeeAchAccount = (PayeeACHAccount) super.getOldBo();
049
050 // setup newPayeeAchAccount convenience objects, make sure all possible sub-objects are populated
051 newPayeeAchAccount = (PayeeACHAccount) super.getNewBo();
052 }
053
054 /**
055 * @see org.kuali.rice.kns.maintenance.rules.MaintenanceDocumentRuleBase#processCustomSaveDocumentBusinessRules(org.kuali.rice.kns.document.MaintenanceDocument)
056 */
057 protected boolean processCustomSaveDocumentBusinessRules(MaintenanceDocument document) {
058 LOG.info("processCustomSaveDocumentBusinessRules called");
059
060 // call the route rules to report all of the messages, but ignore the result
061 processCustomRouteDocumentBusinessRules(document);
062
063 // Save always succeeds, even if there are business rule failures
064 return true;
065 }
066
067 /**
068 * @see org.kuali.rice.kns.maintenance.rules.MaintenanceDocumentRuleBase#processCustomRouteDocumentBusinessRules(org.kuali.rice.kns.document.MaintenanceDocument)
069 */
070 protected boolean processCustomRouteDocumentBusinessRules(MaintenanceDocument document) {
071 LOG.info("processCustomRouteDocumentBusinessRules called");
072
073 boolean validEntry = true;
074
075 setupConvenienceObjects();
076
077 validEntry &= checkForDuplicateRecord();
078
079 return validEntry;
080 }
081
082 /**
083 * Checks to verify record is not a duplicate for payee id. Do not check for a duplicate record if the following conditions are
084 * true 1. editing an existing record (old primary key = new primary key) 2. new PSD code = old PSD code 3. new payee type code
085 * = old payee type code 4. depending of the value of payee type code, new correspoding PayeeId = old corresponding PayeeId
086 *
087 * @return true if record is not duplicate, false otherwise
088 */
089 protected boolean checkForDuplicateRecord() {
090 String newPayeeIdNumber = newPayeeAchAccount.getPayeeIdNumber();
091 String newPayeeIdTypeCd = newPayeeAchAccount.getPayeeIdentifierTypeCode();
092 String newAchTransactionType = newPayeeAchAccount.getAchTransactionType();
093
094 boolean valid = true;
095
096 if (newPayeeAchAccount.getAchAccountGeneratedIdentifier() != null && oldPayeeAchAccount.getAchAccountGeneratedIdentifier() != null && newPayeeAchAccount.getAchAccountGeneratedIdentifier().equals(oldPayeeAchAccount.getAchAccountGeneratedIdentifier())) {
097 if (newPayeeIdTypeCd.equals(oldPayeeAchAccount.getPayeeIdentifierTypeCode()) && newAchTransactionType.equals(oldPayeeAchAccount.getAchTransactionType())) {
098 if (newPayeeAchAccount.getPayeeIdNumber().equals(oldPayeeAchAccount.getPayeeIdNumber())) {
099 return valid;
100 }
101 }
102 }
103
104 // check for a duplicate record if creating a new record or editing an old one and above mentioned conditions are not true
105 Map<String, Object> criteria = new HashMap<String, Object>();
106
107 criteria.put(PdpPropertyConstants.ACH_TRANSACTION_TYPE, newAchTransactionType);
108 criteria.put(PdpPropertyConstants.PAYEE_IDENTIFIER_TYPE_CODE, newPayeeIdTypeCd);
109 criteria.put(PdpPropertyConstants.PAYEE_ID_NUMBER, newPayeeIdNumber);
110
111 int matches = SpringContext.getBean(BusinessObjectService.class).countMatching(PayeeACHAccount.class, criteria);
112 if (matches > 0) {
113 putFieldError(PdpPropertyConstants.PAYEE_ID_NUMBER, KFSKeyConstants.ERROR_DOCUMENT_PAYEEACHACCOUNTMAINT_DUPLICATE_RECORD);
114 valid = false;
115 }
116
117 return valid;
118 }
119
120 }