View Javadoc
1   /**
2    * Copyright 2004-2014 The Kuali Foundation
3    *
4    * Licensed under the Educational Community License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    * http://www.opensource.org/licenses/ecl2.php
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  package org.kuali.kpme.core.service.permission;
17  
18  import java.util.ArrayList;
19  import java.util.HashMap;
20  import java.util.List;
21  import java.util.Map;
22  
23  import org.joda.time.DateTime;
24  import org.joda.time.LocalDate;
25  import org.kuali.kpme.core.KPMENamespace;
26  import org.kuali.kpme.core.assignment.Assignment;
27  import org.kuali.kpme.core.block.CalendarBlockPermissions;
28  import org.kuali.kpme.core.document.calendar.CalendarDocument;
29  import org.kuali.kpme.core.principal.PrincipalHRAttributes;
30  import org.kuali.kpme.core.service.HrServiceLocator;
31  import org.kuali.kpme.core.util.HrConstants;
32  import org.kuali.kpme.core.util.HrContext;
33  import org.kuali.rice.kew.api.KewApiServiceLocator;
34  import org.kuali.rice.kew.api.action.ActionType;
35  import org.kuali.rice.kew.api.action.ValidActions;
36  import org.kuali.rice.kew.api.document.DocumentStatus;
37  import org.kuali.rice.kim.api.KimConstants;
38  import org.kuali.rice.krad.util.KRADConstants;
39  
40  public class HRPermissionServiceImpl extends HrPermissionServiceBase implements HRPermissionService {
41  	
42  	@Override
43  	public boolean isAuthorized(String principalId, String permissionName, DateTime asOfDate) {
44  		Map<String, String> qualification = new HashMap<String, String>();
45  		
46  		return isAuthorized(principalId, permissionName, qualification, asOfDate);
47  	}
48  	
49  	@Override
50  	public boolean isAuthorized(String principalId, String permissionName, Map<String, String> qualification, DateTime asOfDate) {
51  		return getPermissionService().isAuthorized(principalId, KPMENamespace.KPME_HR.getNamespaceCode(), permissionName, qualification);
52  	}
53  	
54      @Override
55  	public boolean isAuthorizedByTemplate(String principalId, String namespaceCode, String permissionTemplateName, Map<String, String> permissionDetails, DateTime asOfDate) {
56  		Map<String, String> qualification = new HashMap<String, String>();
57  		
58  		return isAuthorizedByTemplate(principalId, namespaceCode, permissionTemplateName, permissionDetails, qualification, asOfDate);
59  	}
60  	
61      @Override
62  	public boolean isAuthorizedByTemplate(String principalId, String namespaceCode, String permissionTemplateName, Map<String, String> permissionDetails, Map<String, String> qualification, DateTime asOfDate) {
63  		return getPermissionService().isAuthorizedByTemplate(principalId, namespaceCode, permissionTemplateName, permissionDetails, qualification);
64  	}
65  	
66      @Override
67      public boolean canApproveCalendarDocument(String principalId, CalendarDocument calendarDocument) {
68      	boolean canApproveLeaveCalendar = false;
69      	
70      	ValidActions validActions = KewApiServiceLocator.getWorkflowDocumentActionsService().determineValidActions(calendarDocument.getDocumentId(), principalId);
71      	
72      	if (validActions.getValidActions() != null) {
73      		canApproveLeaveCalendar = validActions.getValidActions().contains(ActionType.APPROVE);
74      	}
75      	
76      	return canApproveLeaveCalendar;
77      }
78  	
79      @Override
80      public boolean canViewCalendarDocument(String principalId, CalendarDocument calendarDocument) {
81      	return canSuperUserAdministerCalendarDocument(principalId, calendarDocument) 
82      			|| isAuthorizedByTemplate(principalId, KRADConstants.KNS_NAMESPACE, KimConstants.PermissionTemplateNames.OPEN_DOCUMENT, calendarDocument);
83      }
84      
85      @Override
86      public boolean canViewCalendarDocumentAssignment(String principalId, CalendarDocument calendarDocument, Assignment assignment) {
87      	return canSuperUserAdministerCalendarDocument(principalId, calendarDocument)
88      			|| isAuthorizedByTemplate(principalId, KRADConstants.KNS_NAMESPACE, KimConstants.PermissionTemplateNames.OPEN_DOCUMENT, calendarDocument, assignment);
89      }
90      
91      @Override
92      public boolean canEditCalendarDocument(String principalId, CalendarDocument calendarDocument) {
93      	return canSuperUserAdministerCalendarDocument(principalId, calendarDocument) 
94      			|| isAuthorizedByTemplate(principalId, KRADConstants.KNS_NAMESPACE, KimConstants.PermissionTemplateNames.EDIT_DOCUMENT, calendarDocument);
95      }
96      
97      @Override
98      public boolean canEditCalendarDocumentAssignment(String principalId, CalendarDocument calendarDocument, Assignment assignment) {
99      	return canSuperUserAdministerCalendarDocument(principalId, calendarDocument)
100     			|| isAuthorizedByTemplate(principalId, KRADConstants.KNS_NAMESPACE, KimConstants.PermissionTemplateNames.EDIT_DOCUMENT, calendarDocument, assignment);
101     }
102     
103     @Override
104     public boolean canSubmitCalendarDocument(String principalId, CalendarDocument calendarDocument) {
105         return canSuperUserAdministerCalendarDocument(principalId, calendarDocument) 
106         		|| isAuthorizedByTemplate(principalId, KRADConstants.KUALI_RICE_WORKFLOW_NAMESPACE, KimConstants.PermissionTemplateNames.ROUTE_DOCUMENT, calendarDocument);
107     }
108     
109     @Override
110     public boolean canSuperUserAdministerCalendarDocument(String principalId, CalendarDocument calendarDocument) {
111         return isAuthorizedByTemplate(principalId, KRADConstants.KUALI_RICE_WORKFLOW_NAMESPACE, "Administer Routing for Document", calendarDocument);
112     }
113     
114     private boolean isAuthorizedByTemplate(String principalId, String namespaceCode, String permissionTemplateName, CalendarDocument calendarDocument) {
115     	boolean isAuthorizedByTemplate = false;
116 
117     	if (calendarDocument != null) {
118     		String documentTypeName = calendarDocument.getCalendarType();
119         	DocumentStatus documentStatus = DocumentStatus.fromCode(calendarDocument.getDocumentHeader().getDocumentStatus());
120             List<Assignment> assignments = new ArrayList<Assignment>();
121             if (permissionTemplateName.equals(KimConstants.PermissionTemplateNames.EDIT_DOCUMENT)
122                     || permissionTemplateName.equals(KimConstants.PermissionTemplateNames.ROUTE_DOCUMENT)) {
123                 //only allows routing/editing of timesheets with active assignments in the pay period
124                 LocalDate startDate = calendarDocument.getCalendarEntry().getBeginPeriodFullDateTime().toLocalDate();
125                 LocalDate endDate = calendarDocument.getCalendarEntry().getEndPeriodFullDateTime().toLocalDate();
126                 List<Assignment> assignmentsActiveInCalendarEntry= HrServiceLocator.getAssignmentService().getRecentAssignments(calendarDocument.getPrincipalId(),startDate,endDate);
127                 for (Assignment assignment : calendarDocument.getAssignments()) {
128                     if (assignmentsActiveInCalendarEntry.contains(assignment)) {
129                         assignments.add(assignment);
130                     }
131                 }
132             } else {
133                 assignments.addAll(calendarDocument.getAssignments());
134             }
135         	
136         	isAuthorizedByTemplate = isAuthorizedByTemplate(principalId, namespaceCode, permissionTemplateName, documentTypeName, calendarDocument.getDocumentId(), documentStatus, assignments, calendarDocument.getCalendarEntry().getEndPeriodFullDateTime());
137     	}
138     	
139     	return isAuthorizedByTemplate;
140     }
141     
142     private boolean isAuthorizedByTemplate(String principalId, String namespaceCode, String permissionTemplateName, CalendarDocument calendarDocument, Assignment assignment) {
143     	boolean isAuthorizedByTemplate = false;
144 
145     	if (calendarDocument != null) {
146     		String documentTypeName = calendarDocument.getCalendarType();
147         	DocumentStatus documentStatus = DocumentStatus.fromCode(calendarDocument.getDocumentHeader().getDocumentStatus());
148         	
149         	isAuthorizedByTemplate = isAuthorizedByTemplate(principalId, namespaceCode, permissionTemplateName, documentTypeName, calendarDocument.getDocumentId(), documentStatus, assignment, calendarDocument.getCalendarEntry().getEndPeriodFullDateTime());
150     	}
151     	
152     	return isAuthorizedByTemplate;
153     }
154 
155     @Override
156     public boolean canViewTimeTabs() {
157     	boolean canViewTimeTabs = false;
158     	LocalDate asOfDate = LocalDate.now();
159     	String flsaStatus = HrConstants.FLSA_STATUS_NON_EXEMPT;
160     	// find active assignments as of currentDate
161     	String principalId = HrContext.getTargetPrincipalId();
162     	if(isActiveAssignmentFoundOnJobFlsaStatus(principalId, flsaStatus, false)) {
163     		//find timecalendar defined
164     		canViewTimeTabs = isCalendarDefined("payCalendar", principalId, asOfDate, false);
165     	}
166     	return canViewTimeTabs;
167     }
168     
169     private boolean isActiveAssignmentFoundOnJobFlsaStatus(String principalId, String flsaStatus, boolean chkForLeaveEligible) {
170     	boolean isActiveAssFound = false;
171     	LocalDate asOfDate = LocalDate.now();
172      	List<Assignment> activeAssignments = HrServiceLocator.getAssignmentService().getAssignments(principalId, asOfDate);
173      	if(activeAssignments != null && !activeAssignments.isEmpty()) {
174      		for(Assignment assignment : activeAssignments) {
175      			if(assignment != null && assignment.getJob() != null && assignment.getJob().getFlsaStatus() != null && assignment.getJob().getFlsaStatus().equalsIgnoreCase(flsaStatus)) {
176      				if(chkForLeaveEligible) {
177      					isActiveAssFound = assignment.getJob().isEligibleForLeave();
178      					if(!isActiveAssFound){
179      						continue;
180      					}
181      				}
182      				isActiveAssFound = true;
183      				break;
184      			}  
185      		}
186      	}
187     	return isActiveAssFound;
188     }
189     
190     private boolean isCalendarDefined(String calendarType, String principalId, LocalDate asOfDate, boolean chkForLeavePlan){
191     	boolean calDefined = false;
192     	PrincipalHRAttributes principalHRAttributes = HrServiceLocator.getPrincipalHRAttributeService().getPrincipalCalendar(principalId, asOfDate);
193     	if(principalHRAttributes != null) {
194     		if(calendarType.equalsIgnoreCase("payCalendar")) {
195     			calDefined = principalHRAttributes.getPayCalendar() != null ? true : false;
196     		} else if(calendarType.equalsIgnoreCase("leaveCalendar")) {
197     			calDefined = principalHRAttributes.getLeaveCalendar() != null ? true : false;
198     			if(calDefined && chkForLeavePlan) {
199     				calDefined = principalHRAttributes.getLeavePlan() != null ? true : false;
200     			}
201     		} 
202     	}
203     	return calDefined;
204     }
205     
206 
207     
208     @Override
209     public boolean canViewLeaveTabsWithEStatus() {
210     	boolean canViewLeaveTabs = false;
211     	String principalId = HrContext.getTargetPrincipalId();
212     	LocalDate asOfDate = LocalDate.now();
213     	boolean leaveCalNPlanDefined = isCalendarDefined("leaveCalendar", principalId, asOfDate, true);
214     	String flsaStatus = HrConstants.FLSA_STATUS_EXEMPT;
215     	boolean activeAss = isActiveAssignmentFoundOnJobFlsaStatus(principalId, flsaStatus, true);
216     	canViewLeaveTabs = activeAss && leaveCalNPlanDefined;
217     	return canViewLeaveTabs;
218     }
219     
220     @Override
221     public boolean canViewLeaveTabsWithNEStatus() {
222     	boolean canViewLeaveTabs = false;
223     	LocalDate asOfDate = LocalDate.now();
224     	String flsaStatus = HrConstants.FLSA_STATUS_NON_EXEMPT;
225     	// find active assignments as of currentDate
226     	String principalId = HrContext.getTargetPrincipalId();
227     	boolean activeAss = isActiveAssignmentFoundOnJobFlsaStatus(principalId, flsaStatus, true);
228     	// chk leave plan defined
229     	boolean leaveCalNPlanDefined = isCalendarDefined("leaveCalendar", principalId, asOfDate, true);
230     	boolean timeCalDefined = isCalendarDefined("payCalendar", principalId, asOfDate, false);
231     	canViewLeaveTabs = activeAss && leaveCalNPlanDefined && timeCalDefined;
232     	return canViewLeaveTabs;
233     }
234 
235     @Override
236     public CalendarBlockPermissions getTimeBlockPermissions(String blockId) {
237         return new CalendarBlockPermissions(blockId);
238     }
239 
240     @Override
241     public CalendarBlockPermissions updateTimeBlockPermissions(CalendarBlockPermissions calendarBlockPermissions) {
242         return calendarBlockPermissions;
243     }
244 
245     @Override
246     public CalendarBlockPermissions getLeaveBlockPermissions(String blockId) {
247         return new CalendarBlockPermissions(blockId);
248     }
249 
250     @Override
251     public CalendarBlockPermissions updateLeaveBlockPermissions(CalendarBlockPermissions calendarBlockPermissions) {
252         return calendarBlockPermissions;
253     }
254 	
255 }