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.clocklog.service;
017    
018    import java.util.ArrayList;
019    import java.util.Date;
020    import java.util.Iterator;
021    import java.util.List;
022    import java.util.Map;
023    
024    import org.apache.commons.lang.StringUtils;
025    import org.kuali.hr.job.Job;
026    import org.kuali.hr.time.clocklog.ClockLog;
027    import org.kuali.hr.time.department.Department;
028    import org.kuali.hr.time.missedpunch.MissedPunchDocument;
029    import org.kuali.hr.time.roles.TkRole;
030    import org.kuali.hr.time.service.base.TkServiceLocator;
031    import org.kuali.hr.time.util.TKContext;
032    import org.kuali.hr.time.util.TKUtils;
033    import org.kuali.hr.time.util.TkConstants;
034    import org.kuali.hr.time.workflow.TimesheetDocumentHeader;
035    import org.kuali.hr.time.workflow.service.TimesheetDocumentHeaderService;
036    import org.kuali.rice.kns.lookup.HtmlData;
037    import org.kuali.rice.kns.lookup.KualiLookupableHelperServiceImpl;
038    import org.kuali.rice.krad.bo.BusinessObject;
039    
040    public class ClockLogLookupableHelper extends KualiLookupableHelperServiceImpl {
041            /**
042             * 
043             */
044            private static final long serialVersionUID = 1L;
045    
046            @Override
047            public List<HtmlData> getCustomActionUrls(BusinessObject businessObject,
048                            List pkNames) {
049                    List<HtmlData> customActionUrls = super.getCustomActionUrls(
050                                    businessObject, pkNames);
051                    List<HtmlData> overrideUrls = new ArrayList<HtmlData>();
052                    
053                    //Add missed punch to the clock log if it has one
054                    ClockLog clockLog = (ClockLog)businessObject;
055                    MissedPunchDocument mpDoc = TkServiceLocator.getMissedPunchService().getMissedPunchByClockLogId(clockLog.getTkClockLogId());
056                    if(mpDoc != null){
057                            clockLog.setMissedPunchDocumentId(mpDoc.getDocumentNumber());
058                    }
059                    
060                    for(HtmlData actionUrl : customActionUrls){
061                            if(!StringUtils.equals(actionUrl.getMethodToCall(), "copy")){
062                                    overrideUrls.add(actionUrl);
063                            }
064                    }
065                    if (TKContext.getUser().isSystemAdmin() || TKContext.getUser().isGlobalViewOnly()) {
066                            clockLog = (ClockLog) businessObject;
067                            final String className = this.getBusinessObjectClass().getName();
068                            final String tkClockLogId = clockLog.getTkClockLogId();
069                            HtmlData htmlData = new HtmlData() {
070    
071                                    @Override
072                                    public String constructCompleteHtmlTag() {
073                                            return "<a target=\"_blank\" href=\"inquiry.do?businessObjectClassName="
074                                                            + className
075                                                            + "&methodToCall=start&tkClockLogId="
076                                                            + tkClockLogId + "\">view</a>";
077                                    }
078                            };
079                            overrideUrls.add(htmlData);
080                    } else if (overrideUrls.size() != 0) {
081                            overrideUrls.remove(0);
082                    }
083                    return overrideUrls;
084            }
085    
086            @Override
087            public List<? extends BusinessObject> getSearchResults(
088                            Map<String, String> fieldValues) {
089                    List<? extends BusinessObject> objectList = new ArrayList<BusinessObject>();
090                                    
091                    
092                    TimesheetDocumentHeaderService timesheetDocumentHeaderService = TkServiceLocator.getTimesheetDocumentHeaderService();
093                    
094                    // search if documentid is given for search critria.
095                    String documentId =fieldValues.get("documentId");
096                    if(documentId != null && StringUtils.isNotEmpty(documentId)) {
097                            fieldValues.remove("documentId");
098    
099                            TimesheetDocumentHeader timesheetDocumentHeader = timesheetDocumentHeaderService.getDocumentHeader(documentId);
100                            if(timesheetDocumentHeader == null) {
101                                    objectList = new ArrayList<BusinessObject>();
102                            } else {
103                                    String timesheetUserId = timesheetDocumentHeader.getPrincipalId();
104                                    Date beginDate =  timesheetDocumentHeader.getPayBeginDate();
105                                    Date endDate =  timesheetDocumentHeader.getPayEndDate();
106                                    objectList = super.getSearchResultsUnbounded(fieldValues);
107                                    Iterator itr = objectList.iterator();
108                                    while (itr.hasNext()) {
109                                            ClockLog cl = (ClockLog) itr.next();
110                                            cl.setDocumentId(timesheetUserId);
111                                            if(cl.getPrincipalId().equalsIgnoreCase(timesheetUserId)) {
112                                                    if(new Date(cl.getClockTimestamp().getTime()).compareTo(beginDate) >= 0 && new Date(cl.getClockTimestamp().getTime()).compareTo(endDate) <= 0) {
113                                                            continue;
114                                                    } else {
115                                                            itr.remove();
116                                                    }
117                                            } else {
118                                                    itr.remove();
119                                            }
120                                    }
121                            }
122                    } else {
123                            objectList = super.getSearchResults(fieldValues);
124                    }
125                    
126                    if (!objectList.isEmpty()) {
127                            Iterator itr = objectList.iterator();
128                            while (itr.hasNext()) {
129                                    ClockLog cl = (ClockLog) itr.next();
130                                    
131                                    // Set Document Id 
132                                    if(cl.getDocumentId() == null) {
133                                            TimesheetDocumentHeader tsdh = timesheetDocumentHeaderService.getDocumentHeaderForDate(cl.getPrincipalId(), cl.getClockTimestamp());
134                                            if(tsdh != null) {
135                                                    cl.setDocumentId(tsdh.getDocumentId());
136                                            }
137                                    }
138                                    
139                                    List<TkRole> tkRoles = TkServiceLocator.getTkRoleService()
140                                                    .getRoles(TKContext.getPrincipalId(),
141                                                                    TKUtils.getCurrentDate());
142                                    Job job = TkServiceLocator.getJobService().getJob(
143                                                    cl.getUserPrincipalId(), cl.getJobNumber(),
144                                                    TKUtils.getCurrentDate(), false);
145                                    boolean valid = false;
146                                    for (TkRole tkRole : tkRoles) {
147                                            if (StringUtils.equals(tkRole.getRoleName(),
148                                                            TkConstants.ROLE_TK_SYS_ADMIN)
149                                                            || (StringUtils.equals(tkRole.getRoleName(),
150                                                                            TkConstants.ROLE_TK_APPROVER) && cl
151                                                                            .getWorkArea().equals(tkRole.getWorkArea()))
152                                                            || (StringUtils.equals(tkRole.getRoleName(),
153                                                                            TkConstants.ROLE_TK_DEPT_ADMIN) && (job != null && (job
154                                                                            .getDept().equals(tkRole.getDepartment()))))) {
155                                                    valid = true;
156                                                    break;
157                                            }
158                                            if(StringUtils.equals(tkRole.getRoleName(), TkConstants.ROLE_TK_LOCATION_ADMIN) && job != null && tkRole.getLocationObj()!=null){
159                                                    List<Department> departments = TkServiceLocator.getDepartmentService().getDepartmentByLocation(tkRole.getLocationObj().getLocation());
160                                                    for(Department department : departments){
161                                                            if(StringUtils.equals(job.getDept(), department.getDept())){
162                                                                    valid = true;
163                                                                    break;
164                                                            }
165                                                    }
166                                                    if(valid){
167                                                            break;
168                                                    }
169                                            }
170                                    }
171                                    if (!valid) {
172                                            itr.remove();
173                                            continue;
174                                    }
175                            }
176                    }
177                    return objectList;
178            }
179            
180            
181    }