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;
017
018 import java.math.BigDecimal;
019 import java.sql.Date;
020 import java.util.Map;
021
022 import org.apache.commons.lang.ObjectUtils;
023 import org.kuali.kfs.module.endow.EndowConstants;
024 import org.kuali.kfs.module.endow.businessobject.Security;
025 import org.kuali.kfs.module.endow.document.service.KEMService;
026 import org.kuali.kfs.module.endow.util.KEMCalculationRoundingHelper;
027 import org.kuali.kfs.sys.KFSConstants;
028 import org.kuali.kfs.sys.context.SpringContext;
029 import org.kuali.kfs.sys.document.FinancialSystemMaintenanceDocument;
030 import org.kuali.rice.kew.exception.WorkflowException;
031 import org.kuali.rice.kim.bo.Person;
032 import org.kuali.rice.kns.bo.DocumentHeader;
033 import org.kuali.rice.kns.document.MaintenanceDocument;
034 import org.kuali.rice.kns.maintenance.KualiMaintainableImpl;
035 import org.kuali.rice.kns.service.DocumentService;
036 import org.kuali.rice.kns.util.GlobalVariables;
037 import org.kuali.rice.kns.workflow.service.KualiWorkflowDocument;
038 import org.springframework.util.StringUtils;
039
040 public class SecurityMaintainableImpl extends KualiMaintainableImpl {
041
042 private Security oldSecurity;
043 private Security newSecurity;
044
045 /**
046 * @see org.kuali.rice.kns.maintenance.KualiMaintainableImpl#doRouteStatusChange(org.kuali.rice.kns.bo.DocumentHeader)
047 */
048 @Override
049 public void doRouteStatusChange(DocumentHeader documentHeader) {
050 super.doRouteStatusChange(documentHeader);
051
052 KualiWorkflowDocument workflowDoc = documentHeader.getWorkflowDocument();
053 DocumentService documentService = SpringContext.getBean(DocumentService.class);
054 FinancialSystemMaintenanceDocument maintDoc = null;
055
056 try {
057 maintDoc = (FinancialSystemMaintenanceDocument) documentService.getByDocumentHeaderId(this.documentNumber);
058 }
059 catch (WorkflowException e) {
060 throw new RuntimeException(e);
061 }
062
063 initializeAttributes(maintDoc);
064
065 // This code is only executed when the final approval occurs
066 if (workflowDoc.stateIsProcessed()) {
067
068 // if user changed unit price, copy old unit price in previous unit value
069 if (!ObjectUtils.equals(newSecurity.getUnitValue(), oldSecurity.getUnitValue())) {
070
071 newSecurity.setPreviousUnitValue(oldSecurity.getUnitValue());
072
073 // the unit value source is populated with the name of the individual that initiated the change
074 Person currentUser = GlobalVariables.getUserSession().getPerson();
075 newSecurity.setUnitValueSource(currentUser.getName());
076 }
077
078 // if unit value date is changed copy old unit value in previous unit value
079 if (!ObjectUtils.equals(newSecurity.getValuationDate(), oldSecurity.getValuationDate())) {
080
081 newSecurity.setPreviousUnitValueDate(oldSecurity.getValuationDate());
082 }
083
084 // when dividend amount is changed take the new value times 4 and apply to income rate
085 if (!ObjectUtils.equals(newSecurity.getDividendAmount(), oldSecurity.getDividendAmount())) {
086 if (newSecurity.getDividendAmount() == null) {
087 newSecurity.setIncomeRate(null);
088 }
089 else {
090 // ensure calculation rounding rules
091 BigDecimal newIncomeRate = KEMCalculationRoundingHelper.multiply(newSecurity.getDividendAmount(), new BigDecimal(4), EndowConstants.Scale.SECURITY_INCOME_RATE);
092 newSecurity.setIncomeRate(newIncomeRate);
093 }
094 // set the last income change date to the current process date
095 KEMService kemService = SpringContext.getBean(KEMService.class);
096 Date currentDate = kemService.getCurrentDate();
097 newSecurity.setIncomeChangeDate(currentDate);
098
099 }
100
101 //KFSMI-6674
102 //If SEC_INC_PAY_FREQ entered then the SEC_INC_NEXT_PAY_DT is
103 //automatically calculated.
104 //if class code type is stocks and SEC_DIV_PAY_DT is entered then
105 //copy the date value to SEC_INC_NEXT_PAY_DT.
106 //We do not want to overwrite the date if it already exists.
107 if (EndowConstants.ClassCodeTypes.STOCKS.equalsIgnoreCase(newSecurity.getClassCode().getClassCodeType())) {
108 if (newSecurity.getDividendPayDate() != null) {
109 newSecurity.setIncomeNextPayDate(newSecurity.getDividendPayDate());
110 }
111 }
112 }
113 }
114
115 /**
116 * @see org.kuali.rice.kns.maintenance.KualiMaintainableImpl#processAfterCopy(org.kuali.rice.kns.document.MaintenanceDocument,
117 * java.util.Map)
118 */
119 @Override
120 public void processAfterCopy(MaintenanceDocument arg0, Map<String, String[]> arg1) {
121 super.processAfterCopy(arg0, arg1);
122
123 initializeAttributes(arg0);
124
125 // set old userEnteredSecurityIDprefix to the whole security ID so that all 9 digits are displayed on the copy screen
126 oldSecurity.setUserEnteredSecurityIDprefix(oldSecurity.getId());
127
128 newSecurity.refreshNonUpdateableReferences();
129
130 // clear fields for copy as we want only certain fields to be copied over
131 newSecurity.setDescription(KFSConstants.EMPTY_STRING);
132 newSecurity.setTickerSymbol(KFSConstants.EMPTY_STRING);
133 newSecurity.setUnitValue(null);
134 newSecurity.setUnitsHeld(null);
135 newSecurity.setValuationDate(null);
136 newSecurity.setUnitValueSource(KFSConstants.EMPTY_STRING);
137 newSecurity.setPreviousUnitValue(null);
138 newSecurity.setPreviousUnitValueDate(null);
139 newSecurity.setCarryValue(null);
140 newSecurity.setMarketValue(null);
141 newSecurity.setSecurityValueByMarket(null);
142 newSecurity.setLastTransactionDate(null);
143 newSecurity.setIncomeNextPayDate(null);
144 // newSecurity.setIncomeRate(null);
145 newSecurity.setIncomeChangeDate(null);
146 newSecurity.setDividendRecordDate(null);
147 newSecurity.setExDividendDate(null);
148 newSecurity.setDividendPayDate(null);
149 newSecurity.setDividendAmount(null);
150 newSecurity.setNextFiscalYearDistributionAmount(null);
151 }
152
153 /**
154 * Initializes newSecurity and oldSecurity.
155 *
156 * @param document
157 */
158 private void initializeAttributes(MaintenanceDocument document) {
159 if (newSecurity == null) {
160 newSecurity = (Security) document.getNewMaintainableObject().getBusinessObject();
161 }
162 if (oldSecurity == null) {
163 oldSecurity = (Security) document.getOldMaintainableObject().getBusinessObject();
164 }
165 }
166
167 }