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.sql.Date; 020 import java.util.HashMap; 021 import java.util.List; 022 import java.util.Map; 023 024 import org.apache.commons.lang.StringUtils; 025 import org.kuali.kfs.module.endow.EndowConstants; 026 import org.kuali.kfs.module.endow.EndowPropertyConstants; 027 import org.kuali.kfs.module.endow.businessobject.ClassCode; 028 import org.kuali.kfs.module.endow.businessobject.Security; 029 import org.kuali.kfs.module.endow.dataaccess.SecurityDao; 030 import org.kuali.kfs.module.endow.document.service.KEMService; 031 import org.kuali.kfs.module.endow.document.service.SecurityService; 032 import org.kuali.kfs.module.endow.util.KEMCalculationRoundingHelper; 033 import org.kuali.kfs.sys.context.SpringContext; 034 import org.kuali.kfs.sys.service.NonTransactional; 035 import org.kuali.rice.kns.service.BusinessObjectService; 036 import org.kuali.rice.kns.service.DataDictionaryService; 037 import org.kuali.rice.kns.util.ObjectUtils; 038 import org.springframework.transaction.annotation.Transactional; 039 040 /** 041 * This class provides service for Security maintenance 042 */ 043 @NonTransactional 044 public class SecurityServiceImpl implements SecurityService { 045 046 private KEMService kemService; 047 private BusinessObjectService businessObjectService; 048 private SecurityDao securityDao; 049 050 051 /** 052 * @see org.kuali.kfs.module.endow.document.service.PooledFundControlService#getByPrimaryKey(java.lang.String) 053 */ 054 public Security getByPrimaryKey(String id) { 055 Security security = null; 056 if (StringUtils.isNotBlank(id)) { 057 Map criteria = new HashMap(); 058 059 if (SpringContext.getBean(DataDictionaryService.class).getAttributeForceUppercase(Security.class, EndowPropertyConstants.SECURITY_ID)) { 060 id = id.toUpperCase(); 061 } 062 063 criteria.put("id", id); 064 065 security = (Security) businessObjectService.findByPrimaryKey(Security.class, criteria); 066 } 067 return security; 068 } 069 070 /** 071 * @see org.kuali.kfs.module.endow.document.service.SecurityService#updateUnitValue(org.kuali.kfs.module.endow.businessobject.Security, 072 * java.math.BigDecimal, java.sql.Date, java.lang.String) 073 */ 074 public Security updateUnitValue(Security security, BigDecimal newUnitValue, Date newValueDate, String newUnitValueSource) { 075 BigDecimal oldUnitValue = security.getUnitValue(); 076 security.setPreviousUnitValue(oldUnitValue); 077 security.setUnitValue(newUnitValue); 078 079 Date oldValuationDate = security.getValuationDate(); 080 security.setPreviousUnitValueDate(oldValuationDate); 081 security.setValuationDate(newValueDate); 082 083 security.setUnitValueSource(newUnitValueSource); 084 085 return security; 086 087 } 088 089 /** 090 * This method will update the interest rate or amount 091 * 092 * @return Security the update security object 093 */ 094 public Security updateInterestRate(Security security, BigDecimal interestRate) { 095 security.setIncomeRate(interestRate); 096 return security; 097 } 098 099 /** 100 * @see org.kuali.kfs.module.endow.document.service.SecurityService#computeValueBasedOnValuationMethod(org.kuali.kfs.module.endow.businessobject.Security) 101 */ 102 public void computeValueBasedOnValuationMethod(Security security) { 103 ClassCode classCode = security.getClassCode(); 104 105 if (ObjectUtils.isNotNull(classCode)) { 106 if (EndowConstants.ValuationMethod.UNITS.equalsIgnoreCase((classCode.getValuationMethod()))) { 107 BigDecimal marketValue = getSecurityMarketValue(security); 108 security.setMarketValue(marketValue); 109 } 110 else if (EndowConstants.ValuationMethod.MARKET.equalsIgnoreCase((classCode.getValuationMethod()))) { 111 BigDecimal unitValue = getSecurityUnitValue(security); 112 security.setUnitValue(unitValue); 113 } 114 } 115 116 } 117 118 /** 119 * @see org.kuali.kfs.module.endow.document.service.SecurityService#updateIncomeChangeDate(java.lang.String) 120 */ 121 public Security updateIncomeChangeDate(Security security) { 122 java.sql.Date currentDate = kemService.getCurrentDate(); 123 if (ObjectUtils.isNotNull(security)) { 124 security.setIncomeChangeDate(currentDate); 125 } 126 return security; 127 } 128 129 /** 130 * Computes the market value. 131 * 132 * @param security the security for which we calculate the market value 133 * @return the computed market value 134 */ 135 public BigDecimal getSecurityMarketValue(Security security) { 136 BigDecimal marketValue = BigDecimal.ZERO; 137 String securityId = security.getId(); 138 139 if (ObjectUtils.isNotNull(securityId)) { 140 marketValue = kemService.getMarketValue(securityId); 141 } 142 143 return marketValue; 144 } 145 146 147 /** 148 * Computes the unit value based on the market value. 149 * 150 * @param security the security for which we calculate the unit value 151 * @return the computed unit value 152 */ 153 public BigDecimal getSecurityUnitValue(Security security) { 154 BigDecimal marketValue = security.getMarketValue(); 155 BigDecimal unitsHeld = security.getUnitsHeld(); 156 BigDecimal unitValue = BigDecimal.ZERO; 157 ClassCode classCode = security.getClassCode(); 158 159 if (ObjectUtils.isNotNull(classCode) && ObjectUtils.isNotNull(unitValue) && ObjectUtils.isNotNull(unitsHeld) && unitsHeld.compareTo(BigDecimal.ZERO) != 0) { 160 if (EndowConstants.ClassCodeTypes.BOND.equalsIgnoreCase(classCode.getClassCodeType())) { 161 unitValue = KEMCalculationRoundingHelper.divide((marketValue.multiply(new BigDecimal(100))), unitsHeld, EndowConstants.Scale.SECURITY_UNIT_VALUE); 162 } 163 else { 164 unitValue = KEMCalculationRoundingHelper.divide(marketValue, unitsHeld, EndowConstants.Scale.SECURITY_UNIT_VALUE); 165 } 166 } 167 168 return unitValue; 169 } 170 171 /** 172 * @see org.kuali.kfs.module.endow.document.service.SecurityService#getSecuritiesByClassCodeWithUnitsGreaterThanZero(java.util.List) 173 */ 174 public List<Security> getSecuritiesByClassCodeWithUnitsGreaterThanZero(List<String> classCodes) { 175 176 return securityDao.getSecuritiesByClassCodeWithUnitsGreaterThanZero(classCodes); 177 } 178 179 180 /** 181 * Gets the kemService. 182 * 183 * @return kemService 184 */ 185 public KEMService getKemService() { 186 return kemService; 187 } 188 189 /** 190 * Sets the kemService. 191 * 192 * @param kemService 193 */ 194 public void setKemService(KEMService kemService) { 195 this.kemService = kemService; 196 } 197 198 /** 199 * This method gets the businessObjectService. 200 * 201 * @return businessObjectService 202 */ 203 public BusinessObjectService getBusinessObjectService() { 204 return businessObjectService; 205 } 206 207 /** 208 * This method sets the businessObjectService 209 * 210 * @param businessObjectService 211 */ 212 public void setBusinessObjectService(BusinessObjectService businessObjectService) { 213 this.businessObjectService = businessObjectService; 214 } 215 216 /** 217 * Sets the securityDao. 218 * 219 * @param securityDao 220 */ 221 public void setSecurityDao(SecurityDao securityDao) { 222 this.securityDao = securityDao; 223 } 224 225 }