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