/*
* The Kuali Financial System, a comprehensive financial management system for higher education.
*
* Copyright 2005-2014 The Kuali Foundation
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.kuali.kfs.module.purap.document.validation.impl;
import org.apache.commons.lang.StringUtils;
import org.kuali.kfs.integration.cab.CapitalAssetBuilderModuleService;
import org.kuali.kfs.integration.purap.CapitalAssetLocation;
import org.kuali.kfs.integration.purap.CapitalAssetSystem;
import org.kuali.kfs.module.purap.PurapConstants;
import org.kuali.kfs.module.purap.PurapKeyConstants;
import org.kuali.kfs.module.purap.PurapPropertyConstants;
import org.kuali.kfs.module.purap.businessobject.PurApItem;
import org.kuali.kfs.module.purap.businessobject.PurchasingCapitalAssetItem;
import org.kuali.kfs.module.purap.businessobject.RequisitionCapitalAssetSystem;
import org.kuali.kfs.module.purap.document.PurchasingDocument;
import org.kuali.kfs.module.purap.document.service.PurchasingService;
import org.kuali.kfs.sys.context.SpringContext;
import org.kuali.kfs.sys.document.validation.GenericValidation;
import org.kuali.kfs.sys.document.validation.event.AttributedDocumentEvent;
import org.kuali.rice.core.api.util.RiceKeyConstants;
import org.kuali.rice.kns.service.DataDictionaryService;
import org.kuali.rice.krad.util.GlobalVariables;
import org.kuali.rice.krad.util.ObjectUtils;
public class PurchasingCapitalAssetValidation extends GenericValidation {
CapitalAssetBuilderModuleService capitalAssetBuilderModuleService;
PurchasingService purchasingService;
protected static String ERROR_PATH_PREFIX_FOR_IND_SYSTEM = "document.purchasingCapitalAssetItems[";
protected static String ERROR_PATH_SUFFIX_FOR_IND_SYSTEM = "].purchasingCapitalAssetSystem";
protected static String ERROR_PATH_PREFIX_FOR_ONE_SYSTEM = "document.purchasingCapitalAssetSystems[0]";
@Override
public boolean validate(AttributedDocumentEvent event) {
GlobalVariables.getMessageMap().clearErrorPath();
boolean valid = true;
PurchasingDocument purchasingDocument = (PurchasingDocument) event.getDocument();
boolean requiredByObjectSubType = !capitalAssetBuilderModuleService.validatePurchasingObjectSubType(purchasingDocument);
boolean requiredByChart = !capitalAssetBuilderModuleService.validateAllFieldRequirementsByChart(purchasingDocument);
boolean capitalAssetRequired = requiredByObjectSubType && requiredByChart;
if (capitalAssetRequired) {
// if capital asset required, check to see if the capital asset data are setup
String typeCode = purchasingDocument.getCapitalAssetSystemTypeCode();
if (StringUtils.isBlank(typeCode) || StringUtils.isBlank(purchasingDocument.getCapitalAssetSystemStateCode()) ||
purchasingDocument.getPurchasingCapitalAssetSystems() == null || purchasingDocument.getPurchasingCapitalAssetItems() == null){
valid = false;
}
else if ((typeCode.equals(PurapConstants.CapitalAssetTabStrings.ONE_SYSTEM) || typeCode.equals(PurapConstants.CapitalAssetTabStrings.MULTIPLE_SYSTEMS)) &&
purchasingDocument.getPurchasingCapitalAssetSystems().size() == 0) {
valid = false;
}
/* TODO
* either complete the following with checking that capital asset items are correctly setup, or replace this whole part (and above)
* with checking on a flag that indicates whether select/update capital asset has been done since last item changes
*/
else if (purchasingDocument.getPurchasingCapitalAssetItems().isEmpty()) {
valid = false;
}
else {
int expectedCapAssetItems = 0;
for (PurApItem purapItem : purchasingDocument.getItems()) {
if (purapItem.getItemType().isLineItemIndicator()) {
if (capitalAssetBuilderModuleService.doesItemNeedCapitalAsset(purapItem.getItemTypeCode(), purapItem.getSourceAccountingLines())) {
expectedCapAssetItems++;
}
}
}
if(purchasingDocument.getPurchasingCapitalAssetItems().size() != expectedCapAssetItems){
valid = false;
}
}
if (!valid) {
GlobalVariables.getMessageMap().putError("newPurchasingItemCapitalAssetLine", PurapKeyConstants.ERROR_CAPITAL_ASSET_REQD_FOR_PUR_OBJ_SUB_TYPE);
return valid;
}
}
else {
// if capital asset not required, reset system type and state code in case they are filled in
// if capital asset items are empty, then set sytem type code and system state code to null
// fix to jira KFSMI-5146
if (purchasingDocument.getPurchasingCapitalAssetItems().isEmpty()) {
purchasingDocument.setCapitalAssetSystemTypeCode(null);
purchasingDocument.setCapitalAssetSystemStateCode(null);
}
}
// We only need to do capital asset validations if the capital asset system type is not blank.
if (StringUtils.isNotBlank(purchasingDocument.getCapitalAssetSystemTypeCode())) {
valid &= capitalAssetBuilderModuleService.validatePurchasingData(purchasingDocument);
// FIXME hjs move this to cab module service
// validate complete location addresses
if (purchasingDocument.getCapitalAssetSystemTypeCode().equals(PurapConstants.CapitalAssetSystemTypes.INDIVIDUAL)) {
for (CapitalAssetSystem system : purchasingDocument.getPurchasingCapitalAssetSystems()) {
for (CapitalAssetLocation location : system.getCapitalAssetLocations()) {
valid &= purchasingService.checkCapitalAssetLocation(location);
}
}
}
else if (purchasingDocument.getCapitalAssetSystemTypeCode().equals(PurapConstants.CapitalAssetSystemTypes.ONE_SYSTEM)) {
CapitalAssetSystem system = purchasingDocument.getPurchasingCapitalAssetSystems().get(0);
for (CapitalAssetLocation location : system.getCapitalAssetLocations()) {
valid &= purchasingService.checkCapitalAssetLocation(location);
}
}
// Validate asset type code if entered by user.
valid &= validateAssetTypeExistence(purchasingDocument);
}
return valid;
}
/**
* Validate user input asset type code.
*
* @param purchasingDocument
* @return
*/
protected boolean validateAssetTypeExistence(PurchasingDocument purchasingDocument) {
boolean valid = true;
// validate for Individual system
if (purchasingDocument.getCapitalAssetSystemTypeCode().equals(PurapConstants.CapitalAssetSystemTypes.INDIVIDUAL)) {
int i = 0;
for (PurchasingCapitalAssetItem capitalAssetItem : purchasingDocument.getPurchasingCapitalAssetItems()) {
if (ObjectUtils.isNotNull(capitalAssetItem) && ObjectUtils.isNotNull(capitalAssetItem.getPurchasingCapitalAssetSystem())) {
String assetTypeCode = capitalAssetItem.getPurchasingCapitalAssetSystem().getCapitalAssetTypeCode();
if (StringUtils.isNotBlank(assetTypeCode) && !capitalAssetBuilderModuleService.isAssetTypeExisting(assetTypeCode)) {
valid = false;
String errorPath = ERROR_PATH_PREFIX_FOR_IND_SYSTEM + new Integer(i).toString() + ERROR_PATH_SUFFIX_FOR_IND_SYSTEM;
addAssetTypeErrorWithFullErrorPath(errorPath);
}
}
i++;
}
}
else if (purchasingDocument.getCapitalAssetSystemTypeCode().equals(PurapConstants.CapitalAssetSystemTypes.ONE_SYSTEM)) {
// validate for One system
if (ObjectUtils.isNotNull(purchasingDocument.getPurchasingCapitalAssetSystems())) {
CapitalAssetSystem system = purchasingDocument.getPurchasingCapitalAssetSystems().get(0);
if (ObjectUtils.isNotNull(system) && StringUtils.isNotBlank(system.getCapitalAssetTypeCode()) && !capitalAssetBuilderModuleService.isAssetTypeExisting(system.getCapitalAssetTypeCode())) {
valid = false;
String errorPath = ERROR_PATH_PREFIX_FOR_ONE_SYSTEM;
addAssetTypeErrorWithFullErrorPath(errorPath);
}
}
}
// Validate for Multiple system is ignored since currently it's not supported to enter.
return valid;
}
/**
* Add asset type error to the global message map.
*
* @param errorPath
*/
protected void addAssetTypeErrorWithFullErrorPath(String errorPath) {
GlobalVariables.getMessageMap().addToErrorPath(errorPath);
String label = SpringContext.getBean(DataDictionaryService.class).getDataDictionary().getBusinessObjectEntry(RequisitionCapitalAssetSystem.class.getName()).getAttributeDefinition(PurapPropertyConstants.CAPITAL_ASSET_TYPE_CODE).getLabel();
GlobalVariables.getMessageMap().putError(PurapPropertyConstants.CAPITAL_ASSET_TYPE_CODE, RiceKeyConstants.ERROR_EXISTENCE, label);
GlobalVariables.getMessageMap().removeFromErrorPath(errorPath);
}
public CapitalAssetBuilderModuleService getCapitalAssetBuilderModuleService() {
return capitalAssetBuilderModuleService;
}
public void setCapitalAssetBuilderModuleService(CapitalAssetBuilderModuleService capitalAssetBuilderModuleService) {
this.capitalAssetBuilderModuleService = capitalAssetBuilderModuleService;
}
public PurchasingService getPurchasingService() {
return purchasingService;
}
public void setPurchasingService(PurchasingService purchasingService) {
this.purchasingService = purchasingService;
}
}