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.principal.dao;
017    
018    import java.util.ArrayList;
019    import java.util.Collection;
020    import java.util.Collections;
021    import java.util.Date;
022    import java.util.HashSet;
023    import java.util.Iterator;
024    import java.util.List;
025    import java.util.Set;
026    
027    import com.google.common.collect.ImmutableList;
028    import org.apache.commons.collections.CollectionUtils;
029    import org.apache.commons.lang.StringUtils;
030    import org.apache.ojb.broker.query.Criteria;
031    import org.apache.ojb.broker.query.Query;
032    import org.apache.ojb.broker.query.QueryFactory;
033    import org.apache.ojb.broker.query.ReportQueryByCriteria;
034    import org.kuali.hr.core.util.OjbSubQueryUtil;
035    import org.kuali.hr.time.principal.PrincipalHRAttributes;
036    import org.kuali.hr.time.util.TKUtils;
037    import org.kuali.rice.core.framework.persistence.ojb.dao.PlatformAwareDaoBaseOjb;
038    
039    public class PrincipalHRAttributesDaoImpl extends PlatformAwareDaoBaseOjb implements PrincipalHRAttributesDao {
040    
041            @Override
042            public PrincipalHRAttributes getPrincipalCalendar(String principalId,
043                            java.util.Date asOfDate) {
044                    PrincipalHRAttributes pc = null;
045    
046                    Criteria root = new Criteria();
047    
048            ImmutableList<String> fields = new ImmutableList.Builder<String>()
049                    .add("principalId")
050                    .build();
051    
052                    root.addEqualTo("principalId", principalId);
053            java.sql.Date effDate = asOfDate == null ? null : new java.sql.Date(asOfDate.getTime());
054            root.addEqualTo("effectiveDate", OjbSubQueryUtil.getEffectiveDateSubQuery(PrincipalHRAttributes.class, effDate, fields, false));
055            root.addEqualTo("timestamp", OjbSubQueryUtil.getTimestampSubQuery(PrincipalHRAttributes.class, fields, false));
056    
057                    Criteria activeFilter = new Criteria(); // Inner Join For Activity
058                    activeFilter.addEqualTo("active", true);
059                    root.addAndCriteria(activeFilter);
060                    
061                    Query query = QueryFactory.newQuery(PrincipalHRAttributes.class, root);
062                    Object obj = this.getPersistenceBrokerTemplate().getObjectByQuery(query);
063    
064                    if (obj != null) {
065                            pc = (PrincipalHRAttributes) obj;
066                    }
067    
068                    return pc;
069            }
070    
071            @Override
072            public void saveOrUpdate(PrincipalHRAttributes principalCalendar) {
073                    this.getPersistenceBrokerTemplate().store(principalCalendar);
074                    
075            }
076    
077            @Override
078            public void saveOrUpdate(List<PrincipalHRAttributes> lstPrincipalCalendar) {
079                    if(lstPrincipalCalendar != null){
080                            for(PrincipalHRAttributes principalCal : lstPrincipalCalendar){
081                                    this.getPersistenceBrokerTemplate().store(principalCal);
082                            }
083                    }
084                    
085            }
086    
087        @SuppressWarnings({"rawtypes", "unchecked"})
088        public List<PrincipalHRAttributes> getActiveEmployeesForPayCalendar(String payCalendarName, java.util.Date asOfDate) {
089            List<PrincipalHRAttributes> principalHRAttributes = new ArrayList<PrincipalHRAttributes>();
090            Criteria root = new Criteria();
091            
092            root.addEqualTo("payCalendar", payCalendarName);
093            ImmutableList<String> fields = new ImmutableList.Builder<String>()
094                    .add("payCalendar")
095                    .add("principalId")
096                    .build();
097    
098            Criteria activeFilter = new Criteria();
099            activeFilter.addEqualTo("active", true);
100            root.addAndCriteria(activeFilter);
101            java.sql.Date effDate = asOfDate == null ? null : new java.sql.Date(asOfDate.getTime());
102            root.addEqualTo("effectiveDate", OjbSubQueryUtil.getEffectiveDateSubQuery(PrincipalHRAttributes.class, effDate, fields, false));
103            root.addEqualTo("timestamp", OjbSubQueryUtil.getTimestampSubQuery(PrincipalHRAttributes.class, fields, false));
104    
105            Query query = QueryFactory.newQuery(PrincipalHRAttributes.class, root);
106            Collection c = this.getPersistenceBrokerTemplate().getCollectionByQuery(query);
107    
108            if (c != null) {
109                    principalHRAttributes.addAll(c);
110            }
111    
112            return principalHRAttributes;
113        }
114        
115        @SuppressWarnings({"rawtypes", "unchecked"})
116        public List<PrincipalHRAttributes> getActiveEmployeesForLeaveCalendar(String leaveCalendarName, Date asOfDate) {
117            List<PrincipalHRAttributes> principalHRAttributes = new ArrayList<PrincipalHRAttributes>();
118            Criteria root = new Criteria();
119    
120    
121            root.addEqualTo("leaveCalendar", leaveCalendarName);
122    
123            ImmutableList<String> fields = new ImmutableList.Builder<String>()
124                    .add("leaveCalendar")
125                    .add("principalId")
126                    .build();
127            java.sql.Date effDate = asOfDate == null ? null : new java.sql.Date(asOfDate.getTime());
128            root.addEqualTo("effectiveDate", OjbSubQueryUtil.getEffectiveDateSubQuery(PrincipalHRAttributes.class, effDate, fields, false));
129            root.addEqualTo("timestamp", OjbSubQueryUtil.getTimestampSubQuery(PrincipalHRAttributes.class, fields, false));
130    
131            Criteria activeFilter = new Criteria();
132            activeFilter.addEqualTo("active", true);
133            root.addAndCriteria(activeFilter);
134    
135            Query query = QueryFactory.newQuery(PrincipalHRAttributes.class, root);
136            Collection c = this.getPersistenceBrokerTemplate().getCollectionByQuery(query);
137    
138            if (c != null) {
139                    principalHRAttributes.addAll(c);
140            }
141    
142            return principalHRAttributes;
143        }
144        
145        public List<String> getActiveEmployeesIdForLeaveCalendarAndIdList(String leaveCalendarName, List<String> pidList, Date asOfDate) {
146            List<PrincipalHRAttributes> principalHRAttributes = new ArrayList<PrincipalHRAttributes>();
147            Criteria root = new Criteria();
148            
149            root.addEqualTo("leaveCalendar", leaveCalendarName);
150            root.addIn("principalId", pidList);
151    
152            ImmutableList<String> fields = new ImmutableList.Builder<String>()
153                    .add("leaveCalendar")
154                    .add("principalId")
155                    .build();
156            java.sql.Date effDate = asOfDate == null ? null : new java.sql.Date(asOfDate.getTime());
157            root.addEqualTo("effectiveDate", OjbSubQueryUtil.getEffectiveDateSubQuery(PrincipalHRAttributes.class,effDate, fields, false));
158            root.addEqualTo("timestamp", OjbSubQueryUtil.getTimestampSubQuery(PrincipalHRAttributes.class, fields, false));
159    
160            Criteria activeFilter = new Criteria();
161            activeFilter.addEqualTo("active", true);
162            root.addAndCriteria(activeFilter);
163    
164            Query query = QueryFactory.newQuery(PrincipalHRAttributes.class, root);
165            Collection c = getPersistenceBrokerTemplate().getCollectionByQuery(query);
166            if (c != null) {
167                    principalHRAttributes.addAll(c);
168            }
169            Set<String> pids = new HashSet<String>();
170            for(PrincipalHRAttributes phra : principalHRAttributes) {
171                    if(phra != null) {
172                    pids.add(phra.getPrincipalId());
173                    }
174            }
175            List<String> ids = new ArrayList<String>();
176            ids.addAll(pids);
177            
178            return ids;
179        }
180        
181        public List<String> getActiveEmployeesIdForTimeCalendarAndIdList(String timeCalendarName, List<String> pidList, Date asOfDate) {
182            List<PrincipalHRAttributes> principalHRAttributes = new ArrayList<PrincipalHRAttributes>();
183            Criteria root = new Criteria();
184            
185            root.addEqualTo("payCalendar", timeCalendarName);
186            root.addIn("principalId", pidList);
187    
188            ImmutableList<String> fields = new ImmutableList.Builder<String>()
189                    .add("payCalendar")
190                    .add("principalId")
191                    .build();
192            java.sql.Date effDate = asOfDate == null ? null : new java.sql.Date(asOfDate.getTime());
193            root.addEqualTo("effectiveDate", OjbSubQueryUtil.getEffectiveDateSubQuery(PrincipalHRAttributes.class, effDate, fields, false));
194            root.addEqualTo("timestamp", OjbSubQueryUtil.getTimestampSubQuery(PrincipalHRAttributes.class, fields, false));
195    
196            Criteria activeFilter = new Criteria();
197            activeFilter.addEqualTo("active", true);
198            root.addAndCriteria(activeFilter);
199    
200            Query query = QueryFactory.newQuery(PrincipalHRAttributes.class, root);
201            Collection c = getPersistenceBrokerTemplate().getCollectionByQuery(query);
202            if (c != null) {
203                    principalHRAttributes.addAll(c);
204            }
205            Set<String> pids = new HashSet<String>();
206            for(PrincipalHRAttributes phra : principalHRAttributes) {
207                    if(phra != null) {
208                    pids.add(phra.getPrincipalId());
209                    }
210            }
211            List<String> ids = new ArrayList<String>();
212            ids.addAll(pids);
213            
214            return ids;
215        }
216            
217        // KPME-1250 Kagata
218        @SuppressWarnings({"rawtypes", "unchecked"})
219        public List<PrincipalHRAttributes> getActiveEmployeesForLeavePlan(String leavePlan, java.util.Date asOfDate) {
220    
221            List<PrincipalHRAttributes> principals = new ArrayList<PrincipalHRAttributes>();
222            Criteria root = new Criteria();
223            Criteria effdt = new Criteria();
224            Criteria timestamp = new Criteria();
225    
226            ImmutableList<String> fields = new ImmutableList.Builder<String>()
227                    .add("leavePlan")
228                    .add("principalId")
229                    .build();
230            java.sql.Date effDate = asOfDate == null ? null : new java.sql.Date(asOfDate.getTime());
231            root.addEqualTo("effectiveDate", OjbSubQueryUtil.getEffectiveDateSubQuery(PrincipalHRAttributes.class, effDate, fields, false));
232            root.addEqualTo("timestamp", OjbSubQueryUtil.getTimestampSubQuery(PrincipalHRAttributes.class, fields, false));
233    
234            root.addEqualTo("leavePlan", leavePlan);
235            root.addEqualTo("active", true);
236    
237            Criteria activeFilter = new Criteria(); // Inner Join For Activity
238            activeFilter.addEqualTo("active", true);
239            root.addAndCriteria(activeFilter);
240    
241            Query query = QueryFactory.newQuery(PrincipalHRAttributes.class, root);
242            Collection c = this.getPersistenceBrokerTemplate().getCollectionByQuery(query);
243    
244            if (c != null) {
245                    principals.addAll(c);
246            }
247    
248            return principals;
249        }
250    
251        @Override
252        public List<String> getUniqueLeavePayGroupsForPrincipalIds(List<String> principalIds) {
253            if (CollectionUtils.isEmpty(principalIds)) {
254                return Collections.emptyList();
255            }
256            List<String> leaveCalendars = new ArrayList<String>();
257            Criteria crit = new Criteria();
258            crit.addEqualTo("active", true);
259            crit.addIn("principalId", principalIds);
260            ReportQueryByCriteria q = QueryFactory.newReportQuery(PrincipalHRAttributes.class, crit, true);
261            q.setDistinct(true);
262            q.setAttributes(new String[] {"leaveCalendar"});
263            Iterator iter = this.getPersistenceBrokerTemplate().getReportQueryIteratorByQuery(q);
264            while (iter.hasNext()) {
265                Object[] values = (Object[]) iter.next();
266                String leaveCalendar = (String)values[0];
267                if (StringUtils.isNotBlank(leaveCalendar)) {
268                    leaveCalendars.add(leaveCalendar);
269                }
270            }
271            return leaveCalendars;
272        }
273        
274        @SuppressWarnings("rawtypes")
275            @Override
276        public List<String> getUniqueTimePayGroups() {
277            List<String> payCalendars = new ArrayList<String>();
278            Criteria crit = new Criteria();
279            crit.addEqualTo("active", true);
280            ReportQueryByCriteria q = QueryFactory.newReportQuery(PrincipalHRAttributes.class, crit, true);
281            q.setDistinct(true);
282            q.setAttributes(new String[] {"pay_calendar"});
283            Iterator iter = this.getPersistenceBrokerTemplate().getReportQueryIteratorByQuery(q);
284            while (iter.hasNext()) {
285                Object[] values = (Object[]) iter.next();
286                String leaveCalendar = (String)values[0];
287                if (StringUtils.isNotBlank(leaveCalendar)) {
288                    payCalendars.add(leaveCalendar);
289                }
290            }
291            return payCalendars;
292        }
293    
294    //    @Override
295    //      public PrincipalHRAttributes getPrincipalHRAttributes(String principalId) {
296    //              Criteria crit = new Criteria();
297    //              crit.addEqualTo("principalId", principalId);
298    //              Query query = QueryFactory.newQuery(PrincipalHRAttributes.class, crit);
299    //              return (PrincipalHRAttributes)this.getPersistenceBrokerTemplate().getObjectByQuery(query);              
300    //      }
301        
302        @Override
303        public PrincipalHRAttributes getInactivePrincipalHRAttributes(String principalId, java.util.Date asOfDate) {
304            PrincipalHRAttributes pc = null;
305    
306                    Criteria root = new Criteria();
307                    Criteria effdt = new Criteria();
308                    Criteria timestamp = new Criteria();
309    
310            effdt.addGreaterOrEqualThan("effectiveDate", asOfDate);
311            ImmutableList<String> fields = new ImmutableList.Builder<String>()
312                    .add("leavePlan")
313                    .add("principalId")
314                    .build();
315            root.addEqualTo("effectiveDate", OjbSubQueryUtil.getEffectiveDateSubQueryWithFilter(PrincipalHRAttributes.class, effdt, fields, false));
316            root.addEqualTo("timestamp", OjbSubQueryUtil.getTimestampSubQuery(PrincipalHRAttributes.class, fields, false));
317    
318                    root.addEqualTo("principalId", principalId);
319    
320                    Criteria activeFilter = new Criteria(); // Inner Join For Activity
321                    activeFilter.addEqualTo("active", false);
322                    root.addAndCriteria(activeFilter);
323                    
324                    Query query = QueryFactory.newQuery(PrincipalHRAttributes.class, root);
325                    Object obj = this.getPersistenceBrokerTemplate().getObjectByQuery(query);
326    
327                    if (obj != null) {
328                            pc = (PrincipalHRAttributes) obj;
329                    }
330    
331                    return pc;
332        }
333        
334        @Override
335        public PrincipalHRAttributes getPrincipalHRAttributes(String hrPrincipalAttributeId) {
336            Criteria crit = new Criteria();
337                    crit.addEqualTo("hrPrincipalAttributeId", hrPrincipalAttributeId);
338                    
339                    Query query = QueryFactory.newQuery(PrincipalHRAttributes.class, crit);
340                    return (PrincipalHRAttributes)this.getPersistenceBrokerTemplate().getObjectByQuery(query);
341        }
342        
343        @Override
344        public List<PrincipalHRAttributes> getAllActivePrincipalHrAttributesForPrincipalId(String principalId, java.util.Date asOfDate) {
345            
346            List<PrincipalHRAttributes> phaList = new ArrayList<PrincipalHRAttributes>();
347            Criteria root = new Criteria();
348            root.addEqualTo("principalId", principalId);
349            root.addLessOrEqualThan("effectiveDate", asOfDate);
350            root.addEqualTo("active", true);
351            Query query = QueryFactory.newQuery(PrincipalHRAttributes.class, root);
352            Collection c = this.getPersistenceBrokerTemplate().getCollectionByQuery(query);
353            if (c != null) {
354                phaList.addAll(c);
355            }
356            return phaList;        
357        }
358        
359        @Override
360        public List<PrincipalHRAttributes> getAllInActivePrincipalHrAttributesForPrincipalId(String principalId, java.util.Date asOfDate) {
361            List<PrincipalHRAttributes> phaList = new ArrayList<PrincipalHRAttributes>();
362            Criteria root = new Criteria();
363            root.addEqualTo("principalId", principalId);
364            root.addLessOrEqualThan("effectiveDate", asOfDate);
365            root.addEqualTo("active", false);
366    
367            Query query = QueryFactory.newQuery(PrincipalHRAttributes.class, root);
368            Collection c = this.getPersistenceBrokerTemplate().getCollectionByQuery(query);
369            if (c != null) {
370                phaList.addAll(c);
371            }
372            return phaList;  
373        }
374        @Override
375        public PrincipalHRAttributes getMaxTimeStampPrincipalHRAttributes(String principalId) {
376            Criteria root = new Criteria();
377            Criteria crit = new Criteria();
378            
379            crit.addEqualTo("principalId", principalId);
380            ReportQueryByCriteria timestampSubQuery = QueryFactory.newReportQuery(PrincipalHRAttributes.class, crit);
381            timestampSubQuery.setAttributes(new String[]{"max(timestamp)"});
382    
383            root.addEqualTo("principalId", principalId);
384            root.addEqualTo("timestamp", timestampSubQuery);
385    
386            Query query = QueryFactory.newQuery(PrincipalHRAttributes.class, root);
387            return (PrincipalHRAttributes) this.getPersistenceBrokerTemplate().getObjectByQuery(query);
388        }
389        
390        @Override
391        public List<PrincipalHRAttributes> getActivePrincipalHrAttributesForRange(String principalId, java.util.Date startDate, java.util.Date endDate) {
392            List<PrincipalHRAttributes> activeList = new ArrayList<PrincipalHRAttributes>();
393            Criteria root = new Criteria();
394            root.addEqualTo("principalId", principalId);
395            root.addGreaterOrEqualThan("effectiveDate", startDate);
396            root.addLessOrEqualThan("effectiveDate", endDate);
397            root.addEqualTo("active", true);
398            Query query = QueryFactory.newQuery(PrincipalHRAttributes.class, root);
399            Collection c = this.getPersistenceBrokerTemplate().getCollectionByQuery(query);
400            if (c != null) {
401                    activeList.addAll(c);
402            }
403            List<PrincipalHRAttributes> aList = new ArrayList<PrincipalHRAttributes>();
404            aList.addAll(activeList);
405            for(PrincipalHRAttributes aPha : aList) {
406                    List<PrincipalHRAttributes> inactivePhas = this.getInactivePrincipalHRAttributesForRange(principalId, aPha.getEffectiveDate(), endDate);
407                    if(CollectionUtils.isNotEmpty(inactivePhas)) {
408                            for(PrincipalHRAttributes inactive : inactivePhas) {
409                                    if(inactive.getTimestamp().after(aPha.getTimestamp())) {
410                                            activeList.remove(aPha);
411                                    }
412                            }
413                    }
414            }
415            
416            return activeList;   
417        }
418        
419        @Override
420        public List<PrincipalHRAttributes> getInactivePrincipalHRAttributesForRange(String principalId, java.util.Date startDate, java.util.Date endDate) {
421            List<PrincipalHRAttributes> inactiveList = new ArrayList<PrincipalHRAttributes>();
422            Criteria root = new Criteria();
423            root.addEqualTo("principalId", principalId);
424            root.addGreaterOrEqualThan("effectiveDate", startDate);
425            root.addLessOrEqualThan("effectiveDate", endDate);
426            root.addEqualTo("active", false);
427            Query query = QueryFactory.newQuery(PrincipalHRAttributes.class, root);
428            Collection c = this.getPersistenceBrokerTemplate().getCollectionByQuery(query);
429            if (c != null) {
430                    inactiveList.addAll(c);
431            }
432            return inactiveList;
433        }
434       
435            @Override
436        @SuppressWarnings("unchecked")
437        public List<PrincipalHRAttributes> getPrincipalHrAtributes(String principalId, String leavePlan, java.sql.Date fromEffdt, java.sql.Date toEffdt, String active, String showHistory) {
438            List<PrincipalHRAttributes> results = new ArrayList<PrincipalHRAttributes>();
439            
440            Criteria root = new Criteria();
441            
442            if (StringUtils.isNotBlank(principalId)) {
443                root.addLike("principalId", principalId);
444            }
445    
446            if (StringUtils.isNotBlank(leavePlan)) {
447                root.addLike("leavePlan", leavePlan);
448            }
449    
450            Criteria effectiveDateFilter = new Criteria();
451            if (fromEffdt != null) {
452                effectiveDateFilter.addGreaterOrEqualThan("effectiveDate", fromEffdt);
453            }
454            if (toEffdt != null) {
455                effectiveDateFilter.addLessOrEqualThan("effectiveDate", toEffdt);
456            }
457            if (fromEffdt == null && toEffdt == null) {
458                effectiveDateFilter.addLessOrEqualThan("effectiveDate", TKUtils.getCurrentDate());
459            }
460            root.addAndCriteria(effectiveDateFilter);
461    
462            if (StringUtils.isNotBlank(active)) {
463                    Criteria activeFilter = new Criteria();
464                if (StringUtils.equals(active, "Y")) {
465                    activeFilter.addEqualTo("active", true);
466                } else if (StringUtils.equals(active, "N")) {
467                    activeFilter.addEqualTo("active", false);
468                }
469                root.addAndCriteria(activeFilter);
470            }
471            
472            if (StringUtils.equals(showHistory, "N")) {
473                ImmutableList<String> fields = new ImmutableList.Builder<String>()
474                        .add("principalId")
475                        .add("leavePlan")
476                        .build();
477                root.addEqualTo("effectiveDate", OjbSubQueryUtil.getEffectiveDateSubQueryWithFilter(PrincipalHRAttributes.class, effectiveDateFilter, fields, false));
478                root.addEqualTo("timestamp", OjbSubQueryUtil.getTimestampSubQuery(PrincipalHRAttributes.class, fields, false));
479           }
480            
481           Query query = QueryFactory.newQuery(PrincipalHRAttributes.class, root);
482           results.addAll(getPersistenceBrokerTemplate().getCollectionByQuery(query));
483           
484           return results;
485        }
486    
487    }