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.math.BigDecimal;
019 import java.sql.Date;
020 import java.text.DateFormat;
021 import java.text.SimpleDateFormat;
022 import java.util.Iterator;
023 import java.util.List;
024
025 import org.apache.ojb.broker.query.Criteria;
026 import org.apache.ojb.broker.query.QueryByCriteria;
027 import org.apache.ojb.broker.query.QueryFactory;
028 import org.apache.ojb.broker.query.ReportQueryByCriteria;
029 import org.kuali.kfs.module.endow.EndowPropertyConstants;
030 import org.kuali.kfs.module.endow.businessobject.ClassCode;
031 import org.kuali.kfs.module.endow.businessobject.HoldingTaxLot;
032 import org.kuali.kfs.module.endow.businessobject.KemidPayoutInstruction;
033 import org.kuali.kfs.module.endow.businessobject.PooledFundValue;
034 import org.kuali.kfs.module.endow.businessobject.Security;
035 import org.kuali.kfs.module.endow.dataaccess.IncomeDistributionForPooledFundDao;
036 import org.kuali.rice.kns.dao.impl.PlatformAwareDaoBaseOjb;
037
038 public class IncomeDistributionForPooledFundDaoOjb extends PlatformAwareDaoBaseOjb implements IncomeDistributionForPooledFundDao {
039
040 /**
041 * @see org.kuali.kfs.module.endow.dataaccess.IncomeDistributionForPooledFundDao#getIncomeEntraCode(java.lang.String)
042 */
043 public String getIncomeEntraCode(String securityId) {
044 // get the security
045 Security security = (Security) getPersistenceBrokerTemplate().getObjectById(Security.class, securityId);
046 // get the transaction post code, using security
047 ClassCode classCode = (ClassCode) getPersistenceBrokerTemplate().getObjectById(ClassCode.class, security.getSecurityClassCode());
048
049 return classCode.getSecurityIncomeEndowmentTransactionPostCode();
050 }
051
052 /**
053 * @see org.kuali.kfs.module.endow.dataaccess.IncomeDistributionForPooledFundDao#getSecurityForIncomeDistribution()
054 */
055 public List<PooledFundValue> getPooledFundValueForIncomeDistribution(Date currentDate) {
056
057 // get pooledFundValue query for each security id with DSTRB_PROC_ON_DT = current date, DSTRB_PROC_CMPLT = 'N', and the most recent value effective date
058 Criteria subCrit = new Criteria();
059 subCrit.addEqualTo(EndowPropertyConstants.INCOME_DISTRIBUTION_COMPLETE, false);
060 subCrit.addEqualTo(EndowPropertyConstants.DISTRIBUTE_INCOME_ON_DATE, currentDate);
061 ReportQueryByCriteria subQuery = QueryFactory.newReportQuery(PooledFundValue.class, subCrit);
062 subQuery.setAttributes(new String[] {EndowPropertyConstants.POOL_SECURITY_ID, "max(" + EndowPropertyConstants.VALUE_EFFECTIVE_DATE + ")"});
063 subQuery.addGroupBy(EndowPropertyConstants.POOL_SECURITY_ID);
064 Iterator<?> result = getPersistenceBrokerTemplate().getReportQueryIteratorByQuery(subQuery);
065 if (!result.hasNext()) {
066 return null;
067 }
068
069 Criteria crit = new Criteria();
070 while (result.hasNext()) {
071 Criteria c = new Criteria();
072 Object[] data = (Object[]) result.next();
073 String securityId = data[0].toString();
074 String effectiveDate = data[1].toString();
075 c.addEqualTo(EndowPropertyConstants.POOL_SECURITY_ID, securityId);
076 try {
077 DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
078 java.util.Date date = df.parse(effectiveDate);
079 c.addEqualTo(EndowPropertyConstants.VALUE_EFFECTIVE_DATE, new Date(date.getTime()));
080 } catch (Exception e) {
081 continue;
082 }
083 crit.addOrCriteria(c);
084 }
085
086 return (List<PooledFundValue>) getPersistenceBrokerTemplate().getCollectionByQuery(QueryFactory.newQuery(PooledFundValue.class, crit));
087 }
088
089 /**
090 * @see org.kuali.kfs.module.endow.dataaccess.IncomeDistributionForPooledFundDao#getKemidPayoutInstructionForECT(java.lang.String)
091 */
092 public List<KemidPayoutInstruction> getKemidPayoutInstructionForECT(String kemid, Date currentDate) {
093 Criteria crit = new Criteria();
094 Criteria crit2 = new Criteria();
095 Criteria crit21 = new Criteria();
096
097 crit.addEqualTo(EndowPropertyConstants.KEMID_PAY_INC_KEMID, kemid);
098 crit.addNotEqualTo(EndowPropertyConstants.KEMID_PAY_INC_TO_KEMID, kemid);
099 crit.addLessOrEqualThan(EndowPropertyConstants.KEMID_PAY_INC_START_DATE, currentDate);
100 crit2.addGreaterThan(EndowPropertyConstants.KEMID_PAY_INC_END_DATE, currentDate);
101 crit21.addIsNull(EndowPropertyConstants.KEMID_PAY_INC_END_DATE);
102 crit2.addOrCriteria(crit21);
103 crit.addAndCriteria(crit2);
104
105 return (List<KemidPayoutInstruction>) getPersistenceBrokerTemplate().getCollectionByQuery(QueryFactory.newQuery(KemidPayoutInstruction.class, crit));
106 }
107
108 }