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.sql.Date;
019    import java.util.Set;
020    
021    import org.kuali.kfs.module.endow.EndowPropertyConstants;
022    import org.kuali.kfs.module.endow.businessobject.PooledFundControl;
023    import org.kuali.kfs.module.endow.businessobject.PooledFundValue;
024    import org.kuali.kfs.module.endow.document.service.KEMService;
025    import org.kuali.kfs.module.endow.document.service.PooledFundControlService;
026    import org.kuali.kfs.sys.context.SpringContext;
027    import org.kuali.kfs.sys.document.authorization.FinancialSystemMaintenanceDocumentPresentationControllerBase;
028    import org.kuali.rice.kns.document.MaintenanceDocument;
029    import org.kuali.rice.kns.util.KNSConstants;
030    import org.kuali.rice.kns.util.ObjectUtils;
031    
032    public class PooledFundValueDocumentPresentationController extends FinancialSystemMaintenanceDocumentPresentationControllerBase {
033    
034        /**
035         * @see org.kuali.rice.kns.document.authorization.MaintenanceDocumentPresentationControllerBase#getConditionallyReadOnlyPropertyNames(org.kuali.rice.kns.document.MaintenanceDocument)
036         */
037        @Override
038        public Set<String> getConditionallyReadOnlyPropertyNames(MaintenanceDocument document) {
039            Set<String> fields = super.getConditionallyReadOnlyPropertyNames(document);
040    
041            PooledFundControlService pooledFundControlService = SpringContext.getBean(PooledFundControlService.class);
042    
043            // Make Valuation Date gray out (can't edit) when editing a maintenance doc
044            if (KNSConstants.MAINTENANCE_EDIT_ACTION.equals(document.getNewMaintainableObject().getMaintenanceAction())) {
045                fields.add(EndowPropertyConstants.VALUATION_DATE);
046    
047                PooledFundValue oldPooledFundValue = (PooledFundValue) document.getOldMaintainableObject().getBusinessObject();
048                String pooledSecurityID = oldPooledFundValue.getPooledSecurityID();
049                PooledFundControl theReferencePFC = pooledFundControlService.getByPrimaryKey(pooledSecurityID);
050                Boolean distributeGainsAndLossesIndicator = theReferencePFC.isDistributeGainsAndLossesIndicator();
051    
052                /*
053                 * Business Rule:If the date for the distribution is prior to the current system Process Date and the Process Complete
054                 * flag is Yes, the distribution amount and date cannot be changed.
055                 */
056                KEMService kemService = SpringContext.getBean(KEMService.class);
057                Date currentDate = kemService.getCurrentDate();
058                Date distributIncomeOnDate = oldPooledFundValue.getDistributeIncomeOnDate();
059    
060                if (oldPooledFundValue.isIncomeDistributionComplete() && distributIncomeOnDate != null && distributIncomeOnDate.before(currentDate)) {
061                    fields.add(EndowPropertyConstants.DISTRIBUTE_INCOME_ON_DATE);
062                    fields.add(EndowPropertyConstants.INCOME_DISTRIBUTION_PER_UNIT);
063                }
064                /*
065                 * Rule: If xx_ PROC_CMPLT is "Y", the corresponding amount and xx__PROC_ON_DT fields should be read only in edit mode.
066                 * Rule: In the pooled fund control, if the Distribute Gains And Losses = "N", LT_GAIN_LOSS / LT_PROC_ON_DT and
067                 * ST_GAIN_LOSS / ST_PROC_ON_DT fields in the PooledFundValue should be read only in the edit mode.
068                 */
069                if (!distributeGainsAndLossesIndicator || oldPooledFundValue.isLongTermGainLossDistributionComplete()) {
070                    fields.add(EndowPropertyConstants.LONG_TERM_GAIN_LOSS_DISTRIBUTION_PER_UNIT);
071                    fields.add(EndowPropertyConstants.DISTRIBUTE_LONG_TERM_GAIN_LOSS_ON_DATE);
072                }
073                if (!distributeGainsAndLossesIndicator || oldPooledFundValue.isShortTermGainLossDistributionComplete()) {
074                    fields.add(EndowPropertyConstants.SHORT_TERM_GAIN_LOSS_DISTRIBUTION_PER_UNIT);
075                    fields.add(EndowPropertyConstants.DISTRIBUTE_SHORT_TERM_GAIN_LOSS_ON_DATE);
076                }
077    
078            }
079    
080            /*
081             * Rule: In the pooled fund control, if the Distribute Gains And Losses = "N", LT_GAIN_LOSS / LT_PROC_ON_DT and ST_GAIN_LOSS
082             * / ST_PROC_ON_DT fields in the PooledFundValue should be read only in the create/copy mode.
083             */
084            if (KNSConstants.MAINTENANCE_NEW_ACTION.equals(document.getNewMaintainableObject().getMaintenanceAction()) || KNSConstants.MAINTENANCE_COPY_ACTION.equals(document.getNewMaintainableObject().getMaintenanceAction())) {
085                PooledFundValue newPooledFundValue = (PooledFundValue) document.getNewMaintainableObject().getBusinessObject();
086                if (ObjectUtils.isNotNull(newPooledFundValue)) {
087                    String pooledSecurityID = newPooledFundValue.getPooledSecurityID();
088                    PooledFundControl theReferencePFC = pooledFundControlService.getByPrimaryKey(pooledSecurityID);
089                    if (ObjectUtils.isNotNull(theReferencePFC)) {
090                        Boolean distributeGainsAndLossesIndicator = theReferencePFC.isDistributeGainsAndLossesIndicator();
091                        if (!distributeGainsAndLossesIndicator) {
092                            fields.add(EndowPropertyConstants.LONG_TERM_GAIN_LOSS_DISTRIBUTION_PER_UNIT);
093                            fields.add(EndowPropertyConstants.DISTRIBUTE_LONG_TERM_GAIN_LOSS_ON_DATE);
094                            fields.add(EndowPropertyConstants.SHORT_TERM_GAIN_LOSS_DISTRIBUTION_PER_UNIT);
095                            fields.add(EndowPropertyConstants.DISTRIBUTE_SHORT_TERM_GAIN_LOSS_ON_DATE);
096                        }
097                    }
098                }
099            }
100            return fields;
101        }
102    }