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.leavecode.service;
017
018 import com.google.common.collect.Ordering;
019 import org.apache.commons.lang.StringUtils;
020 import org.apache.log4j.Logger;
021 import org.kuali.hr.lm.LMConstants;
022 import org.kuali.hr.lm.leavecode.LeaveCode;
023 import org.kuali.hr.lm.leavecode.dao.LeaveCodeDao;
024 import org.kuali.hr.time.principal.PrincipalHRAttributes;
025 import org.kuali.hr.time.roles.TkUserRoles;
026 import org.kuali.hr.time.service.base.TkServiceLocator;
027 import org.kuali.hr.time.util.TKContext;
028 import org.kuali.hr.time.util.TKUser;
029 import org.kuali.hr.time.util.TKUtils;
030 import org.kuali.rice.krad.util.GlobalVariables;
031
032 import java.math.BigDecimal;
033 import java.sql.Date;
034 import java.util.*;
035
036 public class LeaveCodeServiceImpl implements LeaveCodeService {
037
038 private static final Logger LOG = Logger
039 .getLogger(LeaveCodeServiceImpl.class);
040 private LeaveCodeDao leaveCodeDao;
041
042 public LeaveCodeDao getLeaveCodeDao() {
043 return leaveCodeDao;
044 }
045
046 public void setLeaveCodeDao(LeaveCodeDao leaveCodeDao) {
047 this.leaveCodeDao = leaveCodeDao;
048 }
049
050 @Override
051 public LeaveCode getLeaveCode(String lmLeaveCodeId) {
052 return getLeaveCodeDao().getLeaveCode(lmLeaveCodeId);
053 }
054
055 @Override
056 public List<LeaveCode> getLeaveCodes(String principalId, Date asOfDate) {
057 String leavePlan = null;
058 List<LeaveCode> leaveCodes = new ArrayList<LeaveCode>();
059 PrincipalHRAttributes hrAttribute = TkServiceLocator.getPrincipalHRAttributeService().getPrincipalCalendar(principalId, asOfDate);
060 if(hrAttribute != null) {
061 leavePlan = hrAttribute.getLeavePlan();
062 if (StringUtils.isBlank(leavePlan)) {
063 throw new RuntimeException("No leave plan defined for " + principalId + " in principal hr attributes");
064 }
065
066 List<LeaveCode> unfilteredLeaveCodes = leaveCodeDao.getLeaveCodes(leavePlan, asOfDate);
067 TKUser user = TKContext.getUser();
068
069 for (LeaveCode leaveCode : unfilteredLeaveCodes) {
070 //if employee add this leave code
071 //TODO how do we know this is an approver for them
072 if ((leaveCode.getEmployee() && TkUserRoles.getUserRoles(GlobalVariables.getUserSession().getPrincipalId()).isActiveEmployee()) ||
073 (leaveCode.getApprover() && user.isApprover())) {
074 leaveCodes.add(leaveCode);
075 }
076 }
077
078 }
079
080 return leaveCodes;
081 }
082
083 @Override
084 public Map<String, String> getLeaveCodesForDisplay(String principalId) {
085 List<LeaveCode> leaveCodes = getLeaveCodes(principalId,
086 TKUtils.getCurrentDate());
087
088 // KPME1449, chen, only display leaveCodes which are 'allow_scheduled_leave flag = Y'
089 for (LeaveCode leaveCode : leaveCodes) {
090 if ( !leaveCode.getAllowScheduledLeave().equalsIgnoreCase("Y")) {
091 leaveCodes.remove(leaveCode);
092 }
093 } // kpme1449
094
095 Comparator<LeaveCode> leaveCodeComparator = new Comparator<LeaveCode>() {
096 @Override
097 public int compare(LeaveCode leaveCode, LeaveCode leaveCode1) {
098 return leaveCode.getLeaveCode().compareToIgnoreCase(
099 leaveCode1.getLeaveCode());
100 }
101 };
102 // Order by leaveCode ascending
103 Ordering<LeaveCode> ordering = Ordering.from(leaveCodeComparator);
104
105 Map<String, String> leaveCodesForDisplay = new LinkedHashMap<String, String>();
106 for (LeaveCode leaveCode : ordering.sortedCopy(leaveCodes)) {
107 leaveCodesForDisplay.put(leaveCode.getLeaveCodeKeyForDisplay(),
108 leaveCode.getLeaveCodeValueForDisplay());
109 }
110
111 return leaveCodesForDisplay;
112 }
113
114 @Override
115 public LeaveCode getLeaveCode(String leaveCode, Date effectiveDate) {
116 return leaveCodeDao.getLeaveCode(leaveCode, effectiveDate);
117 }
118
119 @Override
120 public BigDecimal roundHrsWithLeaveCode(BigDecimal hours, LeaveCode leaveCode) {
121 String roundOption = LMConstants.ROUND_OPTION_MAP.get(leaveCode.getRoundingOption());
122 BigDecimal fractScale = new BigDecimal(leaveCode.getFractionalTimeAllowed());
123 if(roundOption == null) {
124 throw new RuntimeException("Rounding option of Leave Code " + leaveCode.getLeaveCode() + " is not recognized.");
125 }
126 BigDecimal roundedHours = hours;
127 if(roundOption.equals("Traditional")) {
128 roundedHours = hours.setScale(fractScale.scale(), BigDecimal.ROUND_HALF_EVEN);
129 } else if(roundOption.equals("Truncate")) {
130 roundedHours = hours.setScale(fractScale.scale(), BigDecimal.ROUND_DOWN);
131 }
132 return roundedHours;
133 }
134 }