1
2
3
4
5
6
7
8
9
10
11
12
13
14
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
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
161 String principalId = HrContext.getTargetPrincipalId();
162 if(isActiveAssignmentFoundOnJobFlsaStatus(principalId, flsaStatus, false)) {
163
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
226 String principalId = HrContext.getTargetPrincipalId();
227 boolean activeAss = isActiveAssignmentFoundOnJobFlsaStatus(principalId, flsaStatus, true);
228
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 }