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.authorization;
017    
018    import java.util.Set;
019    
020    import org.apache.commons.lang.StringUtils;
021    import org.kuali.kfs.module.endow.EndowConstants;
022    import org.kuali.kfs.module.endow.EndowPropertyConstants;
023    import org.kuali.kfs.module.endow.businessobject.ClassCode;
024    import org.kuali.kfs.module.endow.businessobject.Security;
025    import org.kuali.kfs.module.endow.document.service.impl.FrequencyCodeServiceImpl;
026    import org.kuali.kfs.sys.context.SpringContext;
027    import org.kuali.kfs.sys.document.authorization.FinancialSystemMaintenanceDocumentPresentationControllerBase;
028    import org.kuali.rice.kew.util.KEWConstants;
029    import org.kuali.rice.kns.bo.BusinessObject;
030    import org.kuali.rice.kns.document.MaintenanceDocument;
031    import org.kuali.rice.kns.util.KNSConstants;
032    
033    public class SecurityDocumentPresentationController extends FinancialSystemMaintenanceDocumentPresentationControllerBase {
034    
035        /**
036         * @see org.kuali.rice.kns.document.authorization.MaintenanceDocumentPresentationControllerBase#getConditionallyHiddenPropertyNames(org.kuali.rice.kns.bo.BusinessObject)
037         */
038        @Override
039        public Set<String> getConditionallyHiddenPropertyNames(BusinessObject businessObject) {
040            Set<String> fields = super.getConditionallyHiddenPropertyNames(businessObject);
041            MaintenanceDocument document = (MaintenanceDocument) businessObject;
042            Security security = (Security) document.getNewMaintainableObject().getBusinessObject();
043            String incomePayFrequencyCode = security.getIncomePayFrequency();
044            
045            if (StringUtils.isNotEmpty(incomePayFrequencyCode)) {
046                FrequencyCodeServiceImpl frequencyCodeServiceImpl = (FrequencyCodeServiceImpl) SpringContext.getBean(FrequencyCodeServiceImpl.class);
047                security.setIncomeNextPayDate(frequencyCodeServiceImpl.calculateProcessDate(incomePayFrequencyCode));
048            }
049            //KFSMI-6674
050            //If SEC_INC_PAY_FREQ entered then the SEC_INC_NEXT_PAY_DT is 
051            //automatically calculated.
052            //if class code type is stocks and SEC_DIV_PAY_DT is entered then 
053            //copy the date value to SEC_INC_NEXT_PAY_DT.
054            //We do not want to overwrite the date if it already exists.
055            if (EndowConstants.ClassCodeTypes.STOCKS.equalsIgnoreCase(security.getClassCode().getClassCodeType())) {
056                if (security.getDividendPayDate() != null) {
057                    security.setIncomeNextPayDate(security.getDividendPayDate());
058                }
059            }
060    
061            // when we create or copy a new Security, only certain fields are displayed; the following code is used to hide the unwanted
062            // fields
063            if (KNSConstants.MAINTENANCE_NEW_ACTION.equals(document.getNewMaintainableObject().getMaintenanceAction()) || KNSConstants.MAINTENANCE_COPY_ACTION.equals(document.getNewMaintainableObject().getMaintenanceAction())) {
064    
065                // the security ID hidded on creation and a dummy field is used for user input (userEnteredSecurityIDprefix)
066                String routeStatus = document.getDocumentHeader().getWorkflowDocument().getRouteHeader().getDocRouteStatus();
067                if (KEWConstants.ROUTE_HEADER_INITIATED_CD.equalsIgnoreCase(routeStatus) || KEWConstants.ROUTE_HEADER_SAVED_CD.equalsIgnoreCase(routeStatus)) {
068                    fields.add(EndowPropertyConstants.SECURITY_ID);
069                }
070                else {
071                    fields.add(EndowPropertyConstants.SECURITY_USER_ENTERED_ID_PREFIX);
072                }
073    
074                fields.add(EndowPropertyConstants.SECURITY_UNIT_VALUE);
075                fields.add(EndowPropertyConstants.SECURITY_UNITS_HELD);
076                fields.add(EndowPropertyConstants.SECURITY_VALUATION_DATE);
077                fields.add(EndowPropertyConstants.SECURITY_UNIT_VALUE_SOURCE);
078                fields.add(EndowPropertyConstants.SECURITY_PREVIOUS_UNIT_VALUE);
079                fields.add(EndowPropertyConstants.SECURITY_PREVIOUS_UNIT_VALUE_DATE);
080                fields.add(EndowPropertyConstants.SECURITY_CARRY_VALUE);
081                fields.add(EndowPropertyConstants.SECURITY_MARKET_VALUE);
082                fields.add(EndowPropertyConstants.SECURITY_LAST_TRANSACTION_DATE);
083                fields.add(EndowPropertyConstants.SECURITY_INCOME_NEXT_PAY_DATE);
084                fields.add(EndowPropertyConstants.SECURITY_INCOME_CHANGE_DATE);
085                fields.add(EndowPropertyConstants.SECURITY_DIVIDEND_RECORD_DATE);
086                fields.add(EndowPropertyConstants.SECURITY_EX_DIVIDEND_DATE);
087                fields.add(EndowPropertyConstants.SECURITY_DIVIDEND_PAY_DATE);
088                fields.add(EndowPropertyConstants.SECURITY_DIVIDEND_AMOUNT);
089                fields.add(EndowPropertyConstants.REPORTING_GROUP_DESC);
090                fields.add(EndowPropertyConstants.ACCRUAL_METHOD_DESC);
091                fields.add(EndowPropertyConstants.SECURITY_NEXT_FISCAL_YEAR_DISTRIBUTION_AMOUNT);
092                fields.add(EndowPropertyConstants.SECURITY_VALUE_BY_MARKET);
093    
094            }
095            // if action is not new or copy the userEnteredSecurityIDprefix shall not be displayed
096            else {
097                fields.add(EndowPropertyConstants.SECURITY_USER_ENTERED_ID_PREFIX);
098            }
099    
100            return fields;
101        }
102    
103        /**
104         * @see org.kuali.rice.kns.document.authorization.MaintenanceDocumentPresentationControllerBase#getConditionallyReadOnlyPropertyNames(org.kuali.rice.kns.document.MaintenanceDocument)
105         */
106        @Override
107        public Set<String> getConditionallyReadOnlyPropertyNames(MaintenanceDocument document) {
108    
109            Set<String> fields = super.getConditionallyReadOnlyPropertyNames(document);
110            Security security = (Security) document.getNewMaintainableObject().getBusinessObject();
111            ClassCode classCode = security.getClassCode();
112    
113            // If the class code type = "P" -- pooled investment:
114            // - the unit value and value date in the security can't be modified through editing that maintenance doc
115            // - END_SEC_T: SEC_RT should NOT be modified through edit that maintenance doc
116            if (classCode != null && EndowConstants.ClassCodeTypes.POOLED_INVESTMENT.equalsIgnoreCase(classCode.getClassCodeType()) && KNSConstants.MAINTENANCE_EDIT_ACTION.equals(document.getNewMaintainableObject().getMaintenanceAction())) {
117                fields.add(EndowPropertyConstants.SECURITY_UNIT_VALUE);
118                fields.add(EndowPropertyConstants.SECURITY_MARKET_VALUE);
119                fields.add(EndowPropertyConstants.SECURITY_VALUATION_DATE);
120                fields.add(EndowPropertyConstants.SECURITY_INCOME_RATE);
121            }
122    
123            // The default unit value for a new security is 1 EXCEPT for Liabilities (CLS_CD_T: CLS_CD_TYP = L) which will be negative 1
124            // (-1). The unit value for these securities must remain -1. The unit value for these securities cannot be edited.
125            if (classCode != null && EndowConstants.ClassCodeTypes.LIABILITY.equalsIgnoreCase(classCode.getClassCodeType())) {
126                fields.add(EndowPropertyConstants.SECURITY_UNIT_VALUE);
127            }
128    
129            return fields;
130        }
131    
132    }