/*
* 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.cam.document.validation.impl;
import java.sql.Timestamp;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.kuali.kfs.module.cam.CamsConstants;
import org.kuali.kfs.module.cam.CamsKeyConstants;
import org.kuali.kfs.module.cam.CamsPropertyConstants;
import org.kuali.kfs.module.cam.batch.service.AssetBarcodeInventoryLoadService;
import org.kuali.kfs.module.cam.businessobject.Asset;
import org.kuali.kfs.module.cam.businessobject.AssetCondition;
import org.kuali.kfs.module.cam.businessobject.AssetType;
import org.kuali.kfs.module.cam.businessobject.BarcodeInventoryErrorDetail;
import org.kuali.kfs.module.cam.document.BarcodeInventoryErrorDocument;
import org.kuali.kfs.module.cam.document.service.AssetService;
import org.kuali.kfs.module.cam.service.AssetLockService;
import org.kuali.kfs.sys.KFSConstants;
import org.kuali.kfs.sys.KFSKeyConstants;
import org.kuali.kfs.sys.KFSPropertyConstants;
import org.kuali.kfs.sys.businessobject.Building;
import org.kuali.kfs.sys.businessobject.Room;
import org.kuali.kfs.sys.context.SpringContext;
import org.kuali.rice.core.api.datetime.DateTimeService;
import org.kuali.rice.coreservice.framework.parameter.ParameterService;
import org.kuali.rice.kns.rules.TransactionalDocumentRuleBase;
import org.kuali.rice.kns.service.DataDictionaryService;
import org.kuali.rice.krad.document.Document;
import org.kuali.rice.krad.service.BusinessObjectService;
import org.kuali.rice.krad.util.ErrorMessage;
import org.kuali.rice.krad.util.GlobalVariables;
import org.kuali.rice.krad.util.ObjectUtils;
import org.kuali.rice.location.api.campus.Campus;
import org.kuali.rice.location.api.campus.CampusService;
/**
* Business rule(s) applicable to Asset Barcode Inventory upload and Barcode inventory error document.
*/
public class BarcodeInventoryErrorDocumentRule extends TransactionalDocumentRuleBase {
protected static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(BarcodeInventoryErrorDocumentRule.class);
/**
* @see org.kuali.rice.krad.rules.DocumentRuleBase#processCustomSaveDocumentBusinessRules(org.kuali.rice.krad.document.Document)
*/
@Override
protected boolean processCustomSaveDocumentBusinessRules(Document document) {
return true;
}
/**
* Invokes several methods that validates each barcode error record
*
* @param barcodeInventoryErrorDetails
* @return boolean
*/
public boolean validateBarcodeInventoryErrorDetail(BarcodeInventoryErrorDocument document, boolean updateStatus) {
String errorPath = "";
boolean valid = true;
List<BarcodeInventoryErrorDetail> barcodeInventoryErrorDetails = document.getBarcodeInventoryErrorDetail();
List<BarcodeInventoryErrorDetail> inventory = new ArrayList<BarcodeInventoryErrorDetail>();
Long lineNumber = new Long(0);
for (BarcodeInventoryErrorDetail barcodeInventoryErrorDetail : barcodeInventoryErrorDetails) {
barcodeInventoryErrorDetail.setErrorDescription("");
if (barcodeInventoryErrorDetail.getErrorCorrectionStatusCode().equals(CamsConstants.BarCodeInventoryError.STATUS_CODE_ERROR)) {
valid = true;
errorPath = CamsConstants.DOCUMENT_PATH + "." + CamsPropertyConstants.BarcodeInventory.BARCODE_INVENTORY_DETAIL + "[" + (lineNumber.intValue()) + "]";
GlobalVariables.getMessageMap().addToErrorPath(errorPath);
Asset asset = validateTagNumberAndRetrieveActiveAsset(barcodeInventoryErrorDetail.getAssetTagNumber());
valid &= ObjectUtils.isNotNull(asset);
valid &= this.validateCampusCode(barcodeInventoryErrorDetail.getCampusCode(), barcodeInventoryErrorDetail);
if (ObjectUtils.isNotNull(asset)) {
valid &= this.validateBuildingCodeAndRoomNumber(barcodeInventoryErrorDetail, asset);
}
//valid &= this.validateBuildingCode(barcodeInventoryErrorDetail.getBuildingCode(), barcodeInventoryErrorDetail, asset);
//valid &= this.validateBuildingRoomNumber(barcodeInventoryErrorDetail.getBuildingRoomNumber(), barcodeInventoryErrorDetail, asset);
valid &= this.validateConditionCode(barcodeInventoryErrorDetail.getAssetConditionCode(), barcodeInventoryErrorDetail);
valid &= this.validateInventoryDate(barcodeInventoryErrorDetail.getUploadScanTimestamp());
valid &= this.validateTaggingLock(barcodeInventoryErrorDetail.getAssetTagNumber(), document.getDocumentNumber());
if (!valid) {
barcodeInventoryErrorDetail.setErrorCorrectionStatusCode(CamsConstants.BarCodeInventoryError.STATUS_CODE_ERROR);
// Getting the errors from GlobalVariables.
barcodeInventoryErrorDetail.setErrorDescription(getErrorMessages(errorPath));
}
else {
if (updateStatus) {
barcodeInventoryErrorDetail.setErrorCorrectionStatusCode(CamsConstants.BarCodeInventoryError.STATUS_CODE_CORRECTED);
}
barcodeInventoryErrorDetail.setErrorDescription("NONE");
}
GlobalVariables.getMessageMap().removeFromErrorPath(errorPath);
}
lineNumber++;
}
/*
* Since this document displays the asset lock error messages on the error description field, we don't want to display the
* same message at the top of the document. Therefore, deleteLockErrorMessages method deletes such errors from the
* GlobalVariables object.
*/
deleteLockErrorMessages();
return true;
}
/**
* validates the asset tag number exists in only one active asset.
*
* @param tagNumber
* @return boolean
*
* @deprecated this method is replaced by validateTagNumberAndRetrieveActiveAsset(String)
*/
@Deprecated
protected boolean validateTagNumber(String tagNumber) {
boolean result = true;
// Getting a list of active assets.
Collection<Asset> assets = getAssetService().findAssetsMatchingTagNumber(tagNumber);
if (ObjectUtils.isNull(assets) || assets.isEmpty()) {
GlobalVariables.getMessageMap().putError(CamsPropertyConstants.BarcodeInventory.ASSET_TAG_NUMBER, CamsKeyConstants.BarcodeInventory.ERROR_CAPITAL_ASSET_DOESNT_EXIST);
result = false;
}
else {
int activeAssets = assets.size();
for (Asset asset : assets) {
if (getAssetService().isAssetRetired(asset)) {
activeAssets--;
}
}
if (activeAssets == 0) {
GlobalVariables.getMessageMap().putError(CamsPropertyConstants.BarcodeInventory.ASSET_TAG_NUMBER, CamsKeyConstants.BarcodeInventory.ERROR_CAPITAL_ASSET_IS_RETIRED);
result = false;
}
else if (activeAssets > 1) {
GlobalVariables.getMessageMap().putError(CamsPropertyConstants.BarcodeInventory.ASSET_TAG_NUMBER, CamsKeyConstants.BarcodeInventory.ERROR_DUPLICATED_TAG_NUMBER);
result = false;
}
}
return result;
}
/**
* validates that the specified asset tag number exists in only one active asset;
* and if so returns that asset; otherwise returns null.
*
* @param tagNumber the specified asset tag number
* @return the only active asset with the specified tag number, or null if not existing.
*/
protected Asset validateTagNumberAndRetrieveActiveAsset(String tagNumber) {
// getting a list of active assets.
List<Asset> assets = getAssetService().findActiveAssetsMatchingTagNumber(tagNumber);
if (ObjectUtils.isNull(assets) || assets.isEmpty()) {
GlobalVariables.getMessageMap().putError(CamsPropertyConstants.BarcodeInventory.ASSET_TAG_NUMBER, CamsKeyConstants.BarcodeInventory.ERROR_CAPITAL_ASSET_DOESNT_EXIST);
return null;
}
else if (assets.size() > 1) {
GlobalVariables.getMessageMap().putError(CamsPropertyConstants.BarcodeInventory.ASSET_TAG_NUMBER, CamsKeyConstants.BarcodeInventory.ERROR_DUPLICATED_TAG_NUMBER);
return null;
}
return assets.get(0);
}
/**
* Validates the inventory date does not equals null
*
* @param inventoryDate
* @return boolean
*/
protected boolean validateInventoryDate(Timestamp inventoryDate) {
boolean result = true;
String label = SpringContext.getBean(DataDictionaryService.class).getDataDictionary().getBusinessObjectEntry(BarcodeInventoryErrorDetail.class.getName()).getAttributeDefinition(CamsPropertyConstants.BarcodeInventory.INVENTORY_DATE).getLabel();
if (inventoryDate == null) {
GlobalVariables.getMessageMap().putError(CamsPropertyConstants.BarcodeInventory.INVENTORY_DATE, CamsKeyConstants.BarcodeInventory.ERROR_INVALID_FIELD, label);
result = false;
}
return result;
}
/**
* Validates the campus code exists in the campus code table
*
* @param campusCode
* @param detail
* @return boolean
*/
protected boolean validateCampusCode(String campusCode, BarcodeInventoryErrorDetail detail) {
boolean result = true;
String label = SpringContext.getBean(DataDictionaryService.class).getDataDictionary().getBusinessObjectEntry(BarcodeInventoryErrorDetail.class.getName()).getAttributeDefinition(CamsPropertyConstants.BarcodeInventory.CAMPUS_CODE).getLabel();
Campus campus;
HashMap<String, Object> fields = new HashMap<String, Object>();
fields.put(KFSPropertyConstants.CAMPUS_CODE, detail.getCampusCode());
campus = SpringContext.getBean(CampusService.class).getCampus(campusCode/*RICE_20_REFACTORME fields */);
if (ObjectUtils.isNull(campus)) {
GlobalVariables.getMessageMap().putError(CamsPropertyConstants.BarcodeInventory.CAMPUS_CODE, CamsKeyConstants.BarcodeInventory.ERROR_INVALID_FIELD, label);
result = false;
}
else if (!campus.isActive()) {
GlobalVariables.getMessageMap().putError(CamsPropertyConstants.BarcodeInventory.CAMPUS_CODE, CamsKeyConstants.BarcodeInventory.ERROR_INACTIVE_FIELD, label);
result &= false;
}
return result;
}
/**
* Validates that the existance of the building code is consistent with the asset type requirements.
*
* @param buildingCode
* @param detail
* @prarm asset
* @return boolean
*
* @deprecated this method is replaced by validateBuildingCodeAndRoomNumber(BarcodeInventoryErrorDetail, Asset)
*/
@Deprecated
protected boolean validateBuildingCode(String buildingCode, BarcodeInventoryErrorDetail detail, Asset asset) {
boolean result = true;
String label = SpringContext.getBean(DataDictionaryService.class).getDataDictionary().getBusinessObjectEntry(BarcodeInventoryErrorDetail.class.getName()).getAttributeDefinition(CamsPropertyConstants.BarcodeInventory.BUILDING_CODE).getLabel();
//String description = asset.getCapitalAssetType().getCapitalAssetTypeDescription();
String description = asset.getCapitalAssetTypeCode();
// if the asset has empty building code, then the BCIE should too
if (StringUtils.isBlank(asset.getBuildingCode())) {
if (StringUtils.isNotBlank(buildingCode)) {
GlobalVariables.getMessageMap().putError(CamsPropertyConstants.BarcodeInventory.BUILDING_CODE, CamsKeyConstants.BarcodeInventory.ERROR_NOT_ALLOWED_FIELD, label, description);
result &= false;
}
}
// otherwise the BCIE should have a non-empty and existing active building code
else {
HashMap<String, Object> fields = new HashMap<String, Object>();
fields.put(KFSPropertyConstants.CAMPUS_CODE, detail.getCampusCode());
fields.put(KFSPropertyConstants.BUILDING_CODE, detail.getBuildingCode());
Building building = getBusinessObjectService().findByPrimaryKey(Building.class, fields);
if (StringUtils.isBlank(buildingCode)) {
GlobalVariables.getMessageMap().putError(CamsPropertyConstants.BarcodeInventory.BUILDING_CODE, CamsKeyConstants.BarcodeInventory.ERROR_REQUIRED_FIELD, label, description);
result &= false;
}
else if (ObjectUtils.isNull(building)) {
GlobalVariables.getMessageMap().putError(CamsPropertyConstants.BarcodeInventory.BUILDING_CODE, CamsKeyConstants.BarcodeInventory.ERROR_INVALID_FIELD, label);
result &= false;
}
else if (!building.isActive()) {
GlobalVariables.getMessageMap().putError(CamsPropertyConstants.BarcodeInventory.BUILDING_CODE, CamsKeyConstants.BarcodeInventory.ERROR_INACTIVE_FIELD, label);
result &= false;
}
}
return result;
}
/**
* Validates that the existance of the building room number is consistent with the asset type requirements.
*
* @param roomNumber
* @param detail
* @prarm asset
* @return boolean
*
* @deprecated this method is replaced by validateBuildingCodeAndRoomNumber(BarcodeInventoryErrorDetail, Asset)
*/
@Deprecated
protected boolean validateBuildingRoomNumber(String roomNumber, BarcodeInventoryErrorDetail detail, Asset asset) {
boolean result = true;
String label = SpringContext.getBean(DataDictionaryService.class).getDataDictionary().getBusinessObjectEntry(BarcodeInventoryErrorDetail.class.getName()).getAttributeDefinition(CamsPropertyConstants.BarcodeInventory.BUILDING_ROOM_NUMBER).getLabel();
//String description = asset.getCapitalAssetType().getCapitalAssetTypeDescription();
String description = asset.getCapitalAssetTypeCode();
// if the asset has empty building room number, then the BCIE should too
if (StringUtils.isBlank(asset.getBuildingRoomNumber())) {
if (StringUtils.isNotBlank(roomNumber)) {
GlobalVariables.getMessageMap().putError(CamsPropertyConstants.BarcodeInventory.BUILDING_ROOM_NUMBER, CamsKeyConstants.BarcodeInventory.ERROR_NOT_ALLOWED_FIELD, label, description);
result &= false;
}
}
// otherwise the BCIE should have a non-empty and existing active building room number
else {
HashMap<String, Object> fields = new HashMap<String, Object>();
fields.put(KFSPropertyConstants.CAMPUS_CODE, detail.getCampusCode());
fields.put(KFSPropertyConstants.BUILDING_CODE, detail.getBuildingCode());
fields.put(KFSPropertyConstants.BUILDING_ROOM_NUMBER, detail.getBuildingRoomNumber());
Room room = getBusinessObjectService().findByPrimaryKey(Room.class, fields);
if (StringUtils.isBlank(roomNumber)) {
GlobalVariables.getMessageMap().putError(CamsPropertyConstants.BarcodeInventory.BUILDING_ROOM_NUMBER, CamsKeyConstants.BarcodeInventory.ERROR_REQUIRED_FIELD, label, description);
result &= false;
}
else if (ObjectUtils.isNull(room)) {
GlobalVariables.getMessageMap().putError(CamsPropertyConstants.BarcodeInventory.BUILDING_ROOM_NUMBER, CamsKeyConstants.BarcodeInventory.ERROR_INVALID_FIELD, label);
result = false;
}
else if (!room.isActive()) {
GlobalVariables.getMessageMap().putError(CamsPropertyConstants.BarcodeInventory.BUILDING_ROOM_NUMBER, CamsKeyConstants.BarcodeInventory.ERROR_INACTIVE_FIELD, label);
result &= false;
}
}
return result;
}
/**
* Validates that the existance of the building code and room number is consistent with the asset type requirements.
*
* @param detail
* @prarm asset
* @return boolean
*/
protected boolean validateBuildingCodeAndRoomNumber(BarcodeInventoryErrorDetail detail, Asset asset) {
boolean result = true;
String campusCode = detail.getCampusCode();
String buildingCode = detail.getBuildingCode();
String roomNumber = detail.getBuildingRoomNumber();
String labelBuilding = SpringContext.getBean(DataDictionaryService.class).getDataDictionary().getBusinessObjectEntry(BarcodeInventoryErrorDetail.class.getName()).getAttributeDefinition(CamsPropertyConstants.BarcodeInventory.BUILDING_CODE).getLabel();
String labelRoom = SpringContext.getBean(DataDictionaryService.class).getDataDictionary().getBusinessObjectEntry(BarcodeInventoryErrorDetail.class.getName()).getAttributeDefinition(CamsPropertyConstants.BarcodeInventory.BUILDING_ROOM_NUMBER).getLabel();
String assetTypeCode = asset.getCapitalAssetTypeCode();
AssetType assetType = asset.getCapitalAssetType();
// retrieve building
HashMap<String, Object> fields = new HashMap<String, Object>();
fields.put(KFSPropertyConstants.CAMPUS_CODE, campusCode);
fields.put(KFSPropertyConstants.BUILDING_CODE, buildingCode);
Building building = getBusinessObjectService().findByPrimaryKey(Building.class, fields);
// retrieve room
fields.put(KFSPropertyConstants.BUILDING_ROOM_NUMBER, roomNumber);
Room room = getBusinessObjectService().findByPrimaryKey(Room.class, fields);
// if movingIndicator is true and requiredBuildingIndicator is false, then both building and room are required
if (assetType.isMovingIndicator() && !assetType.isRequiredBuildingIndicator()) {
// check building
if (StringUtils.isBlank(buildingCode)) {
GlobalVariables.getMessageMap().putError(CamsPropertyConstants.BarcodeInventory.BUILDING_CODE, CamsKeyConstants.BarcodeInventory.ERROR_REQUIRED_FIELD, labelBuilding, assetTypeCode);
result &= false;
}
else if (ObjectUtils.isNull(building)) {
GlobalVariables.getMessageMap().putError(CamsPropertyConstants.BarcodeInventory.BUILDING_CODE, CamsKeyConstants.BarcodeInventory.ERROR_INVALID_FIELD, labelBuilding);
result &= false;
}
else if (!building.isActive()) {
GlobalVariables.getMessageMap().putError(CamsPropertyConstants.BarcodeInventory.BUILDING_CODE, CamsKeyConstants.BarcodeInventory.ERROR_INACTIVE_FIELD, labelBuilding);
result &= false;
}
// check room
if (StringUtils.isBlank(roomNumber)) {
GlobalVariables.getMessageMap().putError(CamsPropertyConstants.BarcodeInventory.BUILDING_ROOM_NUMBER, CamsKeyConstants.BarcodeInventory.ERROR_REQUIRED_FIELD, labelRoom, assetTypeCode);
result &= false;
}
else if (ObjectUtils.isNull(room)) {
GlobalVariables.getMessageMap().putError(CamsPropertyConstants.BarcodeInventory.BUILDING_ROOM_NUMBER, CamsKeyConstants.BarcodeInventory.ERROR_INVALID_FIELD, labelRoom);
result = false;
}
else if (!room.isActive()) {
GlobalVariables.getMessageMap().putError(CamsPropertyConstants.BarcodeInventory.BUILDING_ROOM_NUMBER, CamsKeyConstants.BarcodeInventory.ERROR_INACTIVE_FIELD, labelRoom);
result &= false;
}
}
// if movingIndicator is false and requiredBuildingIndicator is true, then building is required while room is not allowed
else if (!assetType.isMovingIndicator() && assetType.isRequiredBuildingIndicator()) {
// check building
if (StringUtils.isBlank(buildingCode)) {
GlobalVariables.getMessageMap().putError(CamsPropertyConstants.BarcodeInventory.BUILDING_CODE, CamsKeyConstants.BarcodeInventory.ERROR_REQUIRED_FIELD, labelBuilding, assetTypeCode);
result &= false;
}
else if (ObjectUtils.isNull(building)) {
GlobalVariables.getMessageMap().putError(CamsPropertyConstants.BarcodeInventory.BUILDING_CODE, CamsKeyConstants.BarcodeInventory.ERROR_INVALID_FIELD, labelBuilding);
result &= false;
}
else if (!building.isActive()) {
GlobalVariables.getMessageMap().putError(CamsPropertyConstants.BarcodeInventory.BUILDING_CODE, CamsKeyConstants.BarcodeInventory.ERROR_INACTIVE_FIELD, labelBuilding);
result &= false;
}
// check room
if (StringUtils.isNotBlank(roomNumber)) {
GlobalVariables.getMessageMap().putError(CamsPropertyConstants.BarcodeInventory.BUILDING_ROOM_NUMBER, CamsKeyConstants.BarcodeInventory.ERROR_NOT_ALLOWED_FIELD, labelRoom, assetTypeCode);
result &= false;
}
}
// if both movingIndicator and requiredBuildingIndicator are false, then neither building nor room is allowed
else if (!assetType.isMovingIndicator() && !assetType.isRequiredBuildingIndicator()) {
// check building
if (StringUtils.isNotBlank(buildingCode)) {
GlobalVariables.getMessageMap().putError(CamsPropertyConstants.BarcodeInventory.BUILDING_CODE, CamsKeyConstants.BarcodeInventory.ERROR_NOT_ALLOWED_FIELD, labelBuilding, assetTypeCode);
result &= false;
}
// check room
if (StringUtils.isNotBlank(roomNumber)) {
GlobalVariables.getMessageMap().putError(CamsPropertyConstants.BarcodeInventory.BUILDING_ROOM_NUMBER, CamsKeyConstants.BarcodeInventory.ERROR_NOT_ALLOWED_FIELD, labelRoom, assetTypeCode);
result &= false;
}
}
return result;
}
/**
* Validates the condition code exists in the condition table
*
* @param conditionCode
* @param detail
* @return boolean
*/
protected boolean validateConditionCode(String conditionCode, BarcodeInventoryErrorDetail detail) {
boolean result = true;
String label = SpringContext.getBean(DataDictionaryService.class).getDataDictionary().getBusinessObjectEntry(BarcodeInventoryErrorDetail.class.getName()).getAttributeDefinition(CamsPropertyConstants.BarcodeInventory.ASSET_CONDITION_CODE).getLabel();
AssetCondition condition;
HashMap<String, Object> fields = new HashMap<String, Object>();
fields.put(CamsPropertyConstants.BarcodeInventory.ASSET_CONDITION_CODE, detail.getAssetConditionCode());
condition = getBusinessObjectService().findByPrimaryKey(AssetCondition.class, fields);
if (ObjectUtils.isNull(condition)) {
GlobalVariables.getMessageMap().putError(CamsPropertyConstants.BarcodeInventory.ASSET_CONDITION_CODE, CamsKeyConstants.BarcodeInventory.ERROR_INVALID_FIELD, label);
result &= false;
}
else if (!condition.isActive()) {
GlobalVariables.getMessageMap().putError(CamsPropertyConstants.BarcodeInventory.ASSET_CONDITION_CODE, CamsKeyConstants.BarcodeInventory.ERROR_INACTIVE_FIELD, label);
result &= false;
}
return result;
}
/**
* Validates the Asset doesn't have any tagging locks as result of an existing document in process where the same asset being
* affected
*
* @param tagNumber
* @return boolean
*/
protected boolean validateTaggingLock(String tagNumber, String documentNumber) {
boolean result = true;
boolean isAssetLocked = false;
String skipAssetLockValidation;
// Getting system parameter in order to determine whether or not the asset locks will be ignored.
if (getParameterService().parameterExists(BarcodeInventoryErrorDocument.class, CamsConstants.Parameters.BAR_CODE_ERROR_DOCUMENT_IGNORES_LOCKS)) {
skipAssetLockValidation = getParameterService().getParameterValueAsString(BarcodeInventoryErrorDocument.class, CamsConstants.Parameters.BAR_CODE_ERROR_DOCUMENT_IGNORES_LOCKS);
}
else {
LOG.warn("CAMS Parameter '" + CamsConstants.Parameters.BAR_CODE_ERROR_DOCUMENT_IGNORES_LOCKS + "' not found! - Setting default value to 'N' ");
skipAssetLockValidation = CamsConstants.BarCodeInventoryError.BAR_CODE_ERROR_DOCUMENT_IGNORES_LOCKS_NO;
}
if (skipAssetLockValidation == null || StringUtils.isEmpty(skipAssetLockValidation) || StringUtils.equals(skipAssetLockValidation, CamsConstants.BarCodeInventoryError.BAR_CODE_ERROR_DOCUMENT_IGNORES_LOCKS_NO)) {
// Getting a list of active assets.
List<Asset> assets = getAssetService().findActiveAssetsMatchingTagNumber(tagNumber);
if (assets.size() > 1) {
GlobalVariables.getMessageMap().putError(CamsPropertyConstants.BarcodeInventory.ASSET_TAG_NUMBER, CamsKeyConstants.BarcodeInventory.ERROR_DUPLICATED_TAG_NUMBER);
result = false;
}
else if ((assets.size() > 0)) {
// isAssetLocked = getAssetService().isAssetLocked("", assets.get(0).getCapitalAssetNumber());
List<Long> assetNumbers = new ArrayList<Long>();
assetNumbers.add(assets.get(0).getCapitalAssetNumber());
List<String> lockingDocNumbers = SpringContext.getBean(AssetLockService.class).getAssetLockingDocuments(assetNumbers, CamsConstants.DocumentTypeName.ASSET_BARCODE_INVENTORY_ERROR, documentNumber);
if (lockingDocNumbers != null && !lockingDocNumbers.isEmpty()) {
for (String lockingDocNumber : lockingDocNumbers) {
// String lockingDocumentId = getAssetService().getLockingDocumentId(documentNumber,
// assets.get(0).getCapitalAssetNumber());
GlobalVariables.getMessageMap().putError(CamsPropertyConstants.BarcodeInventory.ASSET_TAG_NUMBER, CamsKeyConstants.BarcodeInventory.ERROR_ASSET_LOCKED, lockingDocNumber);
}
result = false;
}
}
}
else {
result = true;
}
return result;
}
/**
* Iterates over the list of errors each records might have and returns a single string with all the errors for each asset
*
* @param errorPath
* @return String
*/
protected String getErrorMessages(String errorPath) {
String message = "";
String[] fields = { CamsPropertyConstants.BarcodeInventory.ASSET_TAG_NUMBER, CamsPropertyConstants.BarcodeInventory.INVENTORY_DATE, CamsPropertyConstants.BarcodeInventory.CAMPUS_CODE, CamsPropertyConstants.BarcodeInventory.BUILDING_CODE, CamsPropertyConstants.BarcodeInventory.BUILDING_ROOM_NUMBER, CamsPropertyConstants.BarcodeInventory.ASSET_CONDITION_CODE };
for (int i = 0; i < fields.length; i++) {
String propertyName = errorPath + "." + fields[i];
if (GlobalVariables.getMessageMap().doesPropertyHaveError(propertyName)) {
for (Object errorMessage : GlobalVariables.getMessageMap().getMessages(propertyName)) {
String errorMsg = getKualiConfigurationService().getPropertyValueAsString(((ErrorMessage) errorMessage).getErrorKey());
message += ", " + MessageFormat.format(errorMsg, (Object[]) ((ErrorMessage) errorMessage).getMessageParameters());
}
}
}
return (StringUtils.isEmpty(message) ? message : message.substring(2));
}
/**
* Deletes the asset locking error messages from the GlobalVariables.
*
* @return none
*/
protected void deleteLockErrorMessages() {
// Finding locking error messages
List<ErrorMessage> el = new ArrayList<ErrorMessage>();
if (GlobalVariables.getMessageMap().getMessages(KFSConstants.GLOBAL_ERRORS) == null) {
return;
}
for (Iterator<ErrorMessage> iterator = GlobalVariables.getMessageMap().getMessages(KFSConstants.GLOBAL_ERRORS).iterator(); iterator.hasNext();) {
ErrorMessage errorMessage = iterator.next();
if (errorMessage.getErrorKey().equals(KFSKeyConstants.ERROR_MAINTENANCE_LOCKED)) {
el.add(errorMessage);
}
}
// Deleting asset locked error messages from global variable.
for (ErrorMessage em : el) {
GlobalVariables.getMessageMap().getMessages(KFSConstants.GLOBAL_ERRORS).remove(em);
}
}
protected ParameterService getParameterService() {
return SpringContext.getBean(ParameterService.class);
}
protected AssetService getAssetService() {
return SpringContext.getBean(AssetService.class);
}
protected DateTimeService getDateTimeService() {
return SpringContext.getBean(DateTimeService.class);
}
protected BusinessObjectService getBusinessObjectService() {
return SpringContext.getBean(BusinessObjectService.class);
}
protected AssetBarcodeInventoryLoadService getAssetBarcodeInventoryLoadService() {
return SpringContext.getBean(AssetBarcodeInventoryLoadService.class);
}
}