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.purap.document.validation.impl; 017 018 import org.apache.commons.lang.StringUtils; 019 import org.kuali.kfs.integration.cab.CapitalAssetBuilderModuleService; 020 import org.kuali.kfs.integration.purap.CapitalAssetLocation; 021 import org.kuali.kfs.integration.purap.CapitalAssetSystem; 022 import org.kuali.kfs.module.purap.PurapConstants; 023 import org.kuali.kfs.module.purap.PurapKeyConstants; 024 import org.kuali.kfs.module.purap.PurapPropertyConstants; 025 import org.kuali.kfs.module.purap.businessobject.PurchasingCapitalAssetItem; 026 import org.kuali.kfs.module.purap.businessobject.RequisitionCapitalAssetSystem; 027 import org.kuali.kfs.module.purap.document.PurchasingDocument; 028 import org.kuali.kfs.module.purap.document.RequisitionDocument; 029 import org.kuali.kfs.module.purap.document.service.PurchasingService; 030 import org.kuali.kfs.sys.context.SpringContext; 031 import org.kuali.kfs.sys.document.validation.GenericValidation; 032 import org.kuali.kfs.sys.document.validation.event.AttributedDocumentEvent; 033 import org.kuali.rice.kns.service.DataDictionaryService; 034 import org.kuali.rice.kns.util.GlobalVariables; 035 import org.kuali.rice.kns.util.ObjectUtils; 036 import org.kuali.rice.kns.util.RiceKeyConstants; 037 038 public class PurchasingCapitalAssetValidation extends GenericValidation { 039 CapitalAssetBuilderModuleService capitalAssetBuilderModuleService; 040 PurchasingService purchasingService; 041 protected static String ERROR_PATH_PREFIX_FOR_IND_SYSTEM = "document.purchasingCapitalAssetItems["; 042 protected static String ERROR_PATH_SUFFIX_FOR_IND_SYSTEM = "].purchasingCapitalAssetSystem"; 043 protected static String ERROR_PATH_PREFIX_FOR_ONE_SYSTEM = "document.purchasingCapitalAssetSystems[0]"; 044 045 public boolean validate(AttributedDocumentEvent event) { 046 GlobalVariables.getMessageMap().clearErrorPath(); 047 boolean valid = true; 048 PurchasingDocument purchasingDocument = (PurchasingDocument) event.getDocument(); 049 050 boolean requiredByObjectSubType = !capitalAssetBuilderModuleService.validatePurchasingObjectSubType(purchasingDocument); 051 boolean requiredByChart = !capitalAssetBuilderModuleService.validateAllFieldRequirementsByChart(purchasingDocument); 052 boolean capitalAssetRequired = requiredByObjectSubType && requiredByChart; 053 054 if (capitalAssetRequired) { 055 // if capital asset required, check to see if the capital asset data are setup 056 String typeCode = purchasingDocument.getCapitalAssetSystemTypeCode(); 057 if (StringUtils.isBlank(typeCode) || StringUtils.isBlank(purchasingDocument.getCapitalAssetSystemStateCode()) || 058 purchasingDocument.getPurchasingCapitalAssetSystems() == null || purchasingDocument.getPurchasingCapitalAssetItems() == null){ 059 valid = false; 060 } 061 else if ((typeCode.equals(PurapConstants.CapitalAssetTabStrings.ONE_SYSTEM) || typeCode.equals(PurapConstants.CapitalAssetTabStrings.MULTIPLE_SYSTEMS)) && 062 purchasingDocument.getPurchasingCapitalAssetSystems().size() == 0) { 063 valid = false; 064 } 065 /* TODO 066 * either complete the following with checking that capital asset items are correctly setup, or replace this whole part (and above) 067 * with checking on a flag that indicates whether select/update capital asset has been done since last item changes 068 */ 069 else if (purchasingDocument.getPurchasingCapitalAssetItems().isEmpty()) { 070 valid = false; 071 } 072 073 if (!valid) { 074 GlobalVariables.getMessageMap().putError("newPurchasingItemCapitalAssetLine", PurapKeyConstants.ERROR_CAPITAL_ASSET_REQD_FOR_PUR_OBJ_SUB_TYPE); 075 return valid; 076 } 077 } 078 else { 079 // if capital asset not required, reset system type and state code in case they are filled in 080 // if capital asset items are empty, then set sytem type code and system state code to null 081 // fix to jira KFSMI-5146 082 if (purchasingDocument.getPurchasingCapitalAssetItems().isEmpty()) { 083 purchasingDocument.setCapitalAssetSystemTypeCode(null); 084 purchasingDocument.setCapitalAssetSystemStateCode(null); 085 } 086 } 087 088 // We only need to do capital asset validations if the capital asset system type is not blank. 089 if (StringUtils.isNotBlank(purchasingDocument.getCapitalAssetSystemTypeCode())) { 090 valid &= capitalAssetBuilderModuleService.validatePurchasingData(purchasingDocument); 091 092 // FIXME hjs move this to cab module service 093 // validate complete location addresses 094 if (purchasingDocument.getCapitalAssetSystemTypeCode().equals(PurapConstants.CapitalAssetSystemTypes.INDIVIDUAL)) { 095 for (CapitalAssetSystem system : purchasingDocument.getPurchasingCapitalAssetSystems()) { 096 for (CapitalAssetLocation location : system.getCapitalAssetLocations()) { 097 valid &= purchasingService.checkCapitalAssetLocation(location); 098 } 099 } 100 } 101 else if (purchasingDocument.getCapitalAssetSystemTypeCode().equals(PurapConstants.CapitalAssetSystemTypes.ONE_SYSTEM)) { 102 CapitalAssetSystem system = purchasingDocument.getPurchasingCapitalAssetSystems().get(0); 103 for (CapitalAssetLocation location : system.getCapitalAssetLocations()) { 104 valid &= purchasingService.checkCapitalAssetLocation(location); 105 } 106 } 107 108 // Validate asset type code if entered by user. 109 valid &= validateAssetTypeExistence(purchasingDocument); 110 } 111 112 113 return valid; 114 } 115 116 /** 117 * Validate user input asset type code. 118 * 119 * @param purchasingDocument 120 * @return 121 */ 122 protected boolean validateAssetTypeExistence(PurchasingDocument purchasingDocument) { 123 boolean valid = true; 124 // validate for Individual system 125 if (purchasingDocument.getCapitalAssetSystemTypeCode().equals(PurapConstants.CapitalAssetSystemTypes.INDIVIDUAL)) { 126 int i = 0; 127 for (PurchasingCapitalAssetItem capitalAssetItem : purchasingDocument.getPurchasingCapitalAssetItems()) { 128 if (ObjectUtils.isNotNull(capitalAssetItem) && ObjectUtils.isNotNull(capitalAssetItem.getPurchasingCapitalAssetSystem())) { 129 String assetTypeCode = capitalAssetItem.getPurchasingCapitalAssetSystem().getCapitalAssetTypeCode(); 130 if (StringUtils.isNotBlank(assetTypeCode) && !capitalAssetBuilderModuleService.isAssetTypeExisting(assetTypeCode)) { 131 valid = false; 132 String errorPath = ERROR_PATH_PREFIX_FOR_IND_SYSTEM + new Integer(i).toString() + ERROR_PATH_SUFFIX_FOR_IND_SYSTEM; 133 addAssetTypeErrorWithFullErrorPath(errorPath); 134 } 135 } 136 i++; 137 } 138 } 139 else if (purchasingDocument.getCapitalAssetSystemTypeCode().equals(PurapConstants.CapitalAssetSystemTypes.ONE_SYSTEM)) { 140 // validate for One system 141 if (ObjectUtils.isNotNull(purchasingDocument.getPurchasingCapitalAssetSystems())) { 142 CapitalAssetSystem system = purchasingDocument.getPurchasingCapitalAssetSystems().get(0); 143 if (ObjectUtils.isNotNull(system) && StringUtils.isNotBlank(system.getCapitalAssetTypeCode()) && !capitalAssetBuilderModuleService.isAssetTypeExisting(system.getCapitalAssetTypeCode())) { 144 valid = false; 145 String errorPath = ERROR_PATH_PREFIX_FOR_ONE_SYSTEM; 146 addAssetTypeErrorWithFullErrorPath(errorPath); 147 } 148 } 149 } 150 // Validate for Multiple system is ignored since currently it's not supported to enter. 151 return valid; 152 } 153 154 /** 155 * Add asset type error to the global message map. 156 * 157 * @param errorPath 158 */ 159 protected void addAssetTypeErrorWithFullErrorPath(String errorPath) { 160 GlobalVariables.getMessageMap().addToErrorPath(errorPath); 161 String label = SpringContext.getBean(DataDictionaryService.class).getDataDictionary().getBusinessObjectEntry(RequisitionCapitalAssetSystem.class.getName()).getAttributeDefinition(PurapPropertyConstants.CAPITAL_ASSET_TYPE_CODE).getLabel(); 162 GlobalVariables.getMessageMap().putError(PurapPropertyConstants.CAPITAL_ASSET_TYPE_CODE, RiceKeyConstants.ERROR_EXISTENCE, label); 163 GlobalVariables.getMessageMap().removeFromErrorPath(errorPath); 164 } 165 166 public CapitalAssetBuilderModuleService getCapitalAssetBuilderModuleService() { 167 return capitalAssetBuilderModuleService; 168 } 169 170 public void setCapitalAssetBuilderModuleService(CapitalAssetBuilderModuleService capitalAssetBuilderModuleService) { 171 this.capitalAssetBuilderModuleService = capitalAssetBuilderModuleService; 172 } 173 174 public PurchasingService getPurchasingService() { 175 return purchasingService; 176 } 177 178 public void setPurchasingService(PurchasingService purchasingService) { 179 this.purchasingService = purchasingService; 180 } 181 182 }