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.earncodesec.validation; 017 018 import java.util.ArrayList; 019 import java.util.List; 020 021 import org.apache.commons.lang.StringUtils; 022 import org.kuali.hr.lm.earncodesec.EarnCodeSecurity; 023 import org.kuali.hr.time.roles.TkUserRoles; 024 import org.kuali.hr.time.service.base.TkServiceLocator; 025 import org.kuali.hr.time.timeblock.TimeBlock; 026 import org.kuali.hr.time.util.TkConstants; 027 import org.kuali.hr.time.util.ValidationUtils; 028 import org.kuali.rice.kns.document.MaintenanceDocument; 029 import org.kuali.rice.kns.maintenance.rules.MaintenanceDocumentRuleBase; 030 import org.kuali.rice.krad.bo.PersistableBusinessObject; 031 import org.kuali.rice.krad.util.GlobalVariables; 032 033 034 public class EarnCodeSecurityRule extends MaintenanceDocumentRuleBase { 035 036 private 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 private 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 private 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 private 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 private 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 private 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 private boolean isEarnCodeUsedByActiveTimeBlocks(EarnCodeSecurity departmentEarnCode){ 094 // KPME-1106 can not deactivate a department earn code if it used in active time blocks 095 boolean valid = true; 096 List<TimeBlock> latestEndTimestampTimeBlocks = TkServiceLocator.getTimeBlockService().getLatestEndTimestampForEarnCode(departmentEarnCode.getEarnCode()); 097 098 if ( !departmentEarnCode.isActive() && !latestEndTimestampTimeBlocks.isEmpty() && departmentEarnCode.getEffectiveDate().before(latestEndTimestampTimeBlocks.get(0).getEndDate()) ){ 099 this.putFieldError("active", "deptEarncode.deptEarncode.inactivate", departmentEarnCode.getEarnCode()); 100 return false; 101 } 102 103 return valid; 104 105 } 106 107 /** 108 * It looks like the method that calls this class doesn't actually care 109 * about the return type. 110 */ 111 @Override 112 protected boolean processCustomRouteDocumentBusinessRules( 113 MaintenanceDocument document) { 114 boolean valid = false; 115 116 LOG.debug("entering custom validation for EarnCodeSecurity"); 117 PersistableBusinessObject pbo = (PersistableBusinessObject) this.getNewBo(); 118 if (pbo instanceof EarnCodeSecurity) { 119 EarnCodeSecurity departmentEarnCode = (EarnCodeSecurity) pbo; 120 121 if (departmentEarnCode != null) { 122 valid = true; 123 valid &= this.validateSalGroup(departmentEarnCode); 124 valid &= this.validateDept(departmentEarnCode); 125 valid &= this.validateEarnCode(departmentEarnCode); 126 valid &= this.validateDuplication(departmentEarnCode); 127 valid &= this.validateLocation(departmentEarnCode); 128 valid &= this.validateDepartmentCurrentUser(departmentEarnCode); 129 valid &= this.isEarnCodeUsedByActiveTimeBlocks(departmentEarnCode); 130 } 131 132 } 133 134 return valid; 135 } 136 137 }