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.util.ArrayList;
021    import java.util.Collection;
022    import java.util.HashMap;
023    import java.util.Map;
024    
025    import org.apache.commons.lang.StringUtils;
026    import org.apache.ojb.broker.query.Criteria;
027    import org.apache.ojb.broker.query.QueryByCriteria;
028    import org.apache.ojb.broker.query.QueryFactory;
029    import org.kuali.kfs.module.endow.EndowConstants;
030    import org.kuali.kfs.module.endow.EndowPropertyConstants;
031    import org.kuali.kfs.module.endow.businessobject.EndowmentAccountingLineBase;
032    import org.kuali.kfs.module.endow.businessobject.FeeEndowmentTransactionCode;
033    import org.kuali.kfs.module.endow.businessobject.FeeMethod;
034    import org.kuali.kfs.module.endow.businessobject.FeeTransaction;
035    import org.kuali.kfs.module.endow.businessobject.TransactionArchive;
036    import org.kuali.kfs.module.endow.dataaccess.EndowmentAccountingLineBaseDao;
037    import org.kuali.kfs.sys.context.SpringContext;
038    import org.kuali.rice.kns.dao.impl.PlatformAwareDaoBaseOjb;
039    import org.kuali.rice.kns.service.DataDictionaryService;
040    
041    public class EndowmentAccountingLineBaseDaoOjb extends PlatformAwareDaoBaseOjb implements EndowmentAccountingLineBaseDao {
042        protected static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(EndowmentAccountingLineBaseDaoOjb.class);
043        
044        /**
045         * @@see {@link org.kuali.kfs.module.endow.dataaccess.EndowmentAccountingLineBaseDao#getAllEndowmentAccountingLines(String)
046         */
047        public Collection<EndowmentAccountingLineBase> getAllEndowmentAccountingLines(String documentNumber) {
048            Collection<EndowmentAccountingLineBase> endowmentAccountingLines = new ArrayList();
049            
050            Criteria criteria = new Criteria();
051            criteria.addEqualTo(EndowPropertyConstants.DOCUMENT_NUMBER, documentNumber);
052            
053            //sort the data on these columns....
054            QueryByCriteria qbc = QueryFactory.newQuery(EndowmentAccountingLineBase.class, criteria);
055    
056            qbc.addOrderByAscending(EndowPropertyConstants.ColumnNames.GlInterfaceBatchProcessLine.TRANSACTION_ARCHIVE_FDOC_LN_TYP_CD);
057    
058            endowmentAccountingLines = getPersistenceBrokerTemplate().getCollectionByQuery(qbc);
059            
060            return endowmentAccountingLines;
061        }
062    
063        /**
064         * @@see {@link org.kuali.kfs.module.endow.dataaccess.TransactionArchiveDao#getAllTransactionArchives()
065         */
066        public Collection<TransactionArchive> getAllTransactionArchives() {
067            Collection<TransactionArchive> transactionArchives = new ArrayList();
068            
069            Criteria criteria = new Criteria();
070            criteria.addNotNull(EndowPropertyConstants.DOCUMENT_NUMBER);
071    
072            QueryByCriteria query = QueryFactory.newQuery(TransactionArchive.class, criteria);
073            transactionArchives = getPersistenceBrokerTemplate().getCollectionByQuery(query);
074            
075            return transactionArchives;
076        }
077        
078        /**
079         * @see org.kuali.kfs.module.endow.dataaccess.TransactionArchiveDao#getByPrimaryKey(String, int, String)
080         */
081        public TransactionArchive getByPrimaryKey(String documentNumber, int lineNumber, String lineTypeCode) {
082            TransactionArchive transactionArchive = null;
083            
084            Criteria criteria = new Criteria();
085            criteria.addEqualTo(EndowPropertyConstants.TRANSACTION_ARCHIVE_DOCUMENT_NUMBER, documentNumber);
086            criteria.addEqualTo(EndowPropertyConstants.TRANSACTION_ARCHIVE_LINE_NUMBER, lineNumber);
087    
088            if (SpringContext.getBean(DataDictionaryService.class).getAttributeForceUppercase(TransactionArchive.class, EndowPropertyConstants.TRANSACTION_ARCHIVE_LINE_TYPE_CODE)) {
089                lineTypeCode = lineTypeCode.toUpperCase();
090            }
091            criteria.addEqualTo(EndowPropertyConstants.TRANSACTION_ARCHIVE_LINE_TYPE_CODE, lineTypeCode);
092            
093            QueryByCriteria query = QueryFactory.newQuery(TransactionArchive.class, criteria);
094            transactionArchive = (TransactionArchive) getPersistenceBrokerTemplate().getObjectByQuery(query);
095            
096            return transactionArchive;
097        }
098        
099        /**
100         * Prepares the criteria to select the records from END_TRAN_ARCHV_T table
101         */
102        protected Collection<TransactionArchive> getTransactionArchivesForTransactions(FeeMethod feeMethod) {
103            Collection<TransactionArchive> transactionArchives = new ArrayList(); 
104            
105            Collection incomePrincipalValues = new ArrayList();
106            incomePrincipalValues.add(EndowConstants.FeeMethod.FEE_BASE_CODE_VALUE_FOR_INCOME);
107            incomePrincipalValues.add(EndowConstants.FeeMethod.FEE_BASE_CODE_VALUE_FOR_PRINCIPAL);
108            
109            Criteria criteria = new Criteria();
110            
111            if (feeMethod.getFeeBaseCode().equalsIgnoreCase(EndowConstants.FeeMethod.FEE_BASE_CODE_VALUE_FOR_INCOME_AND_PRINCIPAL)) {
112                criteria.addIn(EndowPropertyConstants.TRANSACTION_ARCHIVE_INCOME_PRINCIPAL_INDICATOR, incomePrincipalValues);
113            }
114            else {
115                if (feeMethod.getFeeBaseCode().equalsIgnoreCase(EndowConstants.FeeMethod.FEE_BASE_CODE_VALUE_FOR_INCOME)) {
116                    criteria.addEqualTo(EndowPropertyConstants.TRANSACTION_ARCHIVE_INCOME_PRINCIPAL_INDICATOR, EndowConstants.FeeMethod.FEE_BASE_CODE_VALUE_FOR_INCOME);
117                    
118                }
119                if (feeMethod.getFeeBaseCode().equalsIgnoreCase(EndowConstants.FeeMethod.FEE_BASE_CODE_VALUE_FOR_PRINCIPAL)) {
120                    criteria.addEqualTo(EndowPropertyConstants.TRANSACTION_ARCHIVE_INCOME_PRINCIPAL_INDICATOR, EndowConstants.FeeMethod.FEE_BASE_CODE_VALUE_FOR_PRINCIPAL);
121                }
122            }
123    
124            if (feeMethod.getFeeByTransactionType() && feeMethod.getFeeByETranCode()) {
125                criteria.addIn(EndowPropertyConstants.TRANSACTION_ARCHIVE_TYPE_CODE, getTypeCodes(feeMethod.getCode()));
126                criteria.addIn(EndowPropertyConstants.TRANSACTION_ARCHIVE_ETRAN_CODE, getETranCodes(feeMethod.getCode()));
127            }
128            else {
129                if (feeMethod.getFeeByTransactionType()) {
130                    criteria.addIn(EndowPropertyConstants.TRANSACTION_ARCHIVE_TYPE_CODE, getTypeCodes(feeMethod.getCode()));
131                }
132                
133                if (feeMethod.getFeeByETranCode()) {
134                    criteria.addIn(EndowPropertyConstants.TRANSACTION_ARCHIVE_ETRAN_CODE, getETranCodes(feeMethod.getCode()));
135                }
136            }
137            
138            if (feeMethod.getFeeByTransactionType() || feeMethod.getFeeByETranCode()) {
139                criteria.addGreaterThan(EndowPropertyConstants.TRANSACTION_ARCHIVE_POSTED_DATE,feeMethod.getFeeLastProcessDate());
140            }
141    
142            QueryByCriteria query = QueryFactory.newQuery(TransactionArchive.class, criteria);
143                
144            transactionArchives = getPersistenceBrokerTemplate().getCollectionByQuery(query);
145            
146            return transactionArchives;
147        }
148            
149        /**
150         * @see org.kuali.kfs.module.endow.dataaccess.TransactionArchiveDao#getTransactionArchivesCountForTransactions(FeeMethod)
151         */
152        public long getTransactionArchivesCountForTransactions(FeeMethod feeMethod) {
153            long totalTransactionArchives = 0;
154            totalTransactionArchives = getTransactionArchivesForTransactions(feeMethod).size();
155            
156            return totalTransactionArchives;
157        }
158        
159        /**
160         * @see org.kuali.kfs.module.endow.dataaccess.TransactionArchiveDao#getTransactionArchivesIncomeCashAmountForTransactions(FeeMethod)
161         */
162        public BigDecimal getTransactionArchivesIncomeCashAmountForTransactions(FeeMethod feeMethod) {
163            BigDecimal incomeCashAmount = BigDecimal.ZERO;
164            
165            Collection<TransactionArchive> transactionArchives = new ArrayList();        
166            transactionArchives = getTransactionArchivesForTransactions(feeMethod);
167            for (TransactionArchive transactionArchive : transactionArchives) {
168                incomeCashAmount = incomeCashAmount.add(transactionArchive.getIncomeCashAmount());
169            }
170            
171            return incomeCashAmount;
172        }
173        
174        /**
175         * @see org.kuali.kfs.module.endow.dataaccess.TransactionArchiveDao#getTransactionArchivesPrincipalCashAmountForTransactions(FeeMethod)
176         */
177        public BigDecimal getTransactionArchivesPrincipalCashAmountForTransactions(FeeMethod feeMethod) {
178            BigDecimal principalCashAmount = new BigDecimal("0");
179            
180            Collection<TransactionArchive> transactionArchives = new ArrayList();        
181            transactionArchives = getTransactionArchivesForTransactions(feeMethod);
182            for (TransactionArchive transactionArchive : transactionArchives) {
183                principalCashAmount = principalCashAmount.add(transactionArchive.getPrincipalCashAmount());
184            }
185            
186            return principalCashAmount;
187        }
188        
189        /**
190         * @see org.kuali.kfs.module.endow.dataaccess.TransactionArchiveDao#getTransactionArchivesIncomeAndPrincipalCashAmountForTransactions(FeeMethod)
191         */
192        public HashMap<String, BigDecimal> getTransactionArchivesIncomeAndPrincipalCashAmountForTransactions(FeeMethod feeMethod) {
193            BigDecimal incomeCashAmount = BigDecimal.ZERO;
194            BigDecimal principalCashAmount = BigDecimal.ZERO;
195            
196            HashMap<String, BigDecimal> incomeAndPrincipalCashAmounts = new HashMap();
197            
198            incomeAndPrincipalCashAmounts.put(EndowPropertyConstants.TRANSACTION_ARCHIVE_INCOME_CASH_AMOUNT, getTransactionArchivesIncomeCashAmountForTransactions(feeMethod));
199            incomeAndPrincipalCashAmounts.put(EndowPropertyConstants.TRANSACTION_ARCHIVE_PRINCIPAL_CASH_AMOUNT, getTransactionArchivesPrincipalCashAmountForTransactions(feeMethod));
200            
201            return incomeAndPrincipalCashAmounts;
202        }
203        
204        /**
205         * @see org.kuali.kfs.module.endow.dataaccess.TransactionArchiveDao#getTransactionArchivesCountByDocumentTypeName(String, long)
206         */
207        public long getTransactionArchivesCountByDocumentTypeName(String feeMethodCode, Date transactionPostedDate) {
208            long totalTransactionArchives = 0;
209            
210            Criteria criteria = new Criteria();
211            criteria.addIn(EndowPropertyConstants.TRANSACTION_ARCHIVE_TYPE_CODE, getTypeCodes(feeMethodCode));
212            criteria.addGreaterThan(EndowPropertyConstants.TRANSACTION_ARCHIVE_POSTED_DATE, transactionPostedDate);
213            QueryByCriteria query = QueryFactory.newQuery(TransactionArchive.class, criteria);
214                
215            totalTransactionArchives = getPersistenceBrokerTemplate().getCollectionByQuery(query).size();
216            
217            return totalTransactionArchives;
218        }
219        
220        /**
221         * Gets the document Type codes for a given feeMethodCode in END_FEE_TRAN_DOC_TYP_T table
222         * @feeMethodCode FEE_MTH
223         * @return typeCodes
224         */
225        protected Collection getTypeCodes(String feeMethodCode) {
226            Collection typeCodes = new ArrayList();
227            Collection<FeeTransaction> feeTransactions = new ArrayList();        
228    
229            if (StringUtils.isNotBlank(feeMethodCode)) {        
230                Map<String, String>  crit = new HashMap<String, String>();
231                
232                if (SpringContext.getBean(DataDictionaryService.class).getAttributeForceUppercase(FeeTransaction.class, EndowPropertyConstants.FEE_METHOD_CODE)) {
233                    feeMethodCode = feeMethodCode.toUpperCase();
234                }
235                
236                Criteria criteria = new Criteria();
237                criteria.addEqualTo(EndowPropertyConstants.FEE_METHOD_CODE, feeMethodCode);
238                criteria.addEqualTo(EndowPropertyConstants.FEE_TRANSACTION_INCLUDE, EndowConstants.YES);
239                QueryByCriteria query = QueryFactory.newQuery(FeeTransaction.class, criteria);
240                
241                feeTransactions = getPersistenceBrokerTemplate().getCollectionByQuery(query);
242                for (FeeTransaction feeTransaction : feeTransactions) {
243                    typeCodes.add(feeTransaction.getDocumentTypeName());
244                }
245            }
246            
247            return typeCodes;
248        }
249        
250        /**
251         * @see org.kuali.kfs.module.endow.dataaccess.TransactionArchiveDao#getTransactionArchivesCountByETranCode(String, long)
252         */
253        public long getTransactionArchivesCountByETranCode(String feeMethodCode, Date transactionPostedDate) {
254            long totalTransactionArchives = 0;
255            
256            Criteria criteria = new Criteria();
257            criteria.addIn(EndowPropertyConstants.TRANSACTION_ARCHIVE_ETRAN_CODE, getETranCodes(feeMethodCode));
258            criteria.addGreaterThan(EndowPropertyConstants.TRANSACTION_ARCHIVE_POSTED_DATE, transactionPostedDate);
259            QueryByCriteria query = QueryFactory.newQuery(TransactionArchive.class, criteria);
260                
261            totalTransactionArchives = getPersistenceBrokerTemplate().getCollectionByQuery(query).size();
262            
263            return totalTransactionArchives;
264        }
265    
266        /**
267         * Gets the document Type codes for a given feeMethodCode in END_FEE_TRAN_DOC_TYP_T table
268         * @feeMethodCode FEE_MTH
269         * @return typeCodes
270         */
271        protected Collection getETranCodes(String feeMethodCode) {
272            Collection<FeeEndowmentTransactionCode> feeEndowmentTransactions = new ArrayList();
273            Collection etranCodes = new ArrayList();
274            
275            if (StringUtils.isNotBlank(feeMethodCode)) {        
276                Map<String, String>  crit = new HashMap<String, String>();
277                
278                if (SpringContext.getBean(DataDictionaryService.class).getAttributeForceUppercase(FeeEndowmentTransactionCode.class, EndowPropertyConstants.FEE_METHOD_CODE)) {
279                    feeMethodCode = feeMethodCode.toUpperCase();
280                }
281                
282                Criteria criteria = new Criteria();
283                criteria.addEqualTo(EndowPropertyConstants.FEE_METHOD_CODE, feeMethodCode);
284                criteria.addEqualTo(EndowPropertyConstants.FEE_ENDOWMENT_TRANSACTION_INCLUDE, EndowConstants.YES);
285                QueryByCriteria query = QueryFactory.newQuery(FeeEndowmentTransactionCode.class, criteria);
286                
287                feeEndowmentTransactions = getPersistenceBrokerTemplate().getCollectionByQuery(query);
288                for (FeeEndowmentTransactionCode feeEndowmentTransaction : feeEndowmentTransactions) {
289                    etranCodes.add(feeEndowmentTransaction.getEndowmentTransactionCode());
290                }
291            }
292                
293            return etranCodes;
294        }
295        
296        /**
297         * @see org.kuali.kfs.module.endow.dataaccess.TransactionArchiveDao#getTransactionArchivesCountByDocumentTypeNameAndETranCode(String, long)
298         */
299        public long getTransactionArchivesCountByDocumentTypeNameAndETranCode(String feeMethodCode, Date transactionPostedDate) {
300            long totalTransactionArchives = 0;
301    
302            Criteria criteria = new Criteria();
303            criteria.addIn(EndowPropertyConstants.TRANSACTION_ARCHIVE_TYPE_CODE, getTypeCodes(feeMethodCode));
304            criteria.addIn(EndowPropertyConstants.TRANSACTION_ARCHIVE_ETRAN_CODE, getETranCodes(feeMethodCode));
305            criteria.addGreaterThan(EndowPropertyConstants.TRANSACTION_ARCHIVE_POSTED_DATE, transactionPostedDate);
306            QueryByCriteria query = QueryFactory.newQuery(TransactionArchive.class, criteria);
307                
308            totalTransactionArchives = getPersistenceBrokerTemplate().getCollectionByQuery(query).size();
309            
310            return totalTransactionArchives;
311        }
312        
313        /**
314         * @see org.kuali.kfs.module.endow.dataaccess.TransactionArchiveDao#getTransactionArchivesCountByIncomeOrPrincipal(String)
315         */
316        public long getTransactionArchivesCountByIncomeOrPrincipal(String incomeOrPrincipalIndicator) {
317            long totalTransactionArchives = 0;
318    
319            Criteria criteria = new Criteria();
320            criteria.addEqualTo(EndowPropertyConstants.TRANSACTION_ARCHIVE_INCOME_PRINCIPAL_INDICATOR, incomeOrPrincipalIndicator);
321            QueryByCriteria query = QueryFactory.newQuery(TransactionArchive.class, criteria);
322                
323            totalTransactionArchives = getPersistenceBrokerTemplate().getCollectionByQuery(query).size();
324            
325            return totalTransactionArchives;
326        }
327        
328        /**
329         * @see org.kuali.kfs.module.endow.dataaccess.TransactionArchiveDao#getTransactionArchivesCountByBothIncomeAndPrincipal()
330         */
331        public long getTransactionArchivesCountByBothIncomeAndPrincipal(FeeMethod feeMethod) {
332            long totalTransactionArchives = 0;
333            
334            Collection incomePrincipalValues = new ArrayList();
335            incomePrincipalValues.add(EndowConstants.FeeMethod.FEE_BASE_CODE_VALUE_FOR_INCOME);
336            incomePrincipalValues.add(EndowConstants.FeeMethod.FEE_BASE_CODE_VALUE_FOR_PRINCIPAL);
337            
338            Criteria criteria = new Criteria();
339            criteria.addIn(EndowPropertyConstants.TRANSACTION_ARCHIVE_INCOME_PRINCIPAL_INDICATOR, incomePrincipalValues);
340    
341            if (feeMethod.getFeeByTransactionType() && feeMethod.getFeeByETranCode()) {
342                criteria.addIn(EndowPropertyConstants.TRANSACTION_ARCHIVE_TYPE_CODE, getTypeCodes(feeMethod.getCode()));
343                criteria.addIn(EndowPropertyConstants.TRANSACTION_ARCHIVE_ETRAN_CODE, getETranCodes(feeMethod.getCode()));
344            }
345            else {
346                if (feeMethod.getFeeByTransactionType()) {
347                    criteria.addIn(EndowPropertyConstants.TRANSACTION_ARCHIVE_TYPE_CODE, getTypeCodes(feeMethod.getCode()));
348                }
349                
350                if (feeMethod.getFeeByETranCode()) {
351                    criteria.addIn(EndowPropertyConstants.TRANSACTION_ARCHIVE_ETRAN_CODE, getETranCodes(feeMethod.getCode()));
352                }
353            }
354            
355            if (feeMethod.getFeeByTransactionType() || feeMethod.getFeeByETranCode()) {
356                criteria.addGreaterThan(EndowPropertyConstants.TRANSACTION_ARCHIVE_POSTED_DATE,feeMethod.getFeeLastProcessDate());
357            }
358    
359            QueryByCriteria query = QueryFactory.newQuery(TransactionArchive.class, criteria);
360                
361            totalTransactionArchives = getPersistenceBrokerTemplate().getCollectionByQuery(query).size();
362            
363            return totalTransactionArchives;
364        }
365        
366        /**
367         * @see org.kuali.kfs.module.endow.dataaccess.TransactionArchiveDao#getTransactionArchivesTotalCashActivity(String)
368         */
369        public BigDecimal getTransactionArchivesTotalCashActivity(String kemid, String securityId) {
370            BigDecimal totalCashActivity = BigDecimal.ZERO;
371            
372            Collection<TransactionArchive> transactionArchives = new ArrayList();
373            
374            Criteria criteria = new Criteria();
375    
376            if (SpringContext.getBean(DataDictionaryService.class).getAttributeForceUppercase(TransactionArchive.class, EndowPropertyConstants.TRANSACTION_ARCHIVE_KEM_ID)) {
377                kemid = kemid.toUpperCase();
378            }
379            criteria.addEqualTo(EndowPropertyConstants.TRANSACTION_ARCHIVE_KEM_ID, kemid);
380            
381            QueryByCriteria query = QueryFactory.newQuery(TransactionArchive.class, criteria);
382            transactionArchives = getPersistenceBrokerTemplate().getCollectionByQuery(query);
383            
384            for (TransactionArchive transactionArchive : transactionArchives) {
385                if (transactionArchive.getArchiveSecurity().getSecurityId().equals(securityId)) {
386                    totalCashActivity = totalCashActivity.add(transactionArchive.getIncomeCashAmount());
387                    totalCashActivity = totalCashActivity.add(transactionArchive.getPrincipalCashAmount());
388                }
389            }
390            
391            return totalCashActivity;
392        }
393    }