001    /*
002     * Copyright 2011 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.kfs.module.endow.dataaccess.impl;
017    
018    import java.util.ArrayList;
019    import java.util.Iterator;
020    import java.util.List;
021    
022    import org.apache.ojb.broker.query.Criteria;
023    import org.apache.ojb.broker.query.QueryByCriteria;
024    import org.apache.ojb.broker.query.QueryFactory;
025    import org.apache.ojb.broker.query.ReportQueryByCriteria;
026    import org.kuali.kfs.coa.businessobject.Organization;
027    import org.kuali.kfs.module.endow.EndowPropertyConstants;
028    import org.kuali.kfs.module.endow.businessobject.KemidBenefittingOrganization;
029    import org.kuali.kfs.module.endow.dataaccess.KemidBenefittingOrganizationDao;
030    import org.kuali.kfs.module.endow.report.util.KemidsWithMultipleBenefittingOrganizationsDataHolder;
031    import org.kuali.kfs.sys.KFSConstants;
032    import org.kuali.rice.kns.dao.impl.PlatformAwareDaoBaseOjb;
033    import org.kuali.rice.kns.util.ObjectUtils;
034    
035    public class KemidBenefittingOrganizationDaoOjb extends PlatformAwareDaoBaseOjb implements KemidBenefittingOrganizationDao {
036    
037        /**
038         * 
039         * @see org.kuali.kfs.module.endow.dataaccess.KemidBenefittingOrganizationDao#getKemidsByAttribute(java.lang.String, java.util.List)
040         */
041        public List<String> getKemidsByAttribute(String attributeName, List<String> values) {
042            
043            Criteria criteria1 = new Criteria();
044            Criteria criteria2 = new Criteria();
045            criteria1.addEqualTo(EndowPropertyConstants.ENDOWCODEBASE_ACTIVE_INDICATOR, true);
046            for (String value : values) {
047                Criteria c = new Criteria();
048                if (value.contains(KFSConstants.WILDCARD_CHARACTER)) {
049                    c.addLike(attributeName, value.trim().replace(KFSConstants.WILDCARD_CHARACTER, KFSConstants.PERCENTAGE_SIGN));
050                } else {
051                    c.addEqualTo(attributeName, value.trim());
052                }            
053                criteria2.addOrCriteria(c);
054            }        
055            criteria1.addAndCriteria(criteria2);
056            ReportQueryByCriteria query = new ReportQueryByCriteria(KemidBenefittingOrganization.class, criteria1, true);
057            query.setAttributes(new String[] {EndowPropertyConstants.KEMID});
058            
059            Iterator<Object> result = getPersistenceBrokerTemplate().getReportQueryIteratorByQuery(query); 
060            
061            // get kemids
062            List<String> kemids = new ArrayList<String>();
063            while (result.hasNext()) {
064                Object[] data = (Object[]) result.next();
065                kemids.add(data[0].toString());
066            }
067            
068            return kemids;
069        }
070    
071        /**
072         * 
073         * @see org.kuali.kfs.module.endow.dataaccess.KemidBenefittingOrganizationDao#getAttributeValues(java.lang.String, java.util.List)
074         */
075        public List<String> getAttributeValues(String attributeName, List<String> values) {
076            
077            Criteria criteria1 = new Criteria();
078            Criteria criteria2 = new Criteria();
079            criteria1.addEqualTo(EndowPropertyConstants.ENDOWCODEBASE_ACTIVE_INDICATOR, true);
080            for (String value : values) {
081                Criteria c = new Criteria();
082                if (value.contains(KFSConstants.WILDCARD_CHARACTER)) {
083                    c.addLike(attributeName, value.trim().replace(KFSConstants.WILDCARD_CHARACTER, KFSConstants.PERCENTAGE_SIGN));
084                } else {
085                    c.addEqualTo(attributeName, value.trim());
086                }            
087                criteria2.addOrCriteria(c);
088            }        
089            criteria1.addAndCriteria(criteria2);
090            ReportQueryByCriteria query = new ReportQueryByCriteria(KemidBenefittingOrganization.class, criteria1, true);
091            query.setAttributes(new String[] {attributeName});
092    
093            Iterator<Object> result = getPersistenceBrokerTemplate().getReportQueryIteratorByQuery(query); 
094            
095            List<String> attributeValues = new ArrayList<String>();
096            while (result.hasNext()) {
097                Object[] data = (Object[]) result.next();
098                attributeValues.add(data[0].toString());
099            }
100            
101            return attributeValues;
102        }
103    
104        /**
105         * 
106         * @see org.kuali.kfs.module.endow.dataaccess.KemidBenefittingOrganizationDao#getKemidsWithMultipleBenefittingOrganizations(java.util.List)
107         */
108        public List<KemidsWithMultipleBenefittingOrganizationsDataHolder> getKemidsWithMultipleBenefittingOrganizations(List<String> kemids) {
109            
110            if (kemids == null || kemids.isEmpty()) {
111                return null;
112            }
113            
114            List<KemidsWithMultipleBenefittingOrganizationsDataHolder> kmbodhs = new ArrayList<KemidsWithMultipleBenefittingOrganizationsDataHolder>(); 
115            
116            // get the kemids that are more than one
117            List<String> kemidsInMultipl = getIdsForMultipleBenefittingOrganizations(kemids);
118            
119            if (kemidsInMultipl != null && !kemidsInMultipl.isEmpty()) {
120                // get the benefitting organizations and populate the data holder
121                List<KemidBenefittingOrganization> kemidBenefittingOrganizationList = getBenefittingOrganizations(kemidsInMultipl);
122                for (KemidBenefittingOrganization kemidBenefittingOrganization : kemidBenefittingOrganizationList) {
123                    KemidsWithMultipleBenefittingOrganizationsDataHolder kmbo = new KemidsWithMultipleBenefittingOrganizationsDataHolder();
124                    kmbo.setKemid(kemidBenefittingOrganization.getKemid());
125                    kmbo.setCampus(getCampusCode(kemidBenefittingOrganization.getBenefittingChartCode(), kemidBenefittingOrganization.getBenefittingOrgCode()));  
126                    kmbo.setChart(kemidBenefittingOrganization.getBenefittingChartCode());
127                    kmbo.setOrganization(kemidBenefittingOrganization.getBenefittingOrgCode());
128                    kmbo.setPercent(kemidBenefittingOrganization.getBenefitPrecent());
129                    kmbodhs.add(kmbo);
130                }
131            }
132            
133            return kmbodhs;
134        }
135        
136        /**
137         * 
138         * @see org.kuali.kfs.module.endow.dataaccess.KemidBenefittingOrganizationDao#getBenefittingOrganizations(java.util.List)
139         */
140        public List<KemidBenefittingOrganization> getBenefittingOrganizations(List<String> kemids) {
141            
142            Criteria criteria1 = new Criteria();
143            Criteria criteria2 = new Criteria();
144            criteria1.addEqualTo(EndowPropertyConstants.ENDOWCODEBASE_ACTIVE_INDICATOR, true);
145            for (String kemid : kemids) {
146                Criteria c = new Criteria();
147                c.addEqualTo(EndowPropertyConstants.KEMID, kemid.trim());
148                criteria2.addOrCriteria(c);
149            }
150            criteria1.addAndCriteria(criteria2);
151            QueryByCriteria queryByCriteria = QueryFactory.newQuery(KemidBenefittingOrganization.class, criteria1);
152            queryByCriteria.addOrderByAscending(EndowPropertyConstants.KEMID);
153            
154            return (List<KemidBenefittingOrganization>) getPersistenceBrokerTemplate().getCollectionByQuery(queryByCriteria);
155        }
156        
157        /**
158         * 
159         * @see org.kuali.kfs.module.endow.dataaccess.KemidBenefittingOrganizationDao#getIdsForMultipleBenefittingOrganizations(java.util.List)
160         */
161        public List<String> getIdsForMultipleBenefittingOrganizations(List<String> kemids) {
162            
163            Criteria subCrit = new Criteria();
164            subCrit.addIn(EndowPropertyConstants.KEMID, kemids);        
165            ReportQueryByCriteria reportQueryByCriteria = QueryFactory.newReportQuery(KemidBenefittingOrganization.class, subCrit);
166            reportQueryByCriteria.setAttributes(new String[] {EndowPropertyConstants.KEMID});
167            reportQueryByCriteria.addGroupBy(EndowPropertyConstants.KEMID);  
168            Criteria havingCriteria = new Criteria();
169            havingCriteria.addGreaterThan("count(" + EndowPropertyConstants.KEMID + ")", new Integer(1));
170            reportQueryByCriteria.setHavingCriteria(havingCriteria);
171            reportQueryByCriteria.addOrderByAscending(EndowPropertyConstants.KEMID);
172    
173            Iterator<?> result = getPersistenceBrokerTemplate().getReportQueryIteratorByQuery(reportQueryByCriteria);          
174            List<String> kemidsMultiple = new ArrayList<String>();
175            while (result.hasNext()) {
176                Object[] data = (Object[]) result.next();
177                kemidsMultiple.add(data[0].toString());
178            }
179            return kemidsMultiple;        
180        }
181        
182        /**
183         * 
184         * @see org.kuali.kfs.module.endow.dataaccess.KemidBenefittingOrganizationDao#getKemidsByCampusCode(java.util.List)
185         */
186        public List<String> getKemidsByCampusCode(List<String> campusCodes) {
187            
188            // get organizations with campuseCodes
189            String attributeName = EndowPropertyConstants.CA_ORG_CAMPUS_CD;
190            
191            Criteria criteria1 = new Criteria();
192            for (String campusCode : campusCodes) {
193                Criteria c = new Criteria();
194                if (campusCode.contains(KFSConstants.WILDCARD_CHARACTER)) {
195                    c.addLike(attributeName, campusCode.trim().replace(KFSConstants.WILDCARD_CHARACTER, KFSConstants.PERCENTAGE_SIGN));
196                } else {
197                    c.addEqualTo(attributeName, campusCode.trim());
198                }            
199                criteria1.addOrCriteria(c);
200            }                
201            ReportQueryByCriteria reportQueryByCriteria = new ReportQueryByCriteria(Organization.class, criteria1, true);
202            reportQueryByCriteria.setAttributes(new String[] {EndowPropertyConstants.CA_ORG_CHRT_CD, EndowPropertyConstants.CA_ORG_CD});        
203            Iterator<Object> result = getPersistenceBrokerTemplate().getReportQueryIteratorByQuery(reportQueryByCriteria);
204            
205            // get the matching benefitting organization kemids
206            Criteria criteria2 = new Criteria();
207            Criteria subCriteria = new Criteria();
208            criteria2.addEqualTo(EndowPropertyConstants.ENDOWCODEBASE_ACTIVE_INDICATOR, true);        
209            while (result.hasNext()) {
210                Criteria c = new Criteria();
211                Object[] data = (Object[]) result.next();
212                String chartCode = data[0].toString();
213                String organziationCode = data[1].toString();
214                c.addEqualTo(EndowPropertyConstants.KEMID_BENE_CHRT_CD, chartCode);
215                c.addEqualTo(EndowPropertyConstants.KEMID_BENE_ORG_CD, organziationCode);
216                subCriteria.addOrCriteria(c);            
217            }
218            criteria2.addAndCriteria(subCriteria);
219            
220            ReportQueryByCriteria query = new ReportQueryByCriteria(KemidBenefittingOrganization.class, criteria2, true);
221            query.setAttributes(new String[] {EndowPropertyConstants.KEMID});
222            
223            Iterator<Object> result2 = getPersistenceBrokerTemplate().getReportQueryIteratorByQuery(query); 
224            List<String> kemids = new ArrayList<String>();
225            while (result2.hasNext()) {
226                Object[] data = (Object[]) result2.next();
227                kemids.add(data[0].toString());
228            }
229            
230            return kemids;
231        }
232        
233        /**
234         * 
235         * @see org.kuali.kfs.module.endow.dataaccess.KemidBenefittingOrganizationDao#getCampusCodes(java.lang.String, java.util.List)
236         */
237        public List<String> getCampusCodes(String attributeName, List<String> values) {
238            
239            Criteria criteria1 = new Criteria();
240            Criteria criteria2 = new Criteria();
241            criteria1.addEqualTo(EndowPropertyConstants.ENDOWCODEBASE_ACTIVE_INDICATOR, true);
242            for (String value : values) {
243                Criteria c = new Criteria();
244                if (value.contains(KFSConstants.WILDCARD_CHARACTER)) {
245                    c.addLike(attributeName, value.trim().replace(KFSConstants.WILDCARD_CHARACTER, KFSConstants.PERCENTAGE_SIGN));
246                } else {
247                    c.addEqualTo(attributeName, value.trim());
248                }            
249                criteria2.addOrCriteria(c);
250            }        
251            criteria1.addAndCriteria(criteria2);
252            ReportQueryByCriteria query = new ReportQueryByCriteria(Organization.class, criteria1, true);
253            query.setAttributes(new String[] {attributeName});
254    
255            Iterator<Object> result = getPersistenceBrokerTemplate().getReportQueryIteratorByQuery(query); 
256            
257            List<String> attributeValues = new ArrayList<String>();
258            while (result.hasNext()) {
259                Object[] data = (Object[]) result.next();
260                attributeValues.add(data[0].toString());
261            }
262            
263            return attributeValues;
264        }
265        
266        /**
267         * 
268         * @see org.kuali.kfs.module.endow.dataaccess.KemidBenefittingOrganizationDao#getCampusCode(java.lang.String, java.lang.String)
269         */
270        public String getCampusCode(String charCode, String organziationCode) {
271            
272            Criteria criteria = new Criteria();
273            criteria.addEqualTo(EndowPropertyConstants.CA_ORG_CHRT_CD, charCode);
274            criteria.addEqualTo(EndowPropertyConstants.CA_ORG_CD, organziationCode);
275            
276            QueryByCriteria qbc = QueryFactory.newQuery(Organization.class, criteria);
277            
278            Organization organization =  (Organization) getPersistenceBrokerTemplate().getObjectByQuery(qbc);
279            
280            String campusCode = "";
281            if (ObjectUtils.isNotNull(organization)) {
282                campusCode = organization.getOrganizationPhysicalCampusCode();
283            }
284            return campusCode;
285        }
286    }