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.time.util; 017 018 import java.math.BigDecimal; 019 import java.math.MathContext; 020 import java.math.RoundingMode; 021 import java.util.ArrayList; 022 import java.util.HashMap; 023 import java.util.HashSet; 024 import java.util.LinkedHashMap; 025 import java.util.List; 026 import java.util.Map; 027 import java.util.Set; 028 import java.util.TimeZone; 029 030 import org.joda.time.DateTimeZone; 031 import org.joda.time.format.DateTimeFormat; 032 import org.joda.time.format.DateTimeFormatter; 033 import org.kuali.hr.lm.accrual.AccrualCategory; 034 import org.kuali.hr.lm.leaveplan.LeavePlan; 035 import org.kuali.hr.time.earncode.EarnCode; 036 import org.kuali.rice.kew.api.KewApiConstants; 037 import org.kuali.rice.kew.api.document.DocumentStatus; 038 039 public class TkConstants { 040 public static final int DEFAULT_CACHE_TIME = 900; 041 public static final String TK_TARGET_USER_RETURN = "tkTargetReturn"; 042 public static final String TK_TARGET_USER_PERSON = "tkTargetPerson"; 043 044 public static final String WILDCARD_CHARACTER = "%"; 045 public static final Long WILDCARD_LONG = -1L; 046 047 //in days 048 public static final Integer LENGTH_OF_WORK_SCHEDULE = 10; 049 050 public static final String CLOCK_IN = "CI"; 051 public static final String CLOCK_OUT = "CO"; 052 public static final String LUNCH_IN = "LI"; // Coming back from Lunch 053 public static final String LUNCH_OUT = "LO"; // Leaving for Lunch 054 055 public static final List<String> ON_THE_CLOCK_CODES = new ArrayList<String>(); 056 057 static { 058 ON_THE_CLOCK_CODES.add(CLOCK_IN); 059 ON_THE_CLOCK_CODES.add(LUNCH_IN); 060 } 061 062 // action history 063 public static final String DELETE = "DELETE"; 064 public static final String ADD = "ADD"; 065 public static final String MODIFIED = "MODIFIED"; 066 067 // earn code type 068 public static final String EARN_CODE_HOUR = "H"; 069 public static final String EARN_CODE_TIME = "T"; 070 public static final String EARN_CODE_AMOUNT = "A"; 071 public static final String EARN_CODE_OVT = "OVT"; 072 public static final String EARN_CODE_CPE = "CPE"; 073 public static final String EARN_CODE_DAY = "D"; 074 075 public static final String GMT_TIME_ZONE_ID = "Etc/GMT"; 076 public static final TimeZone GMT_TIME_ZONE = TimeZone.getTimeZone(GMT_TIME_ZONE_ID); 077 //public static final String SYSTEM_TIME_ZONE = TimeZone.getDefault().getDisplayName(); 078 079 //public static final DateTimeZone SYSTEM_DATE_TIME_ZONE = DateTimeZone.forID(TKUtils.getSystemTimeZone()); 080 public static DateTimeFormatter DT_BASIC_TIME_FORMAT = DateTimeFormat.forPattern("hh:mm aa"); 081 public static DateTimeFormatter DT_MILITARY_TIME_FORMAT = DateTimeFormat.forPattern("H:mm"); 082 public static DateTimeFormatter DT_BASIC_DATE_FORMAT = DateTimeFormat.forPattern("MM/dd/yyyy"); 083 public static DateTimeFormatter DT_ABBREV_DATE_FORMAT = DateTimeFormat.forPattern("MM/dd"); 084 public static DateTimeFormatter DT_FULL_DATE_TIME_FORMAT = DateTimeFormat.forPattern("MM/dd/yyyy hh:mm aa"); 085 086 public static DateTimeFormatter DT_JUST_DAY_FORMAT = DateTimeFormat.forPattern("dd"); 087 088 public static final int BIG_DECIMAL_SCALE = 2; 089 public static final RoundingMode BIG_DECIMAL_SCALE_ROUNDING = RoundingMode.HALF_EVEN; 090 public static final BigDecimal BIG_DECIMAL_SCALED_ZERO = BigDecimal.ZERO.setScale(TkConstants.BIG_DECIMAL_SCALE, TkConstants.BIG_DECIMAL_SCALE_ROUNDING); 091 public static final BigDecimal BIG_DECIMAL_NEGATIVE_ONE = new BigDecimal("-1"); 092 093 public static final MathContext MATH_CONTEXT = new MathContext(5, BIG_DECIMAL_SCALE_ROUNDING); 094 public static final BigDecimal BIG_DECIMAL_1000 = BigDecimal.TEN.multiply(BigDecimal.TEN).multiply(BigDecimal.TEN); 095 public static final BigDecimal BIG_DECIMAL_60 = BigDecimal.TEN.multiply(new BigDecimal("6")); 096 public static final BigDecimal BIG_DECIMAL_MS_IN_H = BIG_DECIMAL_1000.multiply(BIG_DECIMAL_60).multiply(BIG_DECIMAL_60); 097 public static final BigDecimal BIG_DECIMAL_MS_IN_M = BIG_DECIMAL_1000.multiply(BIG_DECIMAL_60); 098 public static final BigDecimal BIG_DECIMAL_HRS_IN_DAY = new BigDecimal(24); 099 100 public static final String SUPER_USER = TkConstants.ROLE_TK_SYS_ADMIN; 101 102 //Used to map job locations to specify the timezone for display purposes 103 public static final Map<String, String> LOCATION_TO_TIME_ZONE_MAP = new HashMap<String, String>(); 104 105 static { 106 LOCATION_TO_TIME_ZONE_MAP.put("NW", "America/Chicago"); 107 } 108 109 /** 110 * The following ROLE_* constants need to match what is in the workflow database. They will be 111 * used internally to obtain a reference to the underlying IDs in the workflow system. 112 * <p/> 113 * Used in *ValuesFinder classes for maintenance page dropdowns. 114 */ 115 public static final String ROLE_NAMESAPCE = "KUALI"; 116 public static final String ROLE_TK_GLOBAL_VO = "TK_GLOBAL_VO"; 117 public static final String ROLE_TK_DEPT_VO = "TK_DEPT_VO"; 118 public static final String ROLE_LV_DEPT_VO = "LV_DEPT_VO"; // KPME-1411 119 public static final String ROLE_TK_LOCATION_VO = "TK_LOCATION_VO"; 120 public static final String ROLE_TK_REVIEWER = "TK_REVIEWER"; 121 public static final String ROLE_TK_APPROVER = "TK_APPROVER"; 122 public static final String ROLE_TK_APPROVER_DELEGATE = "TK_APPROVER_DELEGATE"; 123 public static final String ROLE_TK_EMPLOYEE = "TK_EMPLOYEE"; 124 public static final String ROLE_TK_LOCATION_ADMIN = "TK_ORG_ADMIN"; 125 public static final String ROLE_TK_DEPT_ADMIN = "TK_DEPT_ADMIN"; 126 public static final String ROLE_LV_DEPT_ADMIN = "LV_DEPT_ADMIN"; // KPME-1411 127 public static final String ROLE_TK_SYS_ADMIN = "TK_SYS_ADMIN"; 128 public static final String ROLE_WORK_AREA_QUALIFIER_ID = "workArea"; 129 public static final List<String> ROLE_ASSIGNMENT_FOR_WORK_AREA = new ArrayList<String>(2); 130 public static final List<String> ROLE_ASSIGNMENT_FOR_USER_ROLES = new ArrayList<String>(6); 131 public static final Map<String, String> ALL_ROLES_MAP = new HashMap<String, String>(); 132 public static final List<String> ROLE_ASSIGNMENT_FOR_WORK_AREA_OT_EDIT = new ArrayList<String>(3); 133 134 static { 135 ROLE_ASSIGNMENT_FOR_WORK_AREA.add(TkConstants.ROLE_TK_APPROVER); 136 ROLE_ASSIGNMENT_FOR_USER_ROLES.add(TkConstants.ROLE_TK_GLOBAL_VO); 137 ROLE_ASSIGNMENT_FOR_USER_ROLES.add(TkConstants.ROLE_TK_DEPT_VO); 138 ROLE_ASSIGNMENT_FOR_USER_ROLES.add(TkConstants.ROLE_TK_DEPT_ADMIN); 139 ROLE_ASSIGNMENT_FOR_USER_ROLES.add(TkConstants.ROLE_TK_REVIEWER); 140 ROLE_ASSIGNMENT_FOR_USER_ROLES.add(TkConstants.ROLE_TK_APPROVER); 141 ROLE_ASSIGNMENT_FOR_USER_ROLES.add(TkConstants.ROLE_TK_APPROVER_DELEGATE); 142 ROLE_ASSIGNMENT_FOR_USER_ROLES.add(TkConstants.ROLE_TK_LOCATION_ADMIN); 143 ROLE_ASSIGNMENT_FOR_USER_ROLES.add(TkConstants.ROLE_TK_LOCATION_VO); 144 ROLE_ASSIGNMENT_FOR_USER_ROLES.add(TkConstants.ROLE_TK_SYS_ADMIN); 145 146 ROLE_ASSIGNMENT_FOR_WORK_AREA_OT_EDIT.add(TkConstants.ROLE_TK_EMPLOYEE); 147 ROLE_ASSIGNMENT_FOR_WORK_AREA_OT_EDIT.add(TkConstants.ROLE_TK_APPROVER); 148 ROLE_ASSIGNMENT_FOR_WORK_AREA_OT_EDIT.add(TkConstants.ROLE_TK_APPROVER_DELEGATE); 149 ROLE_ASSIGNMENT_FOR_WORK_AREA_OT_EDIT.add(TkConstants.ROLE_TK_DEPT_ADMIN); 150 151 ALL_ROLES_MAP.put(TkConstants.ROLE_TK_REVIEWER, "Reviewer"); // attach at 'work area' level, like approvers without departmental rules 152 ALL_ROLES_MAP.put(TkConstants.ROLE_TK_GLOBAL_VO, "Global View Only"); // can see everything in the system, but not modify 153 ALL_ROLES_MAP.put(TkConstants.ROLE_TK_DEPT_VO, "Time Department View Only"); // can only see objects belonging to a department 154 ALL_ROLES_MAP.put(TkConstants.ROLE_LV_DEPT_VO, "Leave Department View Only"); // kpme1411 155 156 ALL_ROLES_MAP.put(TkConstants.ROLE_TK_LOCATION_VO, "Location View Only"); 157 ALL_ROLES_MAP.put(TkConstants.ROLE_TK_APPROVER, "Approver"); // attach at 'work area', view only departmental rules 158 ALL_ROLES_MAP.put(TkConstants.ROLE_TK_APPROVER_DELEGATE, "Approver Delegate"); // attach at 'work area' 159 ALL_ROLES_MAP.put(TkConstants.ROLE_TK_EMPLOYEE, "Employee"); // only people with active assignments have this role. 160 ALL_ROLES_MAP.put(TkConstants.ROLE_TK_LOCATION_ADMIN, "Location Admin"); // location admin rename 161 ALL_ROLES_MAP.put(TkConstants.ROLE_TK_DEPT_ADMIN, "Time Department Admin"); 162 ALL_ROLES_MAP.put(TkConstants.ROLE_LV_DEPT_ADMIN, "Leave Department Admin"); // kpme1411 163 ALL_ROLES_MAP.put(TkConstants.ROLE_TK_SYS_ADMIN, "System Admin"); 164 165 } 166 167 public static final class ACTIONS { 168 public static final String CLOCK_IN = "clockIn"; 169 public static final String CLOCK_OUT = "clockOut"; 170 public static final String ADD_TIME_BLOCK = "addTimeBlock"; 171 public static final String UPDATE_TIME_BLOCK = "updateTimeBlock"; 172 public static final String DELETE_TIME_BLOCK = "deleteTimeBlock"; 173 } 174 175 public static final List<String> ClOCK_ACTIONS = new ArrayList<String>(); 176 177 static { 178 ClOCK_ACTIONS.add("CI"); 179 ClOCK_ACTIONS.add("CO"); 180 ClOCK_ACTIONS.add("LI"); // Coming back for Lunch 181 ClOCK_ACTIONS.add("LO"); // Leaving for Lunch 182 } 183 184 /** 185 * Simplistic state transition map, created statically for speed. 186 */ 187 public static final Map<String, Set<String>> CLOCK_ACTION_TRANSITION_MAP = new HashMap<String, Set<String>>(4); 188 189 static { 190 Set<String> ci = new HashSet<String>(); 191 ci.add(LUNCH_OUT); 192 ci.add(CLOCK_OUT); 193 194 Set<String> co = new HashSet<String>(); 195 co.add(CLOCK_IN); 196 197 Set<String> li = new HashSet<String>(); 198 li.add(CLOCK_OUT); 199 200 Set<String> lo = new HashSet<String>(); 201 lo.add(LUNCH_IN); 202 203 CLOCK_ACTION_TRANSITION_MAP.put(CLOCK_IN, ci); 204 CLOCK_ACTION_TRANSITION_MAP.put(CLOCK_OUT, co); 205 CLOCK_ACTION_TRANSITION_MAP.put(LUNCH_IN, li); 206 CLOCK_ACTION_TRANSITION_MAP.put(LUNCH_OUT, lo); 207 } 208 209 // available Clock actions to choose from when user's modifying an existing Missed Punch Document based on 210 // the initial clock action 211 public static final Map<String, Set<String>> CLOCK_AVAILABLE_ACTION_MAP = new HashMap<String, Set<String>>(4); 212 213 static { 214 Set<String> ci = new HashSet<String>(); 215 ci.add(CLOCK_IN); 216 217 Set<String> co = new HashSet<String>(); 218 co.add(CLOCK_OUT); 219 co.add(LUNCH_OUT); 220 221 Set<String> li = new HashSet<String>(); 222 li.add(LUNCH_IN); 223 224 Set<String> lo = new HashSet<String>(); 225 lo.add(CLOCK_OUT); 226 lo.add(LUNCH_OUT); 227 228 CLOCK_AVAILABLE_ACTION_MAP.put(CLOCK_IN, ci); 229 CLOCK_AVAILABLE_ACTION_MAP.put(CLOCK_OUT, co); 230 CLOCK_AVAILABLE_ACTION_MAP.put(LUNCH_IN, li); 231 CLOCK_AVAILABLE_ACTION_MAP.put(LUNCH_OUT, lo); 232 } 233 234 public static final Map<String, String> CLOCK_ACTION_STRINGS = new HashMap<String, String>(4); 235 236 static { 237 CLOCK_ACTION_STRINGS.put(CLOCK_IN, "Clock In"); 238 CLOCK_ACTION_STRINGS.put(CLOCK_OUT, "Clock Out"); 239 CLOCK_ACTION_STRINGS.put(LUNCH_IN, "Lunch In"); // Coming back for Lunch 240 CLOCK_ACTION_STRINGS.put(LUNCH_OUT, "Lunch Out"); // Going to Lunch 241 } 242 243 public static final class DOCUMENT_ACTIONS { 244 public static final String ROUTE = "R"; 245 public static final String APPROVE = "A"; 246 public static final String DISAPPROVE = "D"; 247 } 248 249 public static final class BATCH_JOB_ACTIONS { 250 public static final String BATCH_JOB_INITIATE = "BI"; 251 public static final String BATCH_JOB_ROUTE = "BR"; 252 public static final String BATCH_JOB_APPROVE = "BA"; 253 } 254 255 public static final class ROUTE_STATUS { 256 public static final String INITIATED = DocumentStatus.INITIATED.getCode(); 257 public static final String ENROUTE = DocumentStatus.ENROUTE.getCode(); 258 public static final String FINAL = DocumentStatus.FINAL.getCode(); 259 public static final String CANCEL = DocumentStatus.CANCELED.getCode(); 260 public static final String SAVED = DocumentStatus.SAVED.getCode(); 261 public static final String DISAPPROVED = DocumentStatus.DISAPPROVED.getCode(); 262 public static final String EXCEPTION = DocumentStatus.EXCEPTION.getCode(); 263 } 264 265 public static final Map<String, String> DOC_ROUTE_STATUS = new HashMap<String, String>(8); 266 267 static { 268 DOC_ROUTE_STATUS.put(KewApiConstants.ROUTE_HEADER_INITIATED_CD, KewApiConstants.ROUTE_HEADER_INITIATED_LABEL); 269 DOC_ROUTE_STATUS.put(KewApiConstants.ROUTE_HEADER_CANCEL_CD, KewApiConstants.ROUTE_HEADER_CANCEL_LABEL); 270 DOC_ROUTE_STATUS.put(KewApiConstants.ROUTE_HEADER_ENROUTE_CD, KewApiConstants.ROUTE_HEADER_ENROUTE_LABEL); 271 DOC_ROUTE_STATUS.put(KewApiConstants.ROUTE_HEADER_FINAL_CD, KewApiConstants.ROUTE_HEADER_FINAL_LABEL); 272 DOC_ROUTE_STATUS.put(KewApiConstants.ROUTE_HEADER_DISAPPROVED_CD, KewApiConstants.ROUTE_HEADER_DISAPPROVED_LABEL); 273 DOC_ROUTE_STATUS.put(KewApiConstants.ROUTE_HEADER_EXCEPTION_CD, KewApiConstants.ROUTE_HEADER_EXCEPTION_LABEL); 274 DOC_ROUTE_STATUS.put(KewApiConstants.ROUTE_HEADER_SAVED_CD, KewApiConstants.ROUTE_HEADER_SAVED_LABEL); 275 } 276 277 public static final class BATCH_JOB_NAMES { 278 public static final String INITIATE = "Initiate"; 279 public static final String END_PAY_PERIOD = "End Pay Period"; 280 public static final String END_REPORTING_PERIOD = "End Reporting Period"; 281 public static final String EMPLOYEE_APPROVAL = "Employee Approval"; 282 public static final String MISSED_PUNCH_APPROVAL = "Missed Punch Approval"; 283 public static final String SUPERVISOR_APPROVAL = "Supervisor Approval"; 284 } 285 286 public static final String ASSIGNMENT_KEY_DELIMITER = "_"; 287 public static final String HOLIDAY_EARN_CODE = "HOL"; 288 // Special System earn code to represent lunch deductions. 289 public static final String LUNCH_EARN_CODE = "LUN"; 290 291 // calendar navigation 292 public static final String NEXT_TIMESHEET = "next"; 293 public static final String PREV_TIMESHEET = "prev"; 294 295 // Timesheet document ID request parameter name 296 public static final String TIMESHEET_DOCUMENT_ID_REQUEST_NAME = "tdocid"; 297 // document ID request parameter name 298 public static final String DOCUMENT_ID_REQUEST_NAME = "docid"; 299 //Threshold in hours for clockin highlighting on approvers tab 300 public static final Integer NUMBER_OF_HOURS_CLOCKED_IN_APPROVE_TAB_HIGHLIGHT = 12; 301 302 public static final List<String> TIME_ZONES = new ArrayList<String>(); 303 304 static { 305 TIME_ZONES.add("America/Chicago"); 306 TIME_ZONES.add("America/Denver"); 307 TIME_ZONES.add("America/Detroit"); 308 TIME_ZONES.add("America/Indiana/Indianapolis"); 309 TIME_ZONES.add("America/Phoenix"); 310 } 311 312 public String getLUNCH_EARN_CODE() { 313 return LUNCH_EARN_CODE; 314 } 315 316 public String getEARN_CODE_AMOUNT() { 317 return EARN_CODE_AMOUNT; 318 } 319 320 public String getHOLIDAY_EARN_CODE() { 321 return HOLIDAY_EARN_CODE; 322 } 323 324 public static final Map<String, String> DOCUMENT_STATUS = new HashMap<String, String>(); 325 326 static { 327 DOCUMENT_STATUS.put("I", "Initiated"); 328 DOCUMENT_STATUS.put("S", "Saved"); 329 DOCUMENT_STATUS.put("R", "Enroute"); 330 DOCUMENT_STATUS.put("F", "Final"); 331 } 332 333 public static class ConfigSettings { 334 public static final String SESSION_TIMEOUT = "session.timeout"; 335 public static final String KPME_SYSTEM_TIMEZONE = "kpme.system.timezone"; 336 } 337 338 public static final Integer PAGE_SIZE = 20; 339 public static final String APPROVAL_TABLE_ID = "row"; 340 341 public static final String IP_SEPERATOR = "."; 342 public static final String IP_WILDCARD_PATTERN = "(%|(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))"; 343 344 public static final String TASK_DEFAULT_DESP = "Default"; 345 346 public static final Map<String, String> SERVICE_UNIT_OF_TIME = new LinkedHashMap<String, String>(3); 347 348 static { 349 SERVICE_UNIT_OF_TIME.put("Y", "Years"); 350 SERVICE_UNIT_OF_TIME.put("M", "Months"); 351 //SERVICE_UNIT_OF_TIME.put("H", "Hours"); 352 } 353 354 public static final Map<String, String> UNIT_OF_TIME = new LinkedHashMap<String, String>(2); 355 356 static { 357 UNIT_OF_TIME.put("D", "Days"); 358 UNIT_OF_TIME.put("H", "Hours"); 359 } 360 361 public static final Map<String, String> MAX_BAL_FLAG = new LinkedHashMap<String, String>(2); 362 363 static { 364 MAX_BAL_FLAG.put("Y", "Yes"); 365 MAX_BAL_FLAG.put("N", "No"); 366 } 367 368 public static final Map<String, String> MAX_BALANCE_ACTION_FREQUENCY = new LinkedHashMap<String, String>(3); 369 370 static { 371 MAX_BALANCE_ACTION_FREQUENCY.put("LA", "Leave Approve"); 372 MAX_BALANCE_ACTION_FREQUENCY.put("YE", "Year End"); 373 MAX_BALANCE_ACTION_FREQUENCY.put("OD", "On Demand"); 374 //MAX_BALANCE_ACTION_FREQUENCY.put("NA", "Not Applicable"); 375 } 376 377 public static final Map<String, String> ACTION_AT_MAX_BALANCE = new LinkedHashMap<String, String>(3); 378 379 static { 380 ACTION_AT_MAX_BALANCE.put("T", "Transfer"); 381 ACTION_AT_MAX_BALANCE.put("P", "Payout"); 382 ACTION_AT_MAX_BALANCE.put("L", "Lose"); 383 //ACTION_AT_MAX_BALANCE.put("NA", "Not Applicable"); 384 } 385 386 public static final Map<String, String> EMPLOYEE_OVERRIDE_TYPE = new LinkedHashMap<String, String>(5); 387 388 static { 389 EMPLOYEE_OVERRIDE_TYPE.put("MB", "Max Balance"); 390 EMPLOYEE_OVERRIDE_TYPE.put("MTA", "Max Transfer Amount"); 391 EMPLOYEE_OVERRIDE_TYPE.put("MPA", "Max Payout Amount"); 392 EMPLOYEE_OVERRIDE_TYPE.put("MU", "Max Usage"); 393 EMPLOYEE_OVERRIDE_TYPE.put("MAC", "Max Annual Carryover"); 394 } 395 396 public static final String DAILY_OVT_CODE = "DOT"; 397 398 public static final Map<String, Set<String>> CLASS_INQUIRY_KEY_MAP = new HashMap<String, Set<String>>(4); 399 400 static { 401 Set<String> keys = new HashSet<String>(); 402 keys.add("leavePlan"); 403 keys.add("effectiveDate"); 404 CLASS_INQUIRY_KEY_MAP.put(LeavePlan.class.getName(), keys); 405 406 keys = new HashSet<String>(); 407 keys.add("accrualCategory"); 408 keys.add("effectiveDate"); 409 CLASS_INQUIRY_KEY_MAP.put(AccrualCategory.class.getName(), keys); 410 411 keys = new HashSet<String>(); 412 keys.add("earnCode"); 413 keys.add("effectiveDate"); 414 CLASS_INQUIRY_KEY_MAP.put(EarnCode.class.getName(), keys); 415 } 416 417 public static final String FLSA_STATUS_NON_EXEMPT ="NE"; 418 public static final String FLSA_STATUS_EXEMPT ="E"; 419 420 public static final String PAY_CALENDAR_TYPE = "payCalendar"; 421 422 // Calendar Types 423 public static final String CALENDAR_TYPE_PAY = "Pay"; 424 public static final String CALENDAR_TYPE_LEAVE = "Leave"; 425 426 public static final String BATCH_USER_PRINCIPAL_NAME = "kpme.batch.user.principalName"; 427 }