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.timeoff.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.timeoff.SystemScheduledTimeOff; 023 import org.kuali.hr.time.earncode.EarnCode; 024 import org.kuali.hr.time.service.base.TkServiceLocator; 025 import org.kuali.hr.time.util.TkConstants; 026 import org.kuali.hr.time.util.ValidationUtils; 027 import org.kuali.rice.kns.document.MaintenanceDocument; 028 import org.kuali.rice.kns.maintenance.rules.MaintenanceDocumentRuleBase; 029 import org.kuali.rice.krad.bo.PersistableBusinessObject; 030 031 public class SystemScheduledTimeOffValidation extends MaintenanceDocumentRuleBase { 032 boolean validateEffectiveDate(Date effectiveDate) { 033 boolean valid = true; 034 if (effectiveDate != null && !ValidationUtils.validateOneYearFutureDate(effectiveDate)) { 035 this.putFieldError("effectiveDate", "error.date.exceed.year", "Effective Date"); 036 valid = false; 037 } 038 return valid; 039 } 040 041 boolean validateAccruedDate(Date accruedDate) { 042 boolean valid = true; 043 if (accruedDate != null && !ValidationUtils.validateFutureDate(accruedDate)) { 044 this.putFieldError("accruedDate", "error.future.date", "Accrued Date"); 045 valid = false; 046 } 047 return valid; 048 } 049 050 boolean validateLocation(String location) { 051 boolean valid = true; 052 if(!StringUtils.isEmpty(location) && location.equals(TkConstants.WILDCARD_CHARACTER)) { 053 return true; 054 } 055 if (!ValidationUtils.validateLocation(location, null)) { 056 this.putFieldError("location", "error.existence", "location '" 057 + location + "'"); 058 valid = false; 059 } 060 return valid; 061 } 062 063 boolean validateScheduledTimeOffDate(Date scheduledTimeOffDate) { 064 boolean valid = true; 065 if (scheduledTimeOffDate!= null && !ValidationUtils.validateFutureDate(scheduledTimeOffDate)) { 066 this.putFieldError("scheduledTimeOffDate", "error.future.date", "Scheduled Time Off Date"); 067 valid = false; 068 } 069 return valid; 070 } 071 072 boolean validateUnusedTimeForScheduledTimeOffDate(Date scheduledTimeOffDate, String unusedTime) { 073 boolean valid = true; 074 if (scheduledTimeOffDate == null && (StringUtils.isEmpty(unusedTime) || StringUtils.equals("T", unusedTime) || StringUtils.equals("NUTA", unusedTime))) { 075 this.putFieldError("unusedTime", "error.unusedtime.bank.required", "Unused Time"); 076 valid = false; 077 } 078 return valid; 079 } 080 081 boolean validateTransfertoEarnCode(String transfertoEarnCode) { 082 boolean valid = true; 083 if (StringUtils.isEmpty(transfertoEarnCode)) { 084 this.putFieldError("transfertoEarnCode", "error.required", "Transfer to Earn Code"); 085 valid = false; 086 } 087 return valid; 088 } 089 090 boolean validateTransferConversionFactor(BigDecimal transferConversionFactor) { 091 boolean valid = true; 092 if (transferConversionFactor == null) { 093 this.putFieldError("transferConversionFactor", "error.required", "Transfer Conversion Factor"); 094 valid = false; 095 } 096 return valid; 097 } 098 099 boolean validateEarnCode(String earnCode, Date asOfDate) { 100 boolean valid = true; 101 if (!ValidationUtils.validateEarnCode(earnCode, asOfDate)) { 102 this.putFieldError("earnCode", "error.existence", "earnCode '" 103 + earnCode + "'"); 104 valid = false; 105 } 106 return valid; 107 } 108 109 private boolean validateFraction(String earnCode, BigDecimal amount, Date asOfDate, String fieldName) { 110 boolean valid = true; 111 if (!ValidationUtils.validateEarnCodeFraction(earnCode, amount, asOfDate)) { 112 EarnCode ec = TkServiceLocator.getEarnCodeService().getEarnCode(earnCode, asOfDate); 113 if(ec != null && ec.getFractionalTimeAllowed() != null) { 114 BigDecimal fracAllowed = new BigDecimal(ec.getFractionalTimeAllowed()); 115 String[] parameters = new String[2]; 116 parameters[0] = earnCode; 117 parameters[1] = Integer.toString(fracAllowed.scale()); 118 this.putFieldError(fieldName, "error.amount.fraction", parameters); 119 valid = false; 120 } 121 } 122 return valid; 123 } 124 125 @Override 126 protected boolean processCustomRouteDocumentBusinessRules( 127 MaintenanceDocument document) { 128 boolean valid = false; 129 LOG.debug("entering custom validation for SystemScheduledTimeOff"); 130 PersistableBusinessObject pbo = (PersistableBusinessObject) this.getNewBo(); 131 if (pbo instanceof SystemScheduledTimeOff) { 132 SystemScheduledTimeOff sysSchTimeOff = (SystemScheduledTimeOff) pbo; 133 if (sysSchTimeOff != null) { 134 valid = true; 135 valid &= this.validateEffectiveDate(sysSchTimeOff.getEffectiveDate()); 136 valid &= this.validateAccruedDate(sysSchTimeOff.getAccruedDate()); 137 valid &= this.validateScheduledTimeOffDate(sysSchTimeOff.getScheduledTimeOffDate()); 138 valid &= this.validateFraction(sysSchTimeOff.getEarnCode(),sysSchTimeOff.getAmountofTime(),sysSchTimeOff.getEffectiveDate(),"amountofTime"); 139 valid &= this.validateUnusedTimeForScheduledTimeOffDate(sysSchTimeOff.getScheduledTimeOffDate(), sysSchTimeOff.getUnusedTime()); 140 valid &= this.validateLocation(sysSchTimeOff.getLocation()); 141 valid &= this.validateEarnCode(sysSchTimeOff.getEarnCode(), sysSchTimeOff.getEffectiveDate()); 142 } 143 } 144 145 return valid; 146 } 147 }