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.cam.document.authorization;
017    
018    import java.util.HashSet;
019    import java.util.Set;
020    
021    import org.kuali.kfs.module.cam.CamsConstants;
022    import org.kuali.kfs.module.cam.CamsPropertyConstants;
023    import org.kuali.kfs.module.cam.businessobject.AssetGlobal;
024    import org.kuali.kfs.module.cam.businessobject.AssetGlobalDetail;
025    import org.kuali.kfs.module.cam.businessobject.AssetPaymentDetail;
026    import org.kuali.kfs.module.cam.document.service.AssetGlobalService;
027    import org.kuali.kfs.sys.KFSConstants;
028    import org.kuali.kfs.sys.context.SpringContext;
029    import org.kuali.kfs.sys.document.authorization.FinancialSystemMaintenanceDocumentPresentationControllerBase;
030    import org.kuali.rice.kns.bo.BusinessObject;
031    import org.kuali.rice.kns.datadictionary.MaintainableCollectionDefinition;
032    import org.kuali.rice.kns.document.MaintenanceDocument;
033    import org.kuali.rice.kns.service.MaintenanceDocumentDictionaryService;
034    
035    /**
036     * Presentation Controller for Asset Global Maintenance Documents
037     */
038    public class AssetGlobalPresentationController extends FinancialSystemMaintenanceDocumentPresentationControllerBase {
039    
040        @Override
041        public Set<String> getConditionallyHiddenPropertyNames(BusinessObject businessObject) {
042            Set<String> fields = super.getConditionallyHiddenPropertyNames(businessObject);
043            MaintenanceDocument document = (MaintenanceDocument) businessObject;
044            AssetGlobal assetGlobal = (AssetGlobal) document.getNewMaintainableObject().getBusinessObject();
045            MaintainableCollectionDefinition maintCollDef = SpringContext.getBean(MaintenanceDocumentDictionaryService.class).getMaintainableCollection("AA", "assetPaymentDetails");
046            boolean isAssetSeparate = SpringContext.getBean(AssetGlobalService.class).isAssetSeparate(assetGlobal);
047    
048            if (assetGlobal.isCapitalAssetBuilderOriginIndicator() || isAssetSeparate) {
049                // do not include payment add section within the payment details collection
050                maintCollDef.setIncludeAddLine(false);
051                // No update could be made to payment if it's created from CAB. Here, disable delete button if payment already added into
052                // collection.
053                for (AssetPaymentDetail payment : assetGlobal.getAssetPaymentDetails()) {
054                    payment.setNewCollectionRecord(false);
055                }
056            }
057            else {
058                // conversely allow add during any other case. This is important because the attribute is set on the DD and the DD is
059                // only loaded on project startup. Hence setting is important to avoid state related bugs
060                maintCollDef.setIncludeAddLine(true);
061            }
062    
063            AssetGlobalService assetGlobalService = SpringContext.getBean(AssetGlobalService.class);
064            if (!assetGlobalService.isAssetSeparateByPayment(assetGlobal)) {
065                // Show payment sequence number field only if a separate by payment was selected
066                fields.add(CamsPropertyConstants.AssetGlobal.SEPERATE_SOURCE_PAYMENT_SEQUENCE_NUMBER);
067            }
068    
069            if (!isAssetSeparate) {
070                fields.addAll(getAssetGlobalLocationHiddenFields(assetGlobal));
071    
072                if (assetGlobalService.existsInGroup(assetGlobalService.getNonNewAcquisitionCodeGroup(), assetGlobal.getAcquisitionTypeCode())) {
073                    // Fields in the add section
074                    fields.add(KFSConstants.ADD_PREFIX + "." + CamsPropertyConstants.AssetGlobal.ASSET_PAYMENT_DETAILS + "." + CamsPropertyConstants.AssetPaymentDetail.DOCUMENT_POSTING_DATE);
075                    fields.add(KFSConstants.ADD_PREFIX + "." + CamsPropertyConstants.AssetGlobal.ASSET_PAYMENT_DETAILS + "." + CamsPropertyConstants.AssetPaymentDetail.DOCUMENT_NUMBER);
076                    fields.add(KFSConstants.ADD_PREFIX + "." + CamsPropertyConstants.AssetGlobal.ASSET_PAYMENT_DETAILS + "." + CamsPropertyConstants.AssetPaymentDetail.DOCUMENT_TYPE_CODE);
077                    fields.add(KFSConstants.ADD_PREFIX + "." + CamsPropertyConstants.AssetGlobal.ASSET_PAYMENT_DETAILS + "." + CamsPropertyConstants.AssetPaymentDetail.ORIGINATION_CODE);
078    
079                    // Hiding some fields when the status of the document is not final.
080                    if (!document.getDocumentHeader().getWorkflowDocument().stateIsFinal()) {
081                        fields.addAll(getAssetGlobalPaymentsHiddenFields(assetGlobal));
082                    }
083                }
084            }
085            // if no separate asset is added, hide the button
086            if (isAssetSeparate && (assetGlobal.getAssetSharedDetails().isEmpty() || assetGlobal.getAssetSharedDetails().get(0).getAssetGlobalUniqueDetails().isEmpty())) {
087                fields.add("calculateEqualSourceAmountsButton");
088            }
089    
090    
091    
092            return fields;
093        }
094    
095        @Override
096        public Set<String> getConditionallyReadOnlyPropertyNames(MaintenanceDocument document) {
097            Set<String> fields = super.getConditionallyReadOnlyPropertyNames(document);
098    
099            AssetGlobal assetGlobal = (AssetGlobal) document.getNewMaintainableObject().getBusinessObject();
100    
101            // "Asset Separate" document functionality
102            if (SpringContext.getBean(AssetGlobalService.class).isAssetSeparate(assetGlobal)) {
103                fields.addAll(getAssetGlobalDetailsReadOnlyFields());
104                fields.addAll(getAssetGlobalPaymentsReadOnlyFields(assetGlobal));
105            }
106            else if (assetGlobal.isCapitalAssetBuilderOriginIndicator()) {
107                // If asset global document is created from CAB, disallow add payment to collection.
108                fields.addAll(getAssetGlobalPaymentsReadOnlyFields(assetGlobal));
109            }
110    
111            return fields;
112        }
113    
114        @Override
115        public Set<String> getConditionallyHiddenSectionIds(BusinessObject businessObject) {
116            Set<String> fields = super.getConditionallyHiddenSectionIds(businessObject);
117    
118            MaintenanceDocument document = (MaintenanceDocument) businessObject;
119            AssetGlobal assetGlobal = (AssetGlobal) document.getNewMaintainableObject().getBusinessObject();
120    
121            // hide "Asset Information", "Recalculate Total Amount" tabs if not "Asset Separate" doc
122            if (!SpringContext.getBean(AssetGlobalService.class).isAssetSeparate(assetGlobal)) {
123                fields.add(CamsConstants.AssetGlobal.SECTION_ID_ASSET_INFORMATION);
124                fields.add(CamsConstants.AssetGlobal.SECTION_ID_RECALCULATE_SEPARATE_SOURCE_AMOUNT);
125            }
126    
127            return fields;
128        }
129    
130        /**
131         * @param assetGlobal
132         * @return Asset Location fields with index that are present on AssetGlobal. Includes add line. Useful for hiding them.
133         */
134        protected Set<String> getAssetGlobalLocationHiddenFields(AssetGlobal assetGlobal) {
135            Set<String> fields = new HashSet<String>();
136    
137            // hide it for the add line
138            int i = 0;
139            for (AssetGlobalDetail assetSharedDetail : assetGlobal.getAssetSharedDetails()) {
140                fields.add(KFSConstants.ADD_PREFIX + "." + CamsPropertyConstants.AssetGlobal.ASSET_SHARED_DETAILS + "[" + i + "]." + CamsPropertyConstants.AssetGlobalDetail.ASSET_UNIQUE_DETAILS + "." + CamsPropertyConstants.AssetGlobalDetail.REPRESENTATIVE_UNIVERSAL_IDENTIFIER); // representativeUniversalIdentifier
141                fields.add(KFSConstants.ADD_PREFIX + "." + CamsPropertyConstants.AssetGlobal.ASSET_SHARED_DETAILS + "[" + i + "]." + CamsPropertyConstants.AssetGlobalDetail.ASSET_UNIQUE_DETAILS + "." + CamsPropertyConstants.AssetGlobalDetail.CAPITAL_ASSET_TYPE_CODE); // capitalAssetTypeCode
142                fields.add(KFSConstants.ADD_PREFIX + "." + CamsPropertyConstants.AssetGlobal.ASSET_SHARED_DETAILS + "[" + i + "]." + CamsPropertyConstants.AssetGlobalDetail.ASSET_UNIQUE_DETAILS + "." + CamsPropertyConstants.AssetGlobalDetail.CAPITAL_ASSET_DESCRIPTION); // capitalAssetDescription
143                fields.add(KFSConstants.ADD_PREFIX + "." + CamsPropertyConstants.AssetGlobal.ASSET_SHARED_DETAILS + "[" + i + "]." + CamsPropertyConstants.AssetGlobalDetail.ASSET_UNIQUE_DETAILS + "." + CamsPropertyConstants.AssetGlobalDetail.MANUFACTURER_NAME); // manufacturerName
144                fields.add(KFSConstants.ADD_PREFIX + "." + CamsPropertyConstants.AssetGlobal.ASSET_SHARED_DETAILS + "[" + i + "]." + CamsPropertyConstants.AssetGlobalDetail.ASSET_UNIQUE_DETAILS + "." + CamsPropertyConstants.AssetGlobalDetail.ORGANIZATION_TEXT); // organizationText
145                fields.add(KFSConstants.ADD_PREFIX + "." + CamsPropertyConstants.AssetGlobal.ASSET_SHARED_DETAILS + "[" + i + "]." + CamsPropertyConstants.AssetGlobalDetail.ASSET_UNIQUE_DETAILS + "." + CamsPropertyConstants.AssetGlobalDetail.MANUFACTURER_MODEL_NUMBER); // manufacturerModelNumber
146                fields.add(KFSConstants.ADD_PREFIX + "." + CamsPropertyConstants.AssetGlobal.ASSET_SHARED_DETAILS + "[" + i + "]." + CamsPropertyConstants.AssetGlobalDetail.ASSET_UNIQUE_DETAILS + "." + CamsPropertyConstants.AssetGlobalDetail.SEPARATE_SOURCE_AMOUNT); // separateSourceAmount
147                // (Long)
148    
149                // hide it for the existing lines
150                int j = 0;
151                for (AssetGlobalDetail assetGlobalUniqueDetail : assetSharedDetail.getAssetGlobalUniqueDetails()) {
152                    fields.add(CamsPropertyConstants.AssetGlobal.ASSET_SHARED_DETAILS + "[" + i + "]." + CamsPropertyConstants.AssetGlobalDetail.ASSET_UNIQUE_DETAILS + "[" + j + "]." + CamsPropertyConstants.AssetGlobalDetail.REPRESENTATIVE_UNIVERSAL_IDENTIFIER); // representativeUniversalIdentifier
153                    fields.add(CamsPropertyConstants.AssetGlobal.ASSET_SHARED_DETAILS + "[" + i + "]." + CamsPropertyConstants.AssetGlobalDetail.ASSET_UNIQUE_DETAILS + "[" + j + "]." + CamsPropertyConstants.AssetGlobalDetail.CAPITAL_ASSET_TYPE_CODE); // capitalAssetTypeCode
154                    fields.add(CamsPropertyConstants.AssetGlobal.ASSET_SHARED_DETAILS + "[" + i + "]." + CamsPropertyConstants.AssetGlobalDetail.ASSET_UNIQUE_DETAILS + "[" + j + "]." + CamsPropertyConstants.AssetGlobalDetail.CAPITAL_ASSET_DESCRIPTION); // capitalAssetDescription
155                    fields.add(CamsPropertyConstants.AssetGlobal.ASSET_SHARED_DETAILS + "[" + i + "]." + CamsPropertyConstants.AssetGlobalDetail.ASSET_UNIQUE_DETAILS + "[" + j + "]." + CamsPropertyConstants.AssetGlobalDetail.MANUFACTURER_NAME); // manufacturerName
156                    fields.add(CamsPropertyConstants.AssetGlobal.ASSET_SHARED_DETAILS + "[" + i + "]." + CamsPropertyConstants.AssetGlobalDetail.ASSET_UNIQUE_DETAILS + "[" + j + "]." + CamsPropertyConstants.AssetGlobalDetail.ORGANIZATION_TEXT); // organizationText
157                    fields.add(CamsPropertyConstants.AssetGlobal.ASSET_SHARED_DETAILS + "[" + i + "]." + CamsPropertyConstants.AssetGlobalDetail.ASSET_UNIQUE_DETAILS + "[" + j + "]." + CamsPropertyConstants.AssetGlobalDetail.MANUFACTURER_MODEL_NUMBER); // manufacturerModelNumber
158                    fields.add(CamsPropertyConstants.AssetGlobal.ASSET_SHARED_DETAILS + "[" + i + "]." + CamsPropertyConstants.AssetGlobalDetail.ASSET_UNIQUE_DETAILS + "[" + j + "]." + CamsPropertyConstants.AssetGlobalDetail.SEPARATE_SOURCE_AMOUNT); // separateSourceAmount
159                    // (Long)
160                    j++;
161                }
162    
163                i++;
164            }
165    
166            return fields;
167        }
168    
169        /**
170         * @param assetGlobal
171         * @return posting year and fiscal month on every payment. Useful for hiding them.
172         */
173        protected Set<String> getAssetGlobalPaymentsHiddenFields(AssetGlobal assetGlobal) {
174            Set<String> fields = new HashSet<String>();
175    
176            int i = 0;
177            for (AssetPaymentDetail assetPaymentDetail : assetGlobal.getAssetPaymentDetails()) {
178                fields.add(CamsPropertyConstants.AssetGlobal.ASSET_PAYMENT_DETAILS + "[" + i + "]." + CamsPropertyConstants.AssetPaymentDetail.DOCUMENT_POSTING_DATE);
179                fields.add(CamsPropertyConstants.AssetGlobal.ASSET_PAYMENT_DETAILS + "[" + i + "]." + CamsPropertyConstants.AssetPaymentDetail.DOCUMENT_NUMBER);
180                fields.add(CamsPropertyConstants.AssetGlobal.ASSET_PAYMENT_DETAILS + "[" + i + "]." + CamsPropertyConstants.AssetPaymentDetail.DOCUMENT_TYPE_CODE);
181                fields.add(CamsPropertyConstants.AssetGlobal.ASSET_PAYMENT_DETAILS + "[" + i + "]." + CamsPropertyConstants.AssetPaymentDetail.ORIGINATION_CODE);
182                i++;
183            }
184    
185            return fields;
186        }
187    
188        /**
189         * @return Asset Global Detail fields that should be read only
190         */
191        protected Set<String> getAssetGlobalDetailsReadOnlyFields() {
192            Set<String> fields = new HashSet<String>();
193    
194            fields.add(CamsPropertyConstants.Asset.ORGANIZATION_OWNER_CHART_OF_ACCOUNTS_CODE);
195            fields.add(CamsPropertyConstants.Asset.ORGANIZATION_OWNER_ACCOUNT_NUMBER);
196            fields.add(CamsPropertyConstants.Asset.ORGANIZATION_CODE);
197            fields.add(CamsPropertyConstants.Asset.AGENCY_NUMBER); // owner
198            fields.add(CamsPropertyConstants.Asset.ACQUISITION_TYPE_CODE);
199            fields.add(CamsPropertyConstants.Asset.INVENTORY_STATUS_CODE);
200            fields.add(CamsPropertyConstants.Asset.CONDITION_CODE);
201            fields.add(CamsPropertyConstants.AssetGlobal.CAPITAL_ASSET_DESCRIPTION);
202            fields.add(CamsPropertyConstants.Asset.CAPITAL_ASSET_TYPE_CODE);
203            fields.add(CamsPropertyConstants.Asset.VENDOR_NAME);
204            fields.add(CamsPropertyConstants.Asset.MANUFACTURER_NAME);
205            fields.add(CamsPropertyConstants.Asset.MANUFACTURER_MODEL_NUMBER);
206            fields.add(CamsPropertyConstants.AssetGlobal.ORGANIZATION_TEXT);
207            fields.add(CamsPropertyConstants.Asset.REP_USER_AUTH_ID);
208            fields.add(CamsPropertyConstants.Asset.LAST_INVENTORY_DATE);
209            fields.add(CamsPropertyConstants.Asset.CREATE_DATE);
210            fields.add(CamsPropertyConstants.Asset.ASSET_DATE_OF_SERVICE);
211            fields.add(CamsPropertyConstants.AssetGlobal.CAPITAL_ASSET_DEPRECIATION_DATE);
212            fields.add(CamsPropertyConstants.Asset.LAND_COUNTRY_NAME);
213            fields.add(CamsPropertyConstants.Asset.LAND_ACREAGE_SIZE);
214            fields.add(CamsPropertyConstants.Asset.LAND_PARCEL_NUMBER);
215    
216            return fields;
217        }
218    
219        /**
220         * @param assetGlobal
221         * @return Asset Global Payment lines with index that should be set to read only.
222         */
223        protected Set<String> getAssetGlobalPaymentsReadOnlyFields(AssetGlobal assetGlobal) {
224            Set<String> fields = new HashSet<String>();
225    
226            // set all payment detail fields to read only.
227            int i = 0;
228            for (AssetPaymentDetail assetPaymentDetail : assetGlobal.getAssetPaymentDetails()) {
229                fields.add(CamsPropertyConstants.AssetGlobal.ASSET_PAYMENT_DETAILS + "[" + i + "]." + CamsPropertyConstants.AssetPaymentDetail.SEQUENCE_NUMBER);
230                fields.add(CamsPropertyConstants.AssetGlobal.ASSET_PAYMENT_DETAILS + "[" + i + "]." + CamsPropertyConstants.AssetPaymentDetail.CHART_OF_ACCOUNTS_CODE);
231                fields.add(CamsPropertyConstants.AssetGlobal.ASSET_PAYMENT_DETAILS + "[" + i + "]." + CamsPropertyConstants.AssetPaymentDetail.ACCOUNT_NUMBER);
232                fields.add(CamsPropertyConstants.AssetGlobal.ASSET_PAYMENT_DETAILS + "[" + i + "]." + CamsPropertyConstants.AssetPaymentDetail.SUB_ACCOUNT_NUMBER);
233                fields.add(CamsPropertyConstants.AssetGlobal.ASSET_PAYMENT_DETAILS + "[" + i + "]." + CamsPropertyConstants.AssetPaymentDetail.FINANCIAL_OBJECT_CODE);
234                fields.add(CamsPropertyConstants.AssetGlobal.ASSET_PAYMENT_DETAILS + "[" + i + "]." + CamsPropertyConstants.AssetPaymentDetail.SUB_OBJECT_CODE);
235                fields.add(CamsPropertyConstants.AssetGlobal.ASSET_PAYMENT_DETAILS + "[" + i + "]." + CamsPropertyConstants.AssetPaymentDetail.PROJECT_CODE);
236                fields.add(CamsPropertyConstants.AssetGlobal.ASSET_PAYMENT_DETAILS + "[" + i + "]." + CamsPropertyConstants.AssetPaymentDetail.ORGANIZATION_REFERENCE_ID);
237                fields.add(CamsPropertyConstants.AssetGlobal.ASSET_PAYMENT_DETAILS + "[" + i + "]." + CamsPropertyConstants.AssetPaymentDetail.DOCUMENT_NUMBER);
238                fields.add(CamsPropertyConstants.AssetGlobal.ASSET_PAYMENT_DETAILS + "[" + i + "]." + CamsPropertyConstants.AssetPaymentDetail.DOCUMENT_TYPE_CODE);
239                fields.add(CamsPropertyConstants.AssetGlobal.ASSET_PAYMENT_DETAILS + "[" + i + "]." + CamsPropertyConstants.AssetPaymentDetail.PURCHASE_ORDER);
240                fields.add(CamsPropertyConstants.AssetGlobal.ASSET_PAYMENT_DETAILS + "[" + i + "]." + CamsPropertyConstants.AssetPaymentDetail.REQUISITION_NUMBER);
241                fields.add(CamsPropertyConstants.AssetGlobal.ASSET_PAYMENT_DETAILS + "[" + i + "]." + CamsPropertyConstants.AssetPaymentDetail.DOCUMENT_POSTING_DATE);
242                fields.add(CamsPropertyConstants.AssetGlobal.ASSET_PAYMENT_DETAILS + "[" + i + "]." + CamsPropertyConstants.AssetPaymentDetail.DOCUMENT_POSTING_FISCAL_YEAR);
243                fields.add(CamsPropertyConstants.AssetGlobal.ASSET_PAYMENT_DETAILS + "[" + i + "]." + CamsPropertyConstants.AssetPaymentDetail.DOCUMENT_POSTING_FISCAL_MONTH);
244                fields.add(CamsPropertyConstants.AssetGlobal.ASSET_PAYMENT_DETAILS + "[" + i + "]." + CamsPropertyConstants.AssetPaymentDetail.AMOUNT);
245                fields.add(CamsPropertyConstants.AssetGlobal.ASSET_PAYMENT_DETAILS + "[" + i + "]." + CamsPropertyConstants.AssetPaymentDetail.ORIGINATION_CODE);
246    
247                i++;
248            }
249    
250            return fields;
251        }
252    }