001 /** 002 * Copyright 2004-2013 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.hr.lm.leavedonation.validation; 017 018 import java.math.BigDecimal; 019 import java.sql.Date; 020 021 import org.apache.commons.lang.StringUtils; 022 import org.kuali.hr.lm.leavedonation.LeaveDonation; 023 import org.kuali.hr.time.earncode.EarnCode; 024 import org.kuali.hr.time.service.base.TkServiceLocator; 025 import org.kuali.hr.time.util.ValidationUtils; 026 import org.kuali.rice.kns.document.MaintenanceDocument; 027 import org.kuali.rice.kns.maintenance.rules.MaintenanceDocumentRuleBase; 028 import org.kuali.rice.krad.bo.PersistableBusinessObject; 029 030 public class LeaveDonationValidation extends MaintenanceDocumentRuleBase { 031 public static final String DONOR = "donor"; 032 public static final String RECEPIENT = "recepient"; 033 034 boolean validateEffectiveDate(Date effectiveDate) { 035 boolean valid = true; 036 if (effectiveDate != null 037 && !ValidationUtils.validateOneYearFutureDate(effectiveDate)) { 038 this.putFieldError("effectiveDate", "error.date.exceed.year", "Effective Date"); 039 valid = false; 040 } 041 return valid; 042 } 043 044 boolean validatePrincipal(String principalId, String forPerson) { 045 boolean valid = true; 046 if (!ValidationUtils.validatePrincipalId(principalId)) { 047 this.putFieldError( 048 forPerson.equals(LeaveDonationValidation.DONOR) ? "donorsPrincipalID" 049 : "recipientsPrincipalID", "error.existence", 050 "principal Id '" + principalId + "'"); 051 valid = false; 052 } 053 return valid; 054 } 055 056 boolean validateAccrualCategory(String accrualCategory, Date asOfDate, 057 String forPerson) { 058 boolean valid = true; 059 if (!ValidationUtils.validateAccCategory(accrualCategory, asOfDate)) { 060 this.putFieldError( 061 forPerson.equals(LeaveDonationValidation.DONOR) ? "donatedAccrualCategory" 062 : "recipientsAccrualCategory", "error.leavePlan.mismatch", 063 "accrualCategory '" + accrualCategory + "'"); 064 valid = false; 065 } 066 return valid; 067 } 068 069 boolean validateAccrualCategory(String accrualCategory, Date asOfDate, 070 String forPerson, String principalId) { 071 boolean valid = true; 072 if (!ValidationUtils.validateAccCategory(accrualCategory, principalId, asOfDate)) { 073 String[] myErrorsArgs={"accrualCategory '" + accrualCategory + "'", forPerson}; 074 this.putFieldError( 075 forPerson.equals(LeaveDonationValidation.DONOR) ? "donatedAccrualCategory" 076 : "recipientsAccrualCategory", "error.leavePlan.mismatch", 077 myErrorsArgs); 078 valid = false; 079 080 } 081 return valid; 082 } 083 084 boolean validateEarnCode(String principalAC, String formEarnCode, String forPerson, Date asOfDate) { 085 boolean valid = true; 086 087 EarnCode testEarnCode = TkServiceLocator.getEarnCodeService().getEarnCode(formEarnCode, asOfDate); 088 // LeaveCode testLeaveCode = TkServiceLocator.getLeaveCodeService().getLeaveCode(formEarnCode, asOfDate); 089 String formEarnCodeAC = "NullAccrualCategoryPlaceholder"; 090 if (testEarnCode != null && testEarnCode.getAccrualCategory() != null) { 091 formEarnCodeAC = testEarnCode.getAccrualCategory(); 092 } 093 094 if (!StringUtils.equalsIgnoreCase(principalAC, formEarnCodeAC)) { 095 this.putFieldError(forPerson.equals(LeaveDonationValidation.DONOR) ? "donatedEarnCode" 096 : "recipientsEarnCode", "error.codeCategory.mismatch", forPerson); 097 valid = false; 098 } 099 return valid; 100 } 101 102 private boolean validateFraction(String earnCode, BigDecimal amount, Date asOfDate, String fieldName) { 103 boolean valid = true; 104 if (!ValidationUtils.validateEarnCodeFraction(earnCode, amount, asOfDate)) { 105 EarnCode ec = TkServiceLocator.getEarnCodeService().getEarnCode(earnCode, asOfDate); 106 if(ec != null && ec.getFractionalTimeAllowed() != null) { 107 BigDecimal fracAllowed = new BigDecimal(ec.getFractionalTimeAllowed()); 108 String[] parameters = new String[2]; 109 parameters[0] = earnCode; 110 parameters[1] = Integer.toString(fracAllowed.scale()); 111 this.putFieldError(fieldName, "error.amount.fraction", parameters); 112 valid = false; 113 } 114 } 115 return valid; 116 } 117 118 @Override 119 protected boolean processCustomRouteDocumentBusinessRules( 120 MaintenanceDocument document) { 121 boolean valid = false; 122 LOG.debug("entering custom validation for Leave Donation"); 123 PersistableBusinessObject pbo = (PersistableBusinessObject) this.getNewBo(); 124 if (pbo instanceof LeaveDonation) { 125 LeaveDonation leaveDonation = (LeaveDonation) pbo; 126 if (leaveDonation != null) { 127 valid = true; 128 //valid &= this.validateEffectiveDate(leaveDonation.getEffectiveDate()); // KPME-1207, effectiveDate can be past, current or future 129 if(leaveDonation.getDonatedAccrualCategory() != null) { 130 valid &= this.validateAccrualCategory( 131 leaveDonation.getDonatedAccrualCategory(), 132 leaveDonation.getEffectiveDate(), 133 LeaveDonationValidation.DONOR, leaveDonation.getDonorsPrincipalID()); 134 } 135 if(leaveDonation.getRecipientsAccrualCategory() != null) { 136 valid &= this.validateAccrualCategory( 137 leaveDonation.getRecipientsAccrualCategory(), 138 leaveDonation.getEffectiveDate(), 139 LeaveDonationValidation.RECEPIENT, leaveDonation.getRecipientsPrincipalID()); 140 } 141 if(leaveDonation.getDonorsPrincipalID() != null) { 142 valid &= this.validatePrincipal( 143 leaveDonation.getDonorsPrincipalID(), 144 LeaveDonationValidation.DONOR); 145 } 146 if(leaveDonation.getRecipientsPrincipalID() != null){ 147 valid &= this.validatePrincipal( 148 leaveDonation.getRecipientsPrincipalID(), 149 LeaveDonationValidation.RECEPIENT); 150 } 151 if(leaveDonation.getDonatedAccrualCategory() != null) { 152 valid &= this.validateEarnCode( 153 leaveDonation.getDonatedAccrualCategory(), 154 leaveDonation.getDonatedEarnCode(), 155 LeaveDonationValidation.DONOR, leaveDonation.getEffectiveDate()); 156 } 157 if(leaveDonation.getRecipientsAccrualCategory() != null) { 158 valid &= this.validateEarnCode( 159 leaveDonation.getRecipientsAccrualCategory(), 160 leaveDonation.getRecipientsEarnCode(), 161 LeaveDonationValidation.RECEPIENT, leaveDonation.getEffectiveDate()); 162 } 163 if(leaveDonation.getAmountDonated() != null && leaveDonation.getDonatedEarnCode() != null) { 164 valid &= this.validateFraction( 165 leaveDonation.getDonatedEarnCode(), 166 leaveDonation.getAmountDonated(), 167 leaveDonation.getEffectiveDate(), 168 "amountDonated"); 169 } 170 if(leaveDonation.getAmountReceived() != null && leaveDonation.getRecipientsEarnCode() != null) { 171 valid &= this.validateFraction( 172 leaveDonation.getRecipientsEarnCode(), 173 leaveDonation.getAmountReceived(), 174 leaveDonation.getEffectiveDate(), 175 "amountReceived"); 176 } 177 } 178 } 179 return valid; 180 } 181 }