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.timecollection.rule.dao;
017    
018    import com.google.common.collect.ImmutableList;
019    import org.apache.commons.lang.StringUtils;
020    import org.apache.ojb.broker.query.Criteria;
021    import org.apache.ojb.broker.query.Query;
022    import org.apache.ojb.broker.query.QueryFactory;
023    import org.kuali.hr.core.util.OjbSubQueryUtil;
024    import org.kuali.hr.time.collection.rule.TimeCollectionRule;
025    import org.kuali.rice.core.framework.persistence.ojb.dao.PlatformAwareDaoBaseOjb;
026    
027    import java.sql.Date;
028    import java.util.ArrayList;
029    import java.util.List;
030    
031    public class TimeCollectionRuleDaoServiceImpl extends PlatformAwareDaoBaseOjb implements TimeCollectionRuleDaoService {
032        private static final ImmutableList<String> EQUAL_TO_FIELDS = new ImmutableList.Builder<String>()
033                .add("workArea")
034                .add("dept")
035                .add("payType")
036                .build();
037    
038        /*
039          * Returns valid TimeCollectionRule based on dept,workArea, and asOfDate
040          * dept and work area are wildcardable values
041          * @see org.kuali.hr.time.timecollection.rule.dao.TimeCollectionRuleDaoService#getTimeCollectionRule(java.lang.String dept,
042          * java.lang.Long workArea, java.sql.Date asOfDate)
043          */
044    
045        @Override
046        public TimeCollectionRule getTimeCollectionRule(String dept, Long workArea, Date asOfDate) {
047    
048    
049            TimeCollectionRule timeCollectionRule = new TimeCollectionRule();
050    
051            //First call confirm no exact match
052            timeCollectionRule = getTimeCollectionRuleWildCarded(dept, workArea, asOfDate);
053            if (timeCollectionRule != null) {
054                return timeCollectionRule;
055            }
056            //Try with dept wildcarded *
057            timeCollectionRule = getTimeCollectionRuleWildCarded("%", workArea, asOfDate);
058            if (timeCollectionRule != null) {
059                return timeCollectionRule;
060            }
061    
062            //Try with work area wildcarded
063            timeCollectionRule = getTimeCollectionRuleWildCarded(dept, -1L, asOfDate);
064            if (timeCollectionRule != null) {
065                return timeCollectionRule;
066            }
067    
068            //Try with everything wildcarded
069            return getTimeCollectionRuleWildCarded("%", -1L, asOfDate);
070        }
071    
072        private TimeCollectionRule getTimeCollectionRuleWildCarded(String dept, Long workArea, Date asOfDate) {
073            Criteria root = new Criteria();
074            ImmutableList<String> fields = new ImmutableList.Builder<String>()
075                    .add("workArea")
076                    .add("dept")
077                    .build();
078    
079            root.addEqualTo("dept", dept);
080            root.addEqualTo("workArea", workArea);
081            root.addEqualTo("effectiveDate", OjbSubQueryUtil.getEffectiveDateSubQuery(TimeCollectionRule.class, asOfDate, fields, false));
082            root.addEqualTo("timestamp", OjbSubQueryUtil.getTimestampSubQuery(TimeCollectionRule.class, fields, false));
083    //              root.addEqualTo("active", true);
084    
085            Criteria activeFilter = new Criteria(); // Inner Join For Activity
086            activeFilter.addEqualTo("active", true);
087            root.addAndCriteria(activeFilter);
088    
089    
090            Query query = QueryFactory.newQuery(TimeCollectionRule.class, root);
091            return (TimeCollectionRule) this.getPersistenceBrokerTemplate().getObjectByQuery(query);
092    
093        }
094    
095        @Override
096        public TimeCollectionRule getTimeCollectionRule(String tkTimeCollectionRuleId) {
097            Criteria crit = new Criteria();
098            crit.addEqualTo("tkTimeCollectionRuleId", tkTimeCollectionRuleId);
099    
100            Query query = QueryFactory.newQuery(TimeCollectionRule.class, crit);
101            return (TimeCollectionRule) this.getPersistenceBrokerTemplate().getObjectByQuery(query);
102    
103        }
104    
105        /* Jira 1152
106          * Returns valid TimeCollectionRule based on dept, workArea, payType, and asOfDate
107          * dept, work area, and payType can be wildcardable values
108          */
109        @Override
110        public TimeCollectionRule getTimeCollectionRule(String dept, Long workArea, String payType, Date asOfDate) {
111    
112    
113            TimeCollectionRule timeCollectionRule = new TimeCollectionRule();
114    
115            //First call confirm no exact match
116            timeCollectionRule = getTimeCollectionRuleWildCarded(dept, workArea, payType, asOfDate);
117            if (timeCollectionRule != null) {
118                return timeCollectionRule;
119            }
120            //Try with dept wildcarded *
121            timeCollectionRule = getTimeCollectionRuleWildCarded("%", workArea, payType, asOfDate);
122            if (timeCollectionRule != null) {
123                return timeCollectionRule;
124            }
125    
126            //Try with work area wildcarded
127            timeCollectionRule = getTimeCollectionRuleWildCarded(dept, -1L, payType, asOfDate);
128            if (timeCollectionRule != null) {
129                return timeCollectionRule;
130            }
131    
132            //Try with payType wildcarded
133            timeCollectionRule = getTimeCollectionRuleWildCarded(dept, workArea, "%", asOfDate);
134            if (timeCollectionRule != null) {
135                return timeCollectionRule;
136            }
137    
138            //Try with dept and workArea wildcarded
139            timeCollectionRule = getTimeCollectionRuleWildCarded("%", -1L, payType, asOfDate);
140            if (timeCollectionRule != null) {
141                return timeCollectionRule;
142            }
143    
144            //Try with dept and payType wildcarded
145            timeCollectionRule = getTimeCollectionRuleWildCarded("%", workArea, "%", asOfDate);
146            if (timeCollectionRule != null) {
147                return timeCollectionRule;
148            }
149    
150            //Try with workArea and payType wildcarded
151            timeCollectionRule = getTimeCollectionRuleWildCarded(dept, -1L, "%", asOfDate);
152            if (timeCollectionRule != null) {
153                return timeCollectionRule;
154            }
155    
156            //Try with everything wildcarded
157            return getTimeCollectionRuleWildCarded("%", -1L, "%", asOfDate);
158        }
159    
160        private TimeCollectionRule getTimeCollectionRuleWildCarded(String dept, Long workArea, String payType, Date asOfDate) {
161            Criteria root = new Criteria();
162    
163            root.addEqualTo("dept", dept);
164            root.addEqualTo("workArea", workArea);
165            root.addEqualTo("payType", payType);
166            root.addEqualTo("effectiveDate", OjbSubQueryUtil.getEffectiveDateSubQuery(TimeCollectionRule.class, asOfDate, EQUAL_TO_FIELDS, false));
167            root.addEqualTo("timestamp", OjbSubQueryUtil.getTimestampSubQuery(TimeCollectionRule.class, EQUAL_TO_FIELDS, false));
168    //              root.addEqualTo("active", true);
169    
170            Criteria activeFilter = new Criteria(); // Inner Join For Activity
171            activeFilter.addEqualTo("active", true);
172            root.addAndCriteria(activeFilter);
173    
174    
175            Query query = QueryFactory.newQuery(TimeCollectionRule.class, root);
176            return (TimeCollectionRule) this.getPersistenceBrokerTemplate().getObjectByQuery(query);
177    
178        }
179    
180            @Override
181        @SuppressWarnings("unchecked")
182        public List<TimeCollectionRule> getTimeCollectionRules(String dept, Long workArea, String payType, String active, String showHistory) {
183            List<TimeCollectionRule> results = new ArrayList<TimeCollectionRule>();
184    
185            Criteria root = new Criteria();
186    
187            if (StringUtils.isNotBlank(dept)) {
188                root.addLike("dept", dept);
189            }
190    
191            if (workArea != null) {
192                root.addLike("workArea", workArea);
193            }
194            
195            if (StringUtils.isNotBlank(payType)) {
196                root.addLike("payType", payType);
197            }
198            
199            if (StringUtils.isNotBlank(active)) {
200                    Criteria activeFilter = new Criteria();
201                if (StringUtils.equals(active, "Y")) {
202                    activeFilter.addEqualTo("active", true);
203                } else if (StringUtils.equals(active, "N")) {
204                    activeFilter.addEqualTo("active", false);
205                }
206                root.addAndCriteria(activeFilter);
207            }
208            
209            if (StringUtils.equals(showHistory, "N")) {
210                root.addEqualTo("effectiveDate", OjbSubQueryUtil.getEffectiveDateSubQueryWithoutFilter(TimeCollectionRule.class, EQUAL_TO_FIELDS, false));
211                root.addEqualTo("timestamp", OjbSubQueryUtil.getTimestampSubQuery(TimeCollectionRule.class, EQUAL_TO_FIELDS, false));
212            }
213            
214            Query query = QueryFactory.newQuery(TimeCollectionRule.class, root);
215            results.addAll(getPersistenceBrokerTemplate().getCollectionByQuery(query));
216    
217            return results;
218        }
219    }