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.util.ArrayList;
019 import java.util.HashSet;
020 import java.util.List;
021 import java.util.Set;
022 import java.util.SortedSet;
023 import java.util.TreeSet;
024
025 import org.kuali.hr.time.roles.TkUserRoles;
026 import org.kuali.hr.time.roles.UserRoles;
027 import org.kuali.hr.time.service.base.TkServiceLocator;
028 import org.kuali.hr.time.workarea.WorkArea;
029 import org.kuali.rice.kim.api.identity.Person;
030 import org.kuali.rice.kim.api.services.KimApiServiceLocator;
031 import org.kuali.rice.krad.util.GlobalVariables;
032
033 import com.google.common.collect.Multimap;
034
035 /**
036 * This class houses the concept of a user in the Timekeeping system. It
037 * is essentially a lightweight wrapper around multiple KIM Person objects.
038 *
039 * One for the actual ACTUAL person
040 *
041 * One for the user the ACTUAL person is backdooring as: Back Door user is like
042 * doing 'su - <username>' in unix. You "become" that person, assume all of their
043 * roles, etc.
044 *
045 * One for the user the ACTUAL person is targeting: Targeting a user is being
046 * granted read/write access to the users data.
047 *
048 * See Javadocs for:
049 *
050 * getCurrentTargetPerson(), getCurrentPerson(), getActualPerson(),
051 * getBackdoorPerson(), getTargetPerson().
052 *
053 * the getCurrent*() methods are most likely what you should be using in any
054 * end user display logic. The methods get[ABT]*() can return null.
055 *
056 */
057 public class TKUser {
058
059 public static void setTargetPerson(String principalId) {
060 GlobalVariables.getUserSession().addObject(TkConstants.TK_TARGET_USER_PERSON, principalId);
061 }
062
063 public static boolean isTargetInUse() {
064 return GlobalVariables.getUserSession().retrieveObject(TkConstants.TK_TARGET_USER_PERSON) != null;
065 }
066
067 public static void clearTargetUser() {
068 GlobalVariables.getUserSession().removeObject(TkConstants.TK_TARGET_USER_PERSON);
069 }
070
071 /**
072 * Returns a principal id for the target person if present, otherwise
073 * the backdoor, and finally the actual.
074 *
075 * @return A principalId: target > backdoor > actual.
076 */
077 public static String getCurrentTargetPersonId() {
078 String p = (String) GlobalVariables.getUserSession().retrieveObject(TkConstants.TK_TARGET_USER_PERSON);
079 if (p == null) {
080 p = GlobalVariables.getUserSession().getPerson().getPrincipalId();
081 }
082 return p;
083 }
084
085 /**
086 * Returns a Person object for the target person if present, otherwise
087 * the backdoor, and finally the actual.
088 *
089 * @return A Person object: target > backdoor > actual.
090 */
091 public static Person getCurrentTargetPerson() {
092 Person p;
093 String principalId = (String) GlobalVariables.getUserSession().retrieveObject(TkConstants.TK_TARGET_USER_PERSON);
094 if (principalId == null) {
095 p = GlobalVariables.getUserSession().getPerson();
096 } else {
097 p = KimApiServiceLocator.getPersonService().getPerson(principalId);
098 }
099 return p;
100 }
101
102 /**
103 * Returns a UserRoles object for the target person if present, otherwise
104 * the backdoor, and finally the actual.
105 *
106 * @return A UserRoles object: target > backdoor > actual.
107 */
108 public static UserRoles getCurrentTargetRoles() {
109 return TkUserRoles.getUserRoles(getCurrentTargetPersonId());
110 }
111
112 //public static TKUser getUser(String targetUserId, Date asOfDate) {
113 // TKUser.setTargetPerson(targetUserId);
114 //
115 // return new TKUser();
116 //}
117
118 public static boolean isSystemAdmin() {
119 return TkUserRoles.getUserRoles(GlobalVariables.getUserSession().getPrincipalId()).isSystemAdmin();
120 }
121
122 public static boolean isLocationAdmin() {
123 return TKUser.getLocationAdminAreas().size() > 0;
124 }
125
126 public static boolean isDepartmentAdmin() {
127 return TKUser.getDepartmentAdminAreas().size() > 0;
128 }
129
130 public static boolean isGlobalViewOnly() {
131 return TkUserRoles.getUserRoles(GlobalVariables.getUserSession().getPrincipalId()).isGlobalViewOnly();
132 }
133
134 public static boolean isDeptViewOnly() {
135 return TkUserRoles.getUserRoles(GlobalVariables.getUserSession().getPrincipalId()).isDeptViewOnly();
136 }
137
138 public static boolean isActiveEmployee() {
139 return TkUserRoles.getUserRoles(GlobalVariables.getUserSession().getPrincipalId()).isActiveEmployee();
140 }
141
142 public static boolean isSynchronous() {
143 return TkUserRoles.getUserRoles(GlobalVariables.getUserSession().getPrincipalId()).isSynchronous();
144 }
145
146 public static boolean isReviewer() {
147 return TkUserRoles.getUserRoles(GlobalVariables.getUserSession().getPrincipalId()).isReviewer();
148 }
149
150 public static boolean isApprover() {
151 return TkUserRoles.getUserRoles(GlobalVariables.getUserSession().getPrincipalId()).isApprover();
152 }
153
154 public static boolean isTimesheetReviewer() {
155 return TkUserRoles.getUserRoles(GlobalVariables.getUserSession().getPrincipalId()).isTimesheetReviewer();
156 }
157
158 public static boolean isTimesheetApprover() {
159 return TkUserRoles.getUserRoles(GlobalVariables.getUserSession().getPrincipalId()).isTimesheetApprover();
160 }
161
162 public static boolean isAnyApproverActive() {
163 return TkUserRoles.getUserRoles(GlobalVariables.getUserSession().getPrincipalId()).isAnyApproverActive();
164 }
165
166 public static boolean isApproverForTimesheet(String docId) {
167 return TkUserRoles.getUserRoles(GlobalVariables.getUserSession().getPrincipalId()).isApproverForTimesheet(docId);
168 }
169
170 public static boolean isDocumentReadable(String documentId) {
171 return TkUserRoles.getUserRoles(GlobalVariables.getUserSession().getPrincipalId()).isDocumentReadable(documentId);
172 }
173
174 public static boolean isDocumentWritable(String documentId) {
175 return TkUserRoles.getUserRoles(GlobalVariables.getUserSession().getPrincipalId()).isDocumentWritable(documentId);
176 }
177
178 public static Multimap<String, Long> getReportingApprovalDepartments(){
179 UserRoles userRoles = TkUserRoles.getUserRoles(TKContext.getTargetPrincipalId());
180 Set<Long> workAreas = new HashSet<Long>();
181 workAreas.addAll(userRoles.getApproverWorkAreas());
182 workAreas.addAll(userRoles.getReviewerWorkAreas());
183 // see the comment in the getDeptWorkAreasByWorkAreas() for the explanation of Multimap
184 Multimap<String, Long> reportingApprovalDepartments = TkServiceLocator.getTimeApproveService().getDeptWorkAreasByWorkAreas(workAreas);
185
186 //KPME-1338
187 /*Set<String> depts = new HashSet<String>();
188 depts.addAll(userRoles.getDepartmentViewOnlyDepartments());
189 depts.addAll(userRoles.getOrgAdminDepartments());
190 if (depts.size() > 0) {
191 reportingApprovalDepartments.putAll(TkServiceLocator.getTimeApproveService().getDeptWorkAreasByDepts(depts));
192 }*/
193
194 return reportingApprovalDepartments;
195 }
196
197 public static Set<Long> getReportingWorkAreas(){
198 UserRoles userRoles = TkUserRoles.getUserRoles(GlobalVariables.getUserSession().getPrincipalId());
199 Set<Long> reportingWorkAreas = new HashSet<Long>();
200 List<String> depts = new ArrayList<String>();
201
202 reportingWorkAreas.addAll(userRoles.getApproverWorkAreas());
203 for(Long workArea : userRoles.getApproverWorkAreas()){
204 if(!reportingWorkAreas.contains(workArea)){
205 reportingWorkAreas.add(workArea);
206 }
207 }
208
209 for(Long workArea : userRoles.getReviewerWorkAreas()){
210 if(!reportingWorkAreas.contains(workArea)){
211 reportingWorkAreas.add(workArea);
212 }
213 }
214
215 reportingWorkAreas.addAll(userRoles.getReviewerWorkAreas());
216
217 depts.addAll(userRoles.getDepartmentViewOnlyDepartments());
218 depts.addAll(userRoles.getOrgAdminDepartments());
219
220 for(String dept : depts){
221 List<WorkArea> workAreas = TkServiceLocator.getWorkAreaService().getWorkAreas(dept, TKUtils.getCurrentDate());
222 for(WorkArea workArea : workAreas){
223 if(!reportingWorkAreas.contains(workArea.getWorkArea())){
224 reportingWorkAreas.add(workArea.getWorkArea());
225 }
226 }
227 }
228
229
230 return reportingWorkAreas;
231 }
232
233 public static Set<Long> getApproverWorkAreas() {
234 return TkUserRoles.getUserRoles(GlobalVariables.getUserSession().getPrincipalId()).getApproverWorkAreas();
235 }
236
237 public static Set<Long> getReviewerWorkAreas() {
238 return TkUserRoles.getUserRoles(GlobalVariables.getUserSession().getPrincipalId()).getReviewerWorkAreas();
239 }
240
241 public static Set<String> getLocationAdminAreas() {
242 return TkUserRoles.getUserRoles(GlobalVariables.getUserSession().getPrincipalId()).getOrgAdminCharts();
243 }
244
245 public static Set<String> getDepartmentAdminAreas() {
246 return TkUserRoles.getUserRoles(GlobalVariables.getUserSession().getPrincipalId()).getOrgAdminDepartments();
247 }
248
249 public static SortedSet<Long> getWorkAreasFromUserRoles() {
250 UserRoles userRoles = TkUserRoles.getUserRoles(GlobalVariables.getUserSession().getPrincipalId());
251 SortedSet<Long> workAreas = new TreeSet<Long>();
252 workAreas.addAll(userRoles.getApproverWorkAreas());
253 workAreas.addAll(userRoles.getReviewerWorkAreas());
254
255 if(userRoles.isDepartmentAdmin()){
256 Set<String> deptAdminDepts = userRoles.getOrgAdminDepartments();
257 for(String dept : deptAdminDepts){
258 List<WorkArea> was = TkServiceLocator.getWorkAreaService().getWorkAreas(dept, TKUtils.getCurrentDate());
259 for(WorkArea wa : was){
260 workAreas.add(wa.getWorkArea());
261 }
262 }
263 }
264
265 return workAreas;
266 }
267
268 }