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.document.service.impl;
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.ClassCode;
026 import org.kuali.kfs.module.endow.businessobject.HoldingTaxLot;
027 import org.kuali.kfs.module.endow.businessobject.Security;
028 import org.kuali.kfs.module.endow.dataaccess.HoldingTaxLotDao;
029 import org.kuali.kfs.module.endow.document.service.ClassCodeService;
030 import org.kuali.kfs.module.endow.document.service.HoldingTaxLotService;
031 import org.kuali.kfs.module.endow.document.service.KEMService;
032 import org.kuali.kfs.module.endow.document.service.SecurityService;
033 import org.kuali.kfs.module.endow.util.KEMCalculationRoundingHelper;
034 import org.kuali.rice.kns.service.BusinessObjectService;
035 import org.kuali.rice.kns.util.ObjectUtils;
036 import org.springframework.transaction.annotation.Transactional;
037
038 /**
039 *
040 */
041 @Transactional
042 public class HoldingTaxLotServiceImpl implements HoldingTaxLotService {
043 protected HoldingTaxLotDao holdingTaxLotDao;
044 protected BusinessObjectService businessObjectService;
045 protected SecurityService securityService;
046 protected ClassCodeService classCodeService;
047 protected KEMService kEMService;
048
049 /**
050 * @see org.kuali.kfs.module.endow.document.service.HoldingTaxLotService#getByPrimaryKey(java.lang.String, java.lang.String,
051 * java.lang.String, int, java.lang.String)
052 */
053 public HoldingTaxLot getByPrimaryKey(String kemid, String securityId, String registrationCode, int lotNumber, String ipIndicator) {
054 Map<String, String> primaryKeys = new HashMap<String, String>();
055
056 primaryKeys.put(EndowPropertyConstants.HOLDING_TAX_LOT_KEMID, kemid);
057 primaryKeys.put(EndowPropertyConstants.HOLDING_TAX_LOT_SECURITY_ID, securityId);
058 primaryKeys.put(EndowPropertyConstants.HOLDING_TAX_LOT_REGISTRATION_CODE, registrationCode);
059 primaryKeys.put(EndowPropertyConstants.HOLDING_TAX_LOT_NUMBER, String.valueOf(lotNumber));
060 primaryKeys.put(EndowPropertyConstants.HOLDING_TAX_LOT_INCOME_PRINCIPAL_INDICATOR, ipIndicator);
061
062 return (HoldingTaxLot) businessObjectService.findByPrimaryKey(HoldingTaxLot.class, primaryKeys);
063
064 }
065
066 /**
067 * @see org.kuali.kfs.module.endow.document.service.HoldingTaxLotService#getAllTaxLots(java.lang.String, java.lang.String,
068 * java.lang.String, java.lang.String)
069 */
070 public List<HoldingTaxLot> getAllTaxLots(String kemid, String securityId, String registrationCode, String ipIndicator) {
071 Map<String, String> criteria = new HashMap<String, String>();
072
073 criteria.put(EndowPropertyConstants.HOLDING_TAX_LOT_KEMID, kemid);
074 criteria.put(EndowPropertyConstants.HOLDING_TAX_LOT_SECURITY_ID, securityId);
075 criteria.put(EndowPropertyConstants.HOLDING_TAX_LOT_REGISTRATION_CODE, registrationCode);
076 criteria.put(EndowPropertyConstants.HOLDING_TAX_LOT_INCOME_PRINCIPAL_INDICATOR, ipIndicator);
077
078 return (List<HoldingTaxLot>) businessObjectService.findMatching(HoldingTaxLot.class, criteria);
079 }
080
081 /**
082 * @see org.kuali.kfs.module.endow.document.service.HoldingTaxLotService#getAllTaxLots()
083 */
084 public List<HoldingTaxLot> getAllTaxLots() {
085 return (List<HoldingTaxLot>) businessObjectService.findAll(HoldingTaxLot.class);
086 }
087
088 /**
089 * @see org.kuali.kfs.module.endow.document.service.HoldingTaxLotService#getAllTaxLotsOrderByAcquiredDate(java.lang.String,
090 * java.lang.String, java.lang.String, java.lang.String, boolean)
091 */
092 public List<HoldingTaxLot> getAllTaxLotsOrderByAcquiredDate(String kemid, String securityId, String registrationCode, String ipIndicator, boolean sortAscending) {
093 Map<String, String> criteria = new HashMap<String, String>();
094
095 criteria.put(EndowPropertyConstants.HOLDING_TAX_LOT_KEMID, kemid);
096 criteria.put(EndowPropertyConstants.HOLDING_TAX_LOT_SECURITY_ID, securityId);
097 criteria.put(EndowPropertyConstants.HOLDING_TAX_LOT_REGISTRATION_CODE, registrationCode);
098 criteria.put(EndowPropertyConstants.HOLDING_TAX_LOT_INCOME_PRINCIPAL_INDICATOR, ipIndicator);
099
100 return (List<HoldingTaxLot>) businessObjectService.findMatchingOrderBy(HoldingTaxLot.class, criteria, EndowPropertyConstants.HOLDING_TAX_LOT_ACQUIRED_DATE, sortAscending);
101 }
102
103 /**
104 * Gets all tax lots on the following criteria: kemId and IPIndicator.
105 *
106 * @param kemid
107 * @param ipIndicator
108 * @return a list of tax lots that meet the criteria
109 */
110 public List<HoldingTaxLot> getAllTaxLotsByKemIdAdndIPIndicator(String kemid, String ipIndicator) {
111 Map<String, String> criteria = new HashMap<String, String>();
112
113 criteria.put(EndowPropertyConstants.HOLDING_TAX_LOT_KEMID, kemid);
114 criteria.put(EndowPropertyConstants.HOLDING_TAX_LOT_INCOME_PRINCIPAL_INDICATOR, ipIndicator);
115
116 return (List<HoldingTaxLot>) businessObjectService.findMatching(HoldingTaxLot.class, criteria);
117 }
118
119 /**
120 * @see org.kuali.kfs.module.endow.document.service.HoldingTaxLotService#getAllTaxLotsWithPositiveUnits(java.lang.String,
121 * java.lang.String, java.lang.String, java.lang.String)
122 */
123 public List<HoldingTaxLot> getAllTaxLotsWithPositiveUnits(String kemid, String securityId, String registrationCode, String ipIndicator) {
124 return (List<HoldingTaxLot>) holdingTaxLotDao.getAllTaxLotsWithPositiveUnits(kemid, securityId, registrationCode, ipIndicator);
125 }
126
127 /**
128 * @see org.kuali.kfs.module.endow.document.service.HoldingTaxLotService#getAllTaxLotsWithPositiveCost(java.lang.String,
129 * java.lang.String, java.lang.String, java.lang.String)
130 */
131 public List<HoldingTaxLot> getAllTaxLotsWithPositiveCost(String kemid, String securityId, String registrationCode, String ipIndicator) {
132 return (List<HoldingTaxLot>) holdingTaxLotDao.getAllTaxLotsWithPositiveCost(kemid, securityId, registrationCode, ipIndicator);
133 }
134
135 /**
136 * @see org.kuali.kfs.module.endow.document.service.HoldingTaxLotService#getClassCodeType(String) Gets class code type based on
137 * securityId. Based on security ID, you search END_SEC_T Table to get END_SEC_T:SEC_CLS_CD, then, based on class code, you
138 * search END_CLS_CD_T, to get END_CLS_CD_T:CLS_CD_TYP
139 * @param id
140 * @return class code type
141 */
142 public String getClassCodeType(String securityId) {
143 String classCodeType = null;
144
145 Security security = securityService.getByPrimaryKey(securityId);
146
147 if (ObjectUtils.isNull(security)) {
148 throw new RuntimeException("Object Null: Unable to get Security Object for Security Id: " + securityId);
149 }
150
151 ClassCode classCode = classCodeService.getByPrimaryKey(security.getSecurityClassCode());
152
153 return classCode.getClassCodeType();
154 }
155
156 /**
157 * @see org.kuali.kfs.module.endow.document.service.HoldingTaxLotService#getMarketValueForCashEquivalentsForAvailableIncomeCash()
158 * The Market Value of the KEMID END_HLDG_TAX_LOT_T records with a CLS_CD_TYP of Cash Equivalents (C), and with the
159 * HLDG_IP_IND equal to I.
160 * @return marketValue
161 */
162 public BigDecimal getMarketValueForCashEquivalentsForAvailableIncomeCash(String kemId) {
163 BigDecimal marketValue = BigDecimal.ZERO;
164
165 List<HoldingTaxLot> holdingTaxLots = getAllTaxLotsByKemIdAdndIPIndicator(kemId, EndowConstants.IncomePrincipalIndicator.INCOME);
166 for (HoldingTaxLot holdingTaxLot : holdingTaxLots) {
167 // using sec_cd, get the class type code....
168 if (getClassCodeType(holdingTaxLot.getSecurityId()).equalsIgnoreCase(EndowConstants.ClassCodeTypes.CASH_EQUIVALENTS)) {
169 marketValue = marketValue.add(holdingTaxLot.getMarketValue());
170 }
171 }
172
173 return marketValue;
174 }
175
176 /**
177 * @see org.kuali.kfs.module.endow.document.service.HoldingTaxLotService#getMarketValueForPooledInvestmentForAvailableIncomeCash()
178 * The Market Value of the KEMID END_HLDG_TAX_LOT_T records with a CLS_CD_TYP of Pooled Investment (P) and with the
179 * HLDG_IP_IND equal to I times the value in the Available Cash Percent institutional parameter (accounts for only a
180 * percentage of the market value allowing for pricing changes).
181 * @return marketValue
182 */
183 public BigDecimal getMarketValueForPooledInvestmentForAvailableIncomeCash(String kemId) {
184 BigDecimal marketValue = BigDecimal.ZERO;
185
186 BigDecimal availableCashPercent = kEMService.getAvailableCashPercent();
187
188 List<HoldingTaxLot> holdingTaxLots = getAllTaxLotsByKemIdAdndIPIndicator(kemId, EndowConstants.IncomePrincipalIndicator.INCOME);
189 for (HoldingTaxLot holdingTaxLot : holdingTaxLots) {
190 // using sec_cd, get the class type code and if class code type = POOLED_INVESTMENT then multiply the market value with
191 // percent
192 if (getClassCodeType(holdingTaxLot.getSecurityId()).equalsIgnoreCase(EndowConstants.ClassCodeTypes.POOLED_INVESTMENT)) {
193 marketValue = marketValue.add(KEMCalculationRoundingHelper.multiply(holdingTaxLot.getMarketValue(), availableCashPercent, EndowConstants.Scale.SECURITY_MARKET_VALUE));
194 }
195 }
196
197 return marketValue;
198 }
199
200
201 /**
202 * @see org.kuali.kfs.module.endow.document.service.HoldingTaxLotService#getMarketValueForCashEquivalentsForAvailablePrincipalCash()
203 * The Market Value of the KEMID END_HLDG_TAX_LOT_T records with a CLS_CD_TYP of Cash Equivalents (C), and with the
204 * HLDG_IP_IND equal to P.
205 * @return marketValue
206 */
207 public BigDecimal getMarketValueForCashEquivalentsForAvailablePrincipalCash(String kemId) {
208 BigDecimal marketValue = BigDecimal.ZERO;
209
210 List<HoldingTaxLot> holdingTaxLots = getAllTaxLotsByKemIdAdndIPIndicator(kemId, EndowConstants.IncomePrincipalIndicator.PRINCIPAL);
211 for (HoldingTaxLot holdingTaxLot : holdingTaxLots) {
212 // using sec_cd, get the class type code....
213 if (getClassCodeType(holdingTaxLot.getSecurityId()).equalsIgnoreCase(EndowConstants.ClassCodeTypes.CASH_EQUIVALENTS)) {
214 marketValue = marketValue.add(holdingTaxLot.getMarketValue());
215 }
216 }
217
218 return marketValue;
219
220 }
221
222 /**
223 * @see org.kuali.kfs.module.endow.document.service.HoldingTaxLotService#getMarketValueForPooledInvestmentForAvailablePrincipalCash()
224 * The Market Value of the KEMID END_HLDG_TAX_LOT_T records with a CLS_CD_TYP of Pooled Investment (P) and with the
225 * HLDG_IP_IND equal to I times the value in the Available Cash Percent institutional parameter (accounts for only a
226 * percentage of the market value allowing for pricing changes).
227 * @return marketValue
228 */
229 public BigDecimal getMarketValueForPooledInvestmentForAvailablePrincipalCash(String kemId) {
230 BigDecimal marketValue = BigDecimal.ZERO;
231
232 BigDecimal availableCashPercent = kEMService.getAvailableCashPercent();
233
234 List<HoldingTaxLot> holdingTaxLots = getAllTaxLotsByKemIdAdndIPIndicator(kemId, EndowConstants.IncomePrincipalIndicator.PRINCIPAL);
235 for (HoldingTaxLot holdingTaxLot : holdingTaxLots) {
236 // using sec_cd, get the class type code and if class code type = POOLED_INVESTMENT then multiply the market value with
237 // percent
238 if (getClassCodeType(holdingTaxLot.getSecurityId()).equalsIgnoreCase(EndowConstants.ClassCodeTypes.POOLED_INVESTMENT)) {
239 marketValue = marketValue.add(KEMCalculationRoundingHelper.multiply(holdingTaxLot.getMarketValue(), availableCashPercent, EndowConstants.Scale.SECURITY_MARKET_VALUE));
240 }
241 }
242
243 return marketValue;
244 }
245
246 /**
247 * @see org.kuali.kfs.module.endow.document.service.HoldingTaxLotService#getAllTaxLotsWithAccruedIncomeGreaterThanZeroPerSecurity(java.lang.String)
248 */
249 public List<HoldingTaxLot> getAllTaxLotsWithAccruedIncomeGreaterThanZeroPerSecurity(String securityId) {
250
251 return holdingTaxLotDao.getTaxLotsWithAccruedIncomeGreaterThanZeroPerSecurity(securityId);
252
253 }
254
255 /**
256 * @see org.kuali.kfs.module.endow.document.service.HoldingTaxLotService#getTaxLotsPerSecurityIDWithUnitsGreaterThanZero(java.lang.String)
257 */
258 public List<HoldingTaxLot> getTaxLotsPerSecurityIDWithUnitsGreaterThanZero(String securityId) {
259 return holdingTaxLotDao.getTaxLotsPerSecurityIDWithUnitsGreaterThanZero(securityId);
260 }
261
262 /**
263 * @see org.kuali.kfs.module.endow.document.service.HoldingTaxLotService#removeAllHoldingTaxLots()
264 */
265 public boolean removeAllHoldingTaxLots() {
266 boolean success = true;
267
268 List<HoldingTaxLot> allTaxLots = getAllTaxLots();
269 for (HoldingTaxLot holdingTaxLot : allTaxLots) {
270 businessObjectService.delete(holdingTaxLot);
271 }
272
273 return success;
274 }
275
276 /**
277 * Gets the businessObjectService.
278 *
279 * @return businessObjectService
280 */
281 protected BusinessObjectService getBusinessObjectService() {
282 return businessObjectService;
283 }
284
285 /**
286 * Sets the businessObjectService.
287 *
288 * @param businessObjectService
289 */
290 public void setBusinessObjectService(BusinessObjectService businessObjectService) {
291 this.businessObjectService = businessObjectService;
292 }
293
294 /**
295 * Gets the holdingTaxLotDao.
296 *
297 * @return holdingTaxLotDao
298 */
299 protected HoldingTaxLotDao getHoldingTaxLotDao() {
300 return holdingTaxLotDao;
301 }
302
303 /**
304 * Sets the holdingTaxLotDao.
305 *
306 * @param holdingTaxLotDao
307 */
308 public void setHoldingTaxLotDao(HoldingTaxLotDao holdingTaxLotDao) {
309 this.holdingTaxLotDao = holdingTaxLotDao;
310 }
311
312 /**
313 * Gets the securityService.
314 *
315 * @return securityService
316 */
317 protected SecurityService getSecurityService() {
318 return securityService;
319 }
320
321 /**
322 * Sets the securityService.
323 *
324 * @param securityService
325 */
326 public void setSecurityService(SecurityService securityService) {
327 this.securityService = securityService;
328 }
329
330 /**
331 * Gets the classCodeService.
332 *
333 * @return classCodeService
334 */
335 protected ClassCodeService getClassCodeService() {
336 return classCodeService;
337 }
338
339 /**
340 * Sets the classCodeService.
341 *
342 * @param classCodeService
343 */
344 public void setClassCodeService(ClassCodeService classCodeService) {
345 this.classCodeService = classCodeService;
346 }
347
348 /**
349 * gets the kEMService.
350 *
351 * @param kEMService
352 */
353 protected KEMService getkEMService() {
354 return kEMService;
355 }
356
357 /**
358 * Sets the kEMService.
359 *
360 * @param kEMService
361 */
362 public void setkEMService(KEMService kEMService) {
363 this.kEMService = kEMService;
364 }
365
366 }