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.List;
019    import java.util.Set;
020    
021    import org.apache.commons.lang.StringUtils;
022    import org.kuali.kfs.module.endow.EndowConstants;
023    import org.kuali.kfs.module.endow.EndowPropertyConstants;
024    import org.kuali.kfs.module.endow.businessobject.FeeClassCode;
025    import org.kuali.kfs.module.endow.businessobject.FeeEndowmentTransactionCode;
026    import org.kuali.kfs.module.endow.businessobject.FeeMethod;
027    import org.kuali.kfs.module.endow.businessobject.FeePaymentType;
028    import org.kuali.kfs.module.endow.businessobject.FeeSecurity;
029    import org.kuali.kfs.module.endow.businessobject.FeeTransaction;
030    import org.kuali.kfs.module.endow.document.service.FeeMethodService;
031    import org.kuali.kfs.module.endow.document.service.impl.FrequencyCodeServiceImpl;
032    import org.kuali.kfs.sys.context.SpringContext;
033    import org.kuali.kfs.sys.document.authorization.FinancialSystemMaintenanceDocumentPresentationControllerBase;
034    import org.kuali.rice.kns.document.MaintenanceDocument;
035    import org.kuali.rice.kns.util.KNSConstants;
036    
037    public class FeeMethodDocumentPresentationController extends FinancialSystemMaintenanceDocumentPresentationControllerBase {
038    
039        @Override
040        public Set<String> getConditionallyReadOnlyPropertyNames(MaintenanceDocument document) {
041            Set<String> readOnlyPropertyNames = super.getConditionallyReadOnlyPropertyNames(document);
042            
043            FeeMethod feeMethod = (FeeMethod) document.getNewMaintainableObject().getBusinessObject();
044    
045            String frequencyCode = feeMethod.getFeeFrequencyCode();
046            if (StringUtils.isNotEmpty(frequencyCode)) {
047                FrequencyCodeServiceImpl frequencyCodeServiceImpl = (FrequencyCodeServiceImpl) SpringContext.getBean(FrequencyCodeServiceImpl.class);
048                feeMethod.setFeeNextProcessDate(frequencyCodeServiceImpl.calculateProcessDate(frequencyCode));
049            }
050    
051            String feeTypeCode = feeMethod.getFeeTypeCode();
052    
053            if (EndowConstants.FeeMethod.FEE_TYPE_CODE_VALUE_FOR_PAYMENTS.equalsIgnoreCase(feeTypeCode)) {
054                // rule# 8: If fee type code is "P" then fee base code should be "I"
055                feeMethod.setFeeBaseCode(EndowConstants.FeeMethod.FEE_BASE_CD_VALUE);
056                readOnlyPropertyNames.add(EndowPropertyConstants.FEE_BASE_CD);
057            }
058    
059            String feeMethodCode = feeMethod.getCode();
060            // the frequency code on a Fee Method cannot be changed if that Fee Method is used on at least one KEMID
061            if (KNSConstants.MAINTENANCE_EDIT_ACTION.equals(document.getNewMaintainableObject().getMaintenanceAction()) && StringUtils.isNotEmpty(feeMethodCode)) {
062                FeeMethodService feeMethodService = SpringContext.getBean(FeeMethodService.class);
063                if (feeMethodService.isFeeMethodUsedOnAnyKemid(feeMethodCode)) {
064                    readOnlyPropertyNames.add(EndowPropertyConstants.FEE_METHOD_FREQUENCY_CODE);
065                }
066            }
067    
068            return readOnlyPropertyNames;
069        }
070    
071        /**
072         * @see org.kuali.rice.kns.document.authorization.MaintenanceDocumentPresentationControllerBase#getConditionallyReadOnlyPropertyNames(org.kuali.rice.kns.document.MaintenanceDocument)
073         */
074        @Override
075        public Set<String> getConditionallyReadOnlySectionIds(MaintenanceDocument document) {
076            Set<String> readOnlySectionIds = super.getConditionallyReadOnlySectionIds(document);
077    
078            // make all the tabs read only to begin with
079            readOnlySectionIds.add(EndowConstants.FeeMethod.CLASS_CODES_TAB_ID);
080            readOnlySectionIds.add(EndowConstants.FeeMethod.SECURITY_TAB_ID);
081            readOnlySectionIds.add(EndowConstants.FeeMethod.PAYMENT_TYPES_TAB_ID);
082            readOnlySectionIds.add(EndowConstants.FeeMethod.TRANSACTION_TYPES_TAB_ID);
083            readOnlySectionIds.add(EndowConstants.FeeMethod.ENDOWMENT_TRANSACTION_CODES_TAB_ID);
084    
085            FeeMethod feeMethod = (FeeMethod) document.getNewMaintainableObject().getBusinessObject();
086            FeeMethod oldFeeMethod = (FeeMethod) document.getOldMaintainableObject().getBusinessObject();
087    
088            String feeTypeCode = feeMethod.getFeeTypeCode();
089    
090            if (StringUtils.isEmpty(feeTypeCode)) {
091                return readOnlySectionIds;
092            }
093    
094            // if Fee Type Code is T then valid tabs are Transaction Type and Endowment Transaction Type
095            // read only the rest of the tabs...
096            // also clear the old collection records
097            // also clear the read only tables collection records as they are no longer valid...
098            if (EndowConstants.FeeMethod.FEE_TYPE_CODE_VALUE_FOR_TRANSACTIONS.equalsIgnoreCase(feeTypeCode)) {
099                readOnlySectionIds.remove(EndowConstants.FeeMethod.TRANSACTION_TYPES_TAB_ID);
100                readOnlySectionIds.remove(EndowConstants.FeeMethod.ENDOWMENT_TRANSACTION_CODES_TAB_ID);
101                readOnlySectionIds.remove(EndowConstants.FeeMethod.PAYMENT_TYPES_TAB_ID);
102    
103                List<FeeClassCode> feeClassCodes = (List<FeeClassCode>) feeMethod.getFeeClassCodes();
104                feeClassCodes.clear();
105                
106                List<FeeClassCode> oldFeeClassCodes = (List<FeeClassCode>) oldFeeMethod.getFeeClassCodes();
107                oldFeeClassCodes.clear();
108                
109                List<FeeSecurity> feeSecurity = (List<FeeSecurity>) feeMethod.getFeeSecurity();
110                feeSecurity.clear();
111                
112                List<FeeSecurity> olFeeSecurity = (List<FeeSecurity>) oldFeeMethod.getFeeSecurity();
113                olFeeSecurity.clear();
114                
115           //     List<FeePaymentType> feePaymentTypes = (List<FeePaymentType>) feeMethod.getFeePaymentTypes();
116           //     feePaymentTypes.clear();
117                
118           //     List<FeePaymentType> oldFeePaymentTypes = (List<FeePaymentType>) oldFeeMethod.getFeePaymentTypes();
119           //     oldFeePaymentTypes.clear();
120                
121                return readOnlySectionIds;
122            }
123    
124            // if Fee Type Code is B then tabs Class Codes and Security are valid
125            // read only the rest of the tabs...
126            // also clear the old collection records
127            // also clear the read only tables collection records as they are not longer valid...
128            if (EndowConstants.FeeMethod.FEE_TYPE_CODE_VALUE_FOR_BALANCES.equalsIgnoreCase(feeTypeCode)) {
129                readOnlySectionIds.remove(EndowConstants.FeeMethod.CLASS_CODES_TAB_ID);
130                readOnlySectionIds.remove(EndowConstants.FeeMethod.SECURITY_TAB_ID);
131    
132                List<FeePaymentType> feePaymentTypes = (List<FeePaymentType>) feeMethod.getFeePaymentTypes();
133                feePaymentTypes.clear();
134                List<FeePaymentType> oldFeePaymentTypes = (List<FeePaymentType>) oldFeeMethod.getFeePaymentTypes();
135                oldFeePaymentTypes.clear();
136    
137                List<FeeTransaction> feeTransactions = (List<FeeTransaction>) feeMethod.getFeeTransactions();
138                feeTransactions.clear();
139                List<FeeTransaction> oldFeeTransactions = (List<FeeTransaction>) oldFeeMethod.getFeeTransactions();
140                oldFeeTransactions.clear();
141    
142                List<FeeEndowmentTransactionCode> feeEndowmentTransactionCodes = (List<FeeEndowmentTransactionCode>) feeMethod.getFeeEndowmentTransactionCodes();
143                feeEndowmentTransactionCodes.clear();
144                List<FeeEndowmentTransactionCode> oldFeeEndowmentTransactionCodes = (List<FeeEndowmentTransactionCode>) oldFeeMethod.getFeeEndowmentTransactionCodes();
145                oldFeeEndowmentTransactionCodes.clear();
146    
147                return readOnlySectionIds;
148            }
149    
150            // if Fee Type Code is P then only Payment Type tab is valid
151            // also clear the read only tables collection records as they are not longer valid...
152            // also clear the old collection records
153            // read only the rest of the tabs...
154            if (EndowConstants.FeeMethod.FEE_TYPE_CODE_VALUE_FOR_PAYMENTS.equalsIgnoreCase(feeTypeCode)) {
155                readOnlySectionIds.remove(EndowConstants.FeeMethod.PAYMENT_TYPES_TAB_ID);
156    
157                List<FeeClassCode> feeClassCodes = (List<FeeClassCode>) feeMethod.getFeeClassCodes();
158                feeClassCodes.clear();
159                List<FeeClassCode> oldFeeClassCodes = (List<FeeClassCode>) oldFeeMethod.getFeeClassCodes();
160                oldFeeClassCodes.clear();
161    
162                List<FeeSecurity> feeSecurity = (List<FeeSecurity>) feeMethod.getFeeSecurity();
163                feeSecurity.clear();
164                List<FeeSecurity> olFeeSecurity = (List<FeeSecurity>) oldFeeMethod.getFeeSecurity();
165                olFeeSecurity.clear();
166    
167                List<FeeTransaction> feeTransactions = (List<FeeTransaction>) feeMethod.getFeeTransactions();
168                feeTransactions.clear();
169                List<FeeTransaction> oldFeeTransactions = (List<FeeTransaction>) oldFeeMethod.getFeeTransactions();
170                oldFeeTransactions.clear();
171    
172                List<FeeEndowmentTransactionCode> feeEndowmentTransactionCodes = (List<FeeEndowmentTransactionCode>) feeMethod.getFeeEndowmentTransactionCodes();
173                feeEndowmentTransactionCodes.clear();
174                List<FeeEndowmentTransactionCode> oldFeeEndowmentTransactionCodes = (List<FeeEndowmentTransactionCode>) oldFeeMethod.getFeeEndowmentTransactionCodes();
175                oldFeeEndowmentTransactionCodes.clear();
176    
177                return readOnlySectionIds;
178            }
179    
180            return readOnlySectionIds;
181        }
182    }