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 }