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.service.impl;
017
018 import java.util.ArrayList;
019 import java.util.List;
020
021 import org.apache.commons.lang.StringUtils;
022 import org.kuali.kfs.fp.businessobject.CapitalAssetInformation;
023 import org.kuali.kfs.fp.document.CapitalAssetEditable;
024 import org.kuali.kfs.integration.cam.CapitalAssetManagementModuleService;
025 import org.kuali.kfs.module.cab.CabConstants;
026 import org.kuali.kfs.module.cam.CamsConstants;
027 import org.kuali.kfs.module.cam.businessobject.AssetLock;
028 import org.kuali.kfs.module.cam.service.AssetLockService;
029 import org.kuali.kfs.sys.businessobject.AccountingLineBase;
030 import org.kuali.kfs.sys.businessobject.SourceAccountingLine;
031 import org.kuali.kfs.sys.businessobject.TargetAccountingLine;
032 import org.kuali.kfs.sys.context.SpringContext;
033 import org.kuali.kfs.sys.document.AccountingDocument;
034 import org.kuali.kfs.sys.service.impl.KfsParameterConstants;
035 import org.kuali.rice.kns.document.Document;
036 import org.kuali.rice.kns.exception.ValidationException;
037 import org.kuali.rice.kns.service.ParameterService;
038 import org.kuali.rice.kns.util.ObjectUtils;
039 import org.kuali.rice.kns.workflow.service.KualiWorkflowDocument;
040
041 public class CapitalAssetManagementModuleServiceImpl implements CapitalAssetManagementModuleService {
042 /**
043 * @see org.kuali.kfs.integration.cam.CapitalAssetManagementModuleService#storeAssetLocks(java.util.List, java.lang.String,
044 * java.lang.String, java.lang.String)
045 */
046 public boolean storeAssetLocks(List<Long> capitalAssetNumbers, String documentNumber, String documentType, String lockingInformation) {
047 List<AssetLock> assetLocks = getAssetLockService().buildAssetLockHelper(capitalAssetNumbers, documentNumber, documentType, StringUtils.isBlank(lockingInformation) ? CamsConstants.defaultLockingInformation : lockingInformation);
048 return getAssetLockService().checkAndSetAssetLocks(assetLocks);
049 }
050
051 /**
052 * @see org.kuali.kfs.integration.cam.CapitalAssetManagementModuleService#deleteAssetLocks(java.lang.String, java.lang.String)
053 */
054 public void deleteAssetLocks(String documentNumber, String lockingInformation) {
055 getAssetLockService().deleteAssetLocks(documentNumber, lockingInformation == null ? CamsConstants.defaultLockingInformation : lockingInformation);
056 }
057
058 protected AssetLockService getAssetLockService() {
059 return SpringContext.getBean(AssetLockService.class);
060 }
061
062 /**
063 * @see org.kuali.kfs.integration.cam.CapitalAssetManagementModuleService#isAssetLockedByDocument(java.lang.String,
064 * java.lang.String)
065 */
066 public boolean isAssetLockedByCurrentDocument(String documentNumber, String lockingInformation) {
067 return getAssetLockService().isAssetLockedByCurrentDocument(documentNumber, lockingInformation == null ? CamsConstants.defaultLockingInformation : lockingInformation);
068 }
069
070 /**
071 * @see org.kuali.kfs.integration.cam.CapitalAssetManagementModuleService#isAssetLocked(java.util.List, java.lang.String,
072 * java.lang.String)
073 */
074 public boolean isAssetLocked(List<Long> assetNumbers, String documentTypeName, String excludingDocumentNumber) {
075 return getAssetLockService().isAssetLocked(assetNumbers, documentTypeName, excludingDocumentNumber);
076 }
077
078 /**
079 * @see org.kuali.kfs.integration.cam.CapitalAssetManagementModuleService#generateCapitalAssetLock(org.kuali.rice.kns.document.Document)
080 */
081 public void generateCapitalAssetLock(Document document, String documentTypeName) {
082 CapitalAssetInformation capitalAssetInformation = ((CapitalAssetEditable) document).getCapitalAssetInformation();
083
084 if (ObjectUtils.isNotNull(capitalAssetInformation) && ObjectUtils.isNotNull(capitalAssetInformation.getCapitalAssetNumber())) {
085 ArrayList<Long> capitalAssetNumbers = new ArrayList<Long>();
086 capitalAssetNumbers.add(capitalAssetInformation.getCapitalAssetNumber());
087
088 if (document instanceof AccountingDocument) {
089 if (isFpDocumentEligibleForAssetLock((AccountingDocument) document, documentTypeName) && !this.storeAssetLocks(capitalAssetNumbers, document.getDocumentNumber(), documentTypeName, null)) {
090 throw new ValidationException("Asset " + capitalAssetNumbers.toString() + " is being locked by other documents.");
091 }
092 }
093 }
094 }
095
096 /**
097 * FP document eligible for asset lock when any of its accounting line is taken into CAB during CAB batch.
098 *
099 * @param accountingDocument
100 * @return
101 */
102 public boolean isFpDocumentEligibleForAssetLock(AccountingDocument accountingDocument, String documentType) {
103 // get the system parameter values first so we don't need to repeat this step for each accounting line check
104 ParameterService parameterService = SpringContext.getBean(ParameterService.class);
105
106 List<String> excludedDocTypeCodes = parameterService.getParameterValues(KfsParameterConstants.CAPITAL_ASSET_BUILDER_BATCH.class, CabConstants.Parameters.DOCUMENT_TYPES);
107 // check with the docTypeCodes system parameter
108 if (!excludedDocTypeCodes.isEmpty() && excludedDocTypeCodes.contains(documentType)) {
109 return false;
110 }
111
112 List<String> includedFinancialObjectSubTypeCodes = parameterService.getParameterValues(KfsParameterConstants.CAPITAL_ASSET_BUILDER_BATCH.class, CabConstants.Parameters.OBJECT_SUB_TYPES);
113 List<String> excludedChartCodes = parameterService.getParameterValues(KfsParameterConstants.CAPITAL_ASSET_BUILDER_BATCH.class, CabConstants.Parameters.CHARTS);
114 List<String> excludedSubFundCodes = parameterService.getParameterValues(KfsParameterConstants.CAPITAL_ASSET_BUILDER_BATCH.class, CabConstants.Parameters.SUB_FUND_GROUPS);
115
116 List<SourceAccountingLine> sAccountingLines = accountingDocument.getSourceAccountingLines();
117 for (SourceAccountingLine sourceAccountingLine : sAccountingLines) {
118 if (isAccountLineEligibleForCABBatch(includedFinancialObjectSubTypeCodes, excludedChartCodes, excludedSubFundCodes, sourceAccountingLine)) {
119 return true;
120 }
121
122 }
123
124 List<TargetAccountingLine> tAccountingLines = accountingDocument.getTargetAccountingLines();
125 for (TargetAccountingLine targetAccountingLine : tAccountingLines) {
126 if (isAccountLineEligibleForCABBatch(includedFinancialObjectSubTypeCodes, excludedChartCodes, excludedSubFundCodes, targetAccountingLine)) {
127 return true;
128 }
129 }
130 // If none of the accounting line eligible for CAB batch, CAB batch won't take the FP document into CAB
131 return false;
132 }
133
134 /**
135 * This method check if accounting line eligible for CAB batch taking into CAB
136 *
137 * @param includedFinancialBalanceTypeCodes
138 * @param includedFinancialObjectSubTypeCodes
139 * @param excludedChartCodes
140 * @param excludedDocTypeCodes
141 * @param excludedSubFundCodes
142 * @param accountingLine
143 * @return
144 */
145 protected boolean isAccountLineEligibleForCABBatch(List<String> includedFinancialObjectSubTypeCodes, List<String> excludedChartCodes, List<String> excludedSubFundCodes, AccountingLineBase accountingLine) {
146 // check with the financialObjectSubTypeCodes system parameter
147 if (!includedFinancialObjectSubTypeCodes.isEmpty() && !includedFinancialObjectSubTypeCodes.contains(accountingLine.getObjectCode().getFinancialObjectSubTypeCode())) {
148 return false;
149 }
150
151 // check with the charOfAccountCode system parameter
152 if (!excludedChartCodes.isEmpty() && excludedChartCodes.contains(accountingLine.getChartOfAccountsCode())) {
153 return false;
154 }
155
156 // check with the subFundCodes system parameter
157 if (!excludedSubFundCodes.isEmpty() && excludedSubFundCodes.contains(accountingLine.getAccount().getSubFundGroupCode())) {
158 return false;
159 }
160
161 return true;
162 }
163
164
165 /**
166 * @see org.kuali.kfs.integration.cam.CapitalAssetManagementModuleService#deleteDocumentAssetLocks(org.kuali.rice.kns.document.Document)
167 */
168 public void deleteDocumentAssetLocks(Document document) {
169 KualiWorkflowDocument workflowDocument = document.getDocumentHeader().getWorkflowDocument();
170 CapitalAssetInformation capitalAssetInformation = ((CapitalAssetEditable) document).getCapitalAssetInformation();
171
172 // Deleting document lock
173 if (workflowDocument.stateIsCanceled() || workflowDocument.stateIsDisapproved()) {
174 if (ObjectUtils.isNotNull(capitalAssetInformation) && isAssetLockedByCurrentDocument(document.getDocumentNumber(), null)) {
175 this.deleteAssetLocks(document.getDocumentNumber(), null);
176 }
177 }
178 }
179 }