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    }