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.earncodesec.validation; 017 018 import org.apache.commons.lang.StringUtils; 019 import org.kuali.hr.earncodesec.EarnCodeSecurity; 020 import org.kuali.hr.time.roles.TkUserRoles; 021 import org.kuali.hr.time.service.base.TkServiceLocator; 022 import org.kuali.hr.time.timeblock.TimeBlock; 023 import org.kuali.hr.time.util.TkConstants; 024 import org.kuali.hr.time.util.ValidationUtils; 025 import org.kuali.rice.kns.document.MaintenanceDocument; 026 import org.kuali.rice.kns.maintenance.rules.MaintenanceDocumentRuleBase; 027 import org.kuali.rice.krad.bo.PersistableBusinessObject; 028 import org.kuali.rice.krad.util.GlobalVariables; 029 030 import java.util.ArrayList; 031 import java.util.List; 032 033 034 public class EarnCodeSecurityRule extends MaintenanceDocumentRuleBase { 035 036 boolean validateSalGroup(EarnCodeSecurity departmentEarnCode ) { 037 if (!ValidationUtils.validateSalGroup(departmentEarnCode.getHrSalGroup(), departmentEarnCode.getEffectiveDate())) { 038 this.putFieldError("hrSalGroup", "error.existence", "Salgroup '" + departmentEarnCode.getHrSalGroup()+ "'"); 039 return false; 040 } else { 041 return true; 042 } 043 } 044 045 boolean validateDept(EarnCodeSecurity clr) { 046 if (!ValidationUtils.validateDepartment(clr.getDept(), clr.getEffectiveDate()) && !StringUtils.equals(clr.getDept(), TkConstants.WILDCARD_CHARACTER)) { 047 this.putFieldError("dept", "error.existence", "department '" + clr.getDept() + "'"); 048 return false; 049 } else { 050 return true; 051 } 052 } 053 054 boolean validateEarnCode(EarnCodeSecurity departmentEarnCode ) { 055 if (!ValidationUtils.validateEarnCode(departmentEarnCode.getEarnCode(), departmentEarnCode.getEffectiveDate())) { 056 this.putFieldError("earnCode", "error.existence", "Earncode '" + departmentEarnCode.getEarnCode()+ "'"); 057 return false; 058 } else { 059 return true; 060 } 061 } 062 063 boolean validateDuplication(EarnCodeSecurity departmentEarnCode) { 064 if(ValidationUtils.duplicateDeptEarnCodeExists(departmentEarnCode)) { 065 this.putFieldError("effectiveDate", "deptEarncode.duplicate.exists"); 066 return false; 067 } else { 068 return true; 069 } 070 } 071 072 boolean validateLocation(EarnCodeSecurity departmentEarnCode) { 073 if (departmentEarnCode.getLocation() != null 074 && !ValidationUtils.validateLocation(departmentEarnCode.getLocation(), null) && 075 !StringUtils.equals(departmentEarnCode.getLocation(), TkConstants.WILDCARD_CHARACTER)) { 076 this.putFieldError("location", "error.existence", "location '" 077 + departmentEarnCode.getLocation() + "'"); 078 return false; 079 } else { 080 return true; 081 } 082 } 083 084 boolean validateDepartmentCurrentUser(EarnCodeSecurity departmentEarnCode) { 085 if (!TkUserRoles.getUserRoles(GlobalVariables.getUserSession().getPrincipalId()).isSystemAdmin() && !TkUserRoles.getUserRoles(GlobalVariables.getUserSession().getPrincipalId()).getOrgAdminDepartments().contains(departmentEarnCode.getDept())) { 086 this.putFieldError("dept", "error.department.permissions", departmentEarnCode.getDept()); 087 return false; 088 } else { 089 return true; 090 } 091 } 092 093 boolean isEarnCodeUsedByActiveTimeBlocks(EarnCodeSecurity departmentEarnCode){ 094 // KPME-1106 can not inactivation of a department earn code if it used in active time blocks 095 boolean valid = true; 096 List<TimeBlock> latestEndTimestampTimeBlocks = TkServiceLocator.getTimeBlockService().getLatestEndTimestamp(); 097 098 if ( !departmentEarnCode.isActive() && departmentEarnCode.getEffectiveDate().before(latestEndTimestampTimeBlocks.get(0).getEndDate()) ){ 099 List<TimeBlock> activeTimeBlocks = new ArrayList<TimeBlock>(); 100 activeTimeBlocks = TkServiceLocator.getTimeBlockService().getTimeBlocks(); 101 for(TimeBlock activeTimeBlock : activeTimeBlocks){ 102 if ( departmentEarnCode.getEarnCode().equals(activeTimeBlock.getEarnCode())){ 103 this.putFieldError("active", "deptEarncode.deptEarncode.inactivate", departmentEarnCode.getEarnCode()); 104 return false; 105 } 106 } 107 } 108 109 return valid; 110 111 } 112 113 /** 114 * It looks like the method that calls this class doesn't actually care 115 * about the return type. 116 */ 117 @Override 118 protected boolean processCustomRouteDocumentBusinessRules( 119 MaintenanceDocument document) { 120 boolean valid = false; 121 122 LOG.debug("entering custom validation for EarnCodeSecurity"); 123 PersistableBusinessObject pbo = (PersistableBusinessObject) this.getNewBo(); 124 if (pbo instanceof EarnCodeSecurity) { 125 EarnCodeSecurity departmentEarnCode = (EarnCodeSecurity) pbo; 126 127 if (departmentEarnCode != null) { 128 valid = true; 129 valid &= this.validateSalGroup(departmentEarnCode); 130 valid &= this.validateDept(departmentEarnCode); 131 valid &= this.validateEarnCode(departmentEarnCode); 132 valid &= this.validateDuplication(departmentEarnCode); 133 valid &= this.validateLocation(departmentEarnCode); 134 valid &= this.validateDepartmentCurrentUser(departmentEarnCode); 135 valid &= this.isEarnCodeUsedByActiveTimeBlocks(departmentEarnCode); 136 } 137 138 } 139 140 return valid; 141 } 142 143 }