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.businessobject.lookup; 017 018 import java.math.BigDecimal; 019 import java.util.HashMap; 020 import java.util.List; 021 import java.util.Map; 022 023 import org.kuali.kfs.module.endow.EndowConstants; 024 import org.kuali.kfs.module.endow.EndowPropertyConstants; 025 import org.kuali.kfs.module.endow.businessobject.IncomePrincipalIndicator; 026 import org.kuali.kfs.module.endow.businessobject.KEMIDCurrentBalanceDetail; 027 import org.kuali.kfs.module.endow.businessobject.KemidCurrentCash; 028 import org.kuali.kfs.module.endow.document.service.impl.KemidCurrentCashServiceImpl; 029 import org.kuali.kfs.sys.context.SpringContext; 030 import org.kuali.rice.kns.bo.BusinessObject; 031 import org.kuali.rice.kns.lookup.KualiLookupableHelperServiceImpl; 032 import org.kuali.rice.kns.util.ObjectUtils; 033 034 public class KEMIDCurrentBalanceDetailLookupableHelperService extends KualiLookupableHelperServiceImpl { 035 036 /** 037 * @see org.kuali.rice.kns.lookup.KualiLookupableHelperServiceImpl#getSearchResults(java.util.Map) 038 */ 039 public List<? extends BusinessObject> getSearchResults(Map<String, String> fieldValues) { 040 List<KEMIDCurrentBalanceDetail> results = (List<KEMIDCurrentBalanceDetail>) super.getSearchResults(fieldValues); 041 042 // check if there are entries with a CSHEQ reporting group in the results list 043 boolean incCashEq = false; 044 boolean princCashEq = false; 045 046 for (KEMIDCurrentBalanceDetail balanceDetail : results) { 047 if (EndowConstants.SecurityReportingGroups.CASH_EQUIVALENTS.equalsIgnoreCase(balanceDetail.getReportingGroupCode())) { 048 049 if (EndowConstants.IncomePrincipalIndicator.INCOME.equalsIgnoreCase(balanceDetail.getIncomePrincipalIndicator())) { 050 incCashEq = true; 051 } 052 else if (EndowConstants.IncomePrincipalIndicator.PRINCIPAL.equalsIgnoreCase(balanceDetail.getIncomePrincipalIndicator())) { 053 princCashEq = true; 054 } 055 056 if (incCashEq && princCashEq) { 057 break; 058 } 059 } 060 } 061 062 if (!incCashEq || !princCashEq) { 063 String kemid = fieldValues.get(EndowPropertyConstants.KEMID); 064 // check if there is current income/principal cash 065 KemidCurrentCashServiceImpl kemidCurrentCashService = SpringContext.getBean(KemidCurrentCashServiceImpl.class); 066 KemidCurrentCash currentCash = kemidCurrentCashService.getByPrimaryKey(kemid); 067 068 if (ObjectUtils.isNotNull(currentCash)) { 069 // if there is an entry in the current cash for the kemid, and there is income current cash but there were no 070 // holdings for this kemid for CSHEQ reporting group add a new entry in the results list to show the current income 071 // cash 072 if (!incCashEq && currentCash.getCurrentIncomeCash().isNonZero()) { 073 KEMIDCurrentBalanceDetail balanceDetail = createCurrentBalanceDetailForCSHEQ(kemid, EndowConstants.IncomePrincipalIndicator.INCOME, currentCash); 074 075 results.add(balanceDetail); 076 } 077 078 // if there is an entry in the current cash for the kemid, and there is principal current cash but there were no 079 // holdings for this kemid for CSHEQ reporting group add a new entry in the results list to show the current 080 // principal cash 081 if (!princCashEq && currentCash.getCurrentPrincipalCash().isNonZero()) { 082 KEMIDCurrentBalanceDetail balanceDetail = createCurrentBalanceDetailForCSHEQ(kemid, EndowConstants.IncomePrincipalIndicator.PRINCIPAL, currentCash); 083 084 results.add(balanceDetail); 085 } 086 } 087 } 088 089 return results; 090 } 091 092 /** 093 * Creates a new KEMIDCurrentBalanceDetail for CSHEQ reporting group. This method is used when there is an entry in the current 094 * cash for the kemid but there are no holdings. 095 * 096 * @param kemid 097 * @param incomeOrPrincipal 098 * @param currentCash 099 * @return a new KEMIDCurrentBalanceDetail 100 */ 101 private KEMIDCurrentBalanceDetail createCurrentBalanceDetailForCSHEQ(String kemid, String incomeOrPrincipal, KemidCurrentCash currentCash) { 102 103 KEMIDCurrentBalanceDetail balanceDetail = new KEMIDCurrentBalanceDetail(); 104 105 balanceDetail.setKemid(kemid); 106 balanceDetail.setReportingGroupCode(EndowConstants.SecurityReportingGroups.CASH_EQUIVALENTS); 107 balanceDetail.setIncomePrincipalIndicator(incomeOrPrincipal); 108 109 110 if (EndowConstants.IncomePrincipalIndicator.INCOME.equalsIgnoreCase(incomeOrPrincipal)) { 111 balanceDetail.setValueAtMarket(currentCash.getCurrentIncomeCash().bigDecimalValue()); 112 } 113 else { 114 balanceDetail.setValueAtMarket(currentCash.getCurrentPrincipalCash().bigDecimalValue()); 115 } 116 117 Map<String, String> keys = new HashMap<String, String>(); 118 keys.put(EndowPropertyConstants.KUALICODEBASE_CODE, incomeOrPrincipal); 119 IncomePrincipalIndicator incomePrincipalIndicator = (IncomePrincipalIndicator) businessObjectService.findByPrimaryKey(IncomePrincipalIndicator.class, keys); 120 balanceDetail.setIpIndicator(incomePrincipalIndicator); 121 122 balanceDetail.setAnnualEstimatedIncome(BigDecimal.ZERO.setScale(2)); 123 balanceDetail.setNextFYEstimatedIncome(BigDecimal.ZERO.setScale(2)); 124 balanceDetail.setRemainderOfFYEstimatedIncome(BigDecimal.ZERO.setScale(2)); 125 126 balanceDetail.setNoDrillDownOnMarketVal(true); 127 128 return balanceDetail; 129 } 130 }