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.timeblock.service;
017    
018    import java.text.DateFormat;
019    import java.text.ParseException;
020    import java.text.SimpleDateFormat;
021    import java.util.ArrayList;
022    import java.util.Date;
023    import java.util.Iterator;
024    import java.util.List;
025    
026    import org.apache.commons.lang.StringUtils;
027    import org.kuali.hr.job.Job;
028    import org.kuali.hr.time.department.Department;
029    import org.kuali.hr.time.roles.TkRole;
030    import org.kuali.hr.time.service.base.TkServiceLocator;
031    import org.kuali.hr.time.timeblock.TimeBlock;
032    import org.kuali.hr.time.timeblock.TimeHourDetail;
033    import org.kuali.hr.time.util.TKContext;
034    import org.kuali.hr.time.util.TKUtils;
035    import org.kuali.hr.time.util.TkConstants;
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 TimeBlockLookupableHelperServiceImpl extends KualiLookupableHelperServiceImpl {
041    
042            /**
043             * 
044             */
045            private static final long serialVersionUID = 1L;
046            
047            static final String DOC_ID = "documentId";
048            static final String DOC_STATUS_ID = "timesheetDocumentHeader.documentStatus";
049            static final String BEGIN_DATE_ID = "beginDate";
050                    
051             @Override
052        public List<? extends BusinessObject> getSearchResults(java.util.Map<String, String> fieldValues) {
053             
054                     String docStatus = "", beginDateString="";
055    
056                     if(fieldValues.containsKey(DOC_STATUS_ID)){
057                                    docStatus = fieldValues.get(DOC_STATUS_ID);
058                                    fieldValues.remove(DOC_STATUS_ID);
059                            }
060                     if(fieldValues.containsKey(BEGIN_DATE_ID)){
061                                    beginDateString = fieldValues.get(BEGIN_DATE_ID);
062                                    fieldValues.remove(BEGIN_DATE_ID);
063                            }
064            
065            List<TimeBlock> objectList = (List<TimeBlock>) super.getSearchResults(fieldValues);
066          
067            if(!objectList.isEmpty()) {
068                    Iterator<? extends BusinessObject> itr = objectList.iterator();
069                            while(itr.hasNext()){
070                                    TimeBlock tb = (TimeBlock)itr.next();
071                                    List<TkRole> tkRoles = TkServiceLocator.getTkRoleService().getRoles(TKContext.getPrincipalId(), TKUtils.getCurrentDate());
072                                    Job job = TkServiceLocator.getJobService().getJob(tb.getUserPrincipalId(), tb.getJobNumber(), TKUtils.getCurrentDate(), false);
073                                    boolean valid = false;
074                                    for (TkRole tkRole : tkRoles) {
075                                            if (StringUtils.equals(tkRole.getRoleName(),
076                                                            TkConstants.ROLE_TK_SYS_ADMIN)
077                                                            || (StringUtils.equals(tkRole.getRoleName(), TkConstants.ROLE_TK_GLOBAL_VO))
078                                                            || (StringUtils.equals(tkRole.getRoleName(),
079                                                                            TkConstants.ROLE_TK_APPROVER) && tb
080                                                                            .getWorkArea().equals(tkRole.getWorkArea()))
081                                                            || (StringUtils.equals(tkRole.getRoleName(),
082                                                                            TkConstants.ROLE_TK_DEPT_ADMIN) && (job != null && (job
083                                                                            .getDept().equals(tkRole.getDepartment()))))) {
084                                                    valid = true;
085                                                    break;
086                                            }
087                                            if(StringUtils.equals(tkRole.getRoleName(), TkConstants.ROLE_TK_LOCATION_ADMIN) && job != null && tkRole.getLocationObj()!=null){
088                                                    List<Department> departments = TkServiceLocator.getDepartmentService().getDepartmentByLocation(tkRole.getLocationObj().getLocation());
089                                                    for(Department department : departments){
090                                                            if(StringUtils.equals(job.getDept(), department.getDept())){
091                                                                    valid = true;
092                                                                    break;
093                                                            }
094                                                    }
095                                                    if(valid){
096                                                            break;
097                                                    }
098                                            }
099                                    }
100                                    if (!valid) {
101                                            itr.remove();
102                                            continue;
103                                    }
104                                    if(StringUtils.isNotEmpty(docStatus)) {
105                                            if(tb.getTimesheetDocumentHeader() == null) {
106                                                    itr.remove();
107                                                    continue;
108                                            } else {
109                                                    if(tb.getTimesheetDocumentHeader().getDocumentStatus() != null) {
110                                                            if(!tb.getTimesheetDocumentHeader().getDocumentStatus().equals(docStatus)){
111                                                                    itr.remove();
112                                                                    continue;
113                                                            }
114                                                    } else {
115                                                            itr.remove();
116                                                            continue;
117                                                    }
118                                            }
119                                    }
120                                                                    
121                                    if(StringUtils.isNotEmpty(beginDateString)) {
122                                            if(tb.getBeginDate() != null) {
123                                                    if(!this.checkDate(tb, tb.getBeginDate(), beginDateString)) {
124                                                            itr.remove();
125                                                            continue;
126                                                    } 
127                                            } else {
128                                                    itr.remove();
129                                                    continue;
130                                            }
131                                    }                               
132                            }
133                            
134                            // Fetch list from time hour detail and convert it into TimeBlock
135                            if(!objectList.isEmpty()) {
136                                    List<TimeBlock> timeBlocks = new ArrayList<TimeBlock>(objectList);
137                                    for(TimeBlock tb: timeBlocks) {
138                                            List<TimeHourDetail> timeHourDetails = tb.getTimeHourDetails();
139                                            for(TimeHourDetail thd : timeHourDetails) {
140                                              if(!thd.getEarnCode().equalsIgnoreCase(tb.getEarnCode())) {
141                                                      TimeBlock timeBlock = new TimeBlock();
142                                                      timeBlock = tb.copy();
143                                                      timeBlock.setEarnCode(thd.getEarnCode());
144                                                      timeBlock.setHours(thd.getHours());
145                                                      timeBlock.setAmount(thd.getAmount());
146                                                      objectList.add(timeBlock);
147                                              }
148                                            } // inner for ends
149                                    } // outer for ends
150                            } // if ends
151                            
152            }
153            
154         
155            return objectList;
156             }
157             
158             public boolean checkDate(TimeBlock tb, Date asOfDate, String dateString) {
159                     if(tb.getTimesheetDocumentHeader() == null) {
160                                    return false;
161                     }
162                    try {
163                            DateFormat df = new SimpleDateFormat("MM/dd/yyyy");
164                            Date dateFrom;
165                            Date dateTo;
166                            String subDateString;
167                            if(dateString.indexOf("..") == 10) {
168                                    subDateString= dateString.substring(0, 10);
169                                    dateFrom = df.parse(subDateString);
170                                    subDateString= dateString.substring(12, dateString.length());
171                                    dateTo = df.parse(subDateString);
172                                    if(asOfDate != null) {
173                                            if(!( (asOfDate.after(dateFrom) || asOfDate.equals(dateFrom))
174                                                            && (asOfDate.before(dateTo) || asOfDate.equals(dateTo)))) {
175                                                    return false;
176                                            }
177                                    } else {
178                                            return false;
179                                    }
180                            } else{
181                                    subDateString= dateString.substring(2, dateString.length());
182                                    dateTo = df.parse(subDateString);
183                                    if(asOfDate != null) {
184                                            if( (dateString.startsWith(">=") && asOfDate.before(dateTo))
185                                                            || (dateString.startsWith("<=") && asOfDate.after(dateTo))) {
186                                                    return false;
187                                            }
188                                    } else {
189                                            return false;
190                                    }
191                            }
192                    } catch (ParseException e) {
193                    }
194              return true;
195             }
196             
197            @SuppressWarnings("unchecked")
198            @Override
199            public List<HtmlData> getCustomActionUrls(BusinessObject businessObject, List pkNames) {
200                    List<HtmlData> customActionUrls = super.getCustomActionUrls(businessObject, pkNames);
201                    List<HtmlData> overrideUrls = new ArrayList<HtmlData>();
202                    for(HtmlData actionUrl : customActionUrls){
203                            if(!StringUtils.equals(actionUrl.getMethodToCall(), "copy")){
204                                    overrideUrls.add(actionUrl);
205                            }
206                    }
207                    return overrideUrls;
208            }
209    }