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.clock.location.dao;
017    
018    import java.sql.Date;
019    import java.util.ArrayList;
020    import java.util.Collection;
021    import java.util.List;
022    
023    import com.google.common.collect.ImmutableList;
024    import org.apache.commons.collections.CollectionUtils;
025    import org.apache.commons.lang.StringUtils;
026    import org.apache.ojb.broker.query.Criteria;
027    import org.apache.ojb.broker.query.Query;
028    import org.apache.ojb.broker.query.QueryFactory;
029    import org.apache.ojb.broker.query.ReportQueryByCriteria;
030    import org.kuali.hr.core.util.OjbSubQueryUtil;
031    import org.kuali.hr.time.clock.location.ClockLocationRule;
032    import org.kuali.hr.time.clock.location.ClockLocationRuleIpAddress;
033    import org.kuali.hr.time.service.base.TkServiceLocator;
034    import org.kuali.hr.time.util.TKUtils;
035    import org.kuali.hr.time.workarea.WorkArea;
036    import org.kuali.rice.core.framework.persistence.ojb.dao.PlatformAwareDaoBaseOjb;
037    
038    public class ClockLocationDaoOjbImpl extends PlatformAwareDaoBaseOjb implements ClockLocationDao{
039        private static final ImmutableList<String> EQUAL_TO_FIELDS = new ImmutableList.Builder<String>()
040                .add("dept")
041                .add("workArea")
042                .add("jobNumber")
043                .add("principalId")
044                .build();
045    
046            public List<ClockLocationRule> getClockLocationRule(String dept, Long workArea, String principalId, Long jobNumber, Date asOfDate){
047                    Criteria root = new Criteria();
048    
049                    root.addEqualTo("dept", dept);
050                    root.addEqualTo("workArea", workArea);
051                    root.addEqualTo("principalId", principalId);
052                    root.addEqualTo("jobNumber", jobNumber);
053                    root.addEqualTo("effectiveDate", OjbSubQueryUtil.getEffectiveDateSubQuery(ClockLocationRule.class, asOfDate, EQUAL_TO_FIELDS, false));
054                    root.addEqualTo("timestamp", OjbSubQueryUtil.getTimestampSubQuery(ClockLocationRule.class, EQUAL_TO_FIELDS, false));
055                    //root.addEqualTo("active", true);
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(ClockLocationRule.class, root);
062                    List<ClockLocationRule> clockLocationRules = (List<ClockLocationRule>)this.getPersistenceBrokerTemplate().getCollectionByQuery(query);
063                    if(clockLocationRules==null){
064                            clockLocationRules = new ArrayList<ClockLocationRule>();
065                    }
066                    for(ClockLocationRule clr : clockLocationRules ) {
067                            this.populateIPAddressesForCLR(clr);
068                    }
069                    return clockLocationRules;
070            }
071    
072            @SuppressWarnings("unchecked")
073            @Override
074            public List<ClockLocationRule> getNewerVersionClockLocationRule(
075                            String dept, Long workArea, String principalId, Long jobNumber,
076                            Date asOfDate) {
077                    Criteria root = new Criteria();
078                    root.addEqualTo("dept", dept);
079                    root.addEqualTo("workArea", workArea);
080                    root.addEqualTo("principalId", principalId);
081                    root.addEqualTo("jobNumber", jobNumber);
082                    root.addGreaterThan("effectiveDate", asOfDate);
083                    
084                    Criteria activeFilter = new Criteria(); // Inner Join For Activity
085                    activeFilter.addEqualTo("active", true);
086                    root.addAndCriteria(activeFilter);
087                    
088                    Query query = QueryFactory.newQuery(ClockLocationRule.class, root);
089                    List<ClockLocationRule> clockLocationRules = (List<ClockLocationRule>)this.getPersistenceBrokerTemplate().getCollectionByQuery(query);
090                    if(clockLocationRules==null){
091                            clockLocationRules = new ArrayList<ClockLocationRule>();
092                    }
093                    for(ClockLocationRule clr : clockLocationRules ) {
094                            this.populateIPAddressesForCLR(clr);
095                    }
096                    return clockLocationRules;
097            }
098            
099            public ClockLocationRule getClockLocationRule(String tkClockLocationRuleId){
100                    Criteria criteria = new Criteria();
101                    criteria.addEqualTo("tkClockLocationRuleId", tkClockLocationRuleId);
102                    ClockLocationRule clr = (ClockLocationRule) this.getPersistenceBrokerTemplate().getObjectByQuery(QueryFactory.newQuery(
103                                                                            ClockLocationRule.class, criteria));
104                    if(clr != null) {
105                            this.populateIPAddressesForCLR(clr);
106                    }
107                    return clr;
108            }
109            
110            // get ip address from tk_ip_addresses table for this ClockLocationRule
111            @SuppressWarnings("unchecked")
112            public void populateIPAddressesForCLR(ClockLocationRule clr) {
113                    if(clr.getTkClockLocationRuleId() == null) {
114                            return;
115                    }
116                    Criteria root = new Criteria();
117                    root.addEqualTo("tkClockLocationRuleId", clr.getTkClockLocationRuleId().toString());
118                    Query query = QueryFactory.newQuery(ClockLocationRuleIpAddress.class, root);
119                    List<ClockLocationRuleIpAddress> ipAddresses = (List<ClockLocationRuleIpAddress>) this.getPersistenceBrokerTemplate().getCollectionByQuery(query);
120                    clr.setIpAddresses(ipAddresses);
121            }
122    
123            @Override
124        @SuppressWarnings("unchecked")
125        public List<ClockLocationRule> getClockLocationRules(Date fromEffdt, Date toEffdt, String principalId, String jobNumber, String dept, String workArea, 
126                                                                                                             String active, String showHistory) {
127    
128            List<ClockLocationRule> results = new ArrayList<ClockLocationRule>();
129            
130            Criteria root = new Criteria();
131    
132            Criteria effectiveDateFilter = new Criteria();
133            if (fromEffdt != null) {
134                effectiveDateFilter.addGreaterOrEqualThan("effectiveDate", fromEffdt);
135            }
136            if (toEffdt != null) {
137                effectiveDateFilter.addLessOrEqualThan("effectiveDate", toEffdt);
138            }
139            if (fromEffdt == null && toEffdt == null) {
140                effectiveDateFilter.addLessOrEqualThan("effectiveDate", TKUtils.getCurrentDate());
141            }
142            root.addAndCriteria(effectiveDateFilter);
143    
144            if (StringUtils.isNotBlank(principalId)) {
145                root.addLike("principalId", principalId);
146            }
147    
148            if (StringUtils.isNotBlank(dept)) {
149                root.addLike("dept", dept);
150            }
151    
152            if (StringUtils.isNotBlank(jobNumber)) {
153                root.addLike("jobNumber", jobNumber);
154            }
155    
156            if (StringUtils.isNotBlank(dept)) {
157                Criteria workAreaCriteria = new Criteria();
158                Date asOfDate = toEffdt != null ? toEffdt : TKUtils.getCurrentDate();
159                Collection<WorkArea> workAreasForDept = TkServiceLocator.getWorkAreaService().getWorkAreas(dept,asOfDate);
160                if (CollectionUtils.isNotEmpty(workAreasForDept)) {
161                    List<Long> longWorkAreas = new ArrayList<Long>();
162                    for(WorkArea cwa : workAreasForDept){
163                        longWorkAreas.add(cwa.getWorkArea());
164                    }
165                    workAreaCriteria.addIn("workArea", longWorkAreas);
166                }
167                root.addAndCriteria(workAreaCriteria);
168            }
169    
170            if (StringUtils.isNotBlank(workArea)) {
171                root.addLike("workArea", workArea);
172            }
173            
174            if (StringUtils.isNotBlank(active)) {
175                    Criteria activeFilter = new Criteria();
176                if (StringUtils.equals(active, "Y")) {
177                    activeFilter.addEqualTo("active", true);
178                } else if (StringUtils.equals(active, "N")) {
179                    activeFilter.addEqualTo("active", false);
180                }
181                root.addAndCriteria(activeFilter);
182            }
183    
184            if (StringUtils.equals(showHistory, "N")) {
185                    root.addEqualTo("effectiveDate", OjbSubQueryUtil.getEffectiveDateSubQueryWithFilter(ClockLocationRule.class, effectiveDateFilter, EQUAL_TO_FIELDS, false));
186                    root.addEqualTo("timestamp", OjbSubQueryUtil.getTimestampSubQuery(ClockLocationRule.class, EQUAL_TO_FIELDS, false));
187            }
188            
189            Query query = QueryFactory.newQuery(ClockLocationRule.class, root);
190            results.addAll(getPersistenceBrokerTemplate().getCollectionByQuery(query));
191            
192            return results;
193        }
194    
195    }