/*
* 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.businessobject;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.kuali.kfs.module.cam.CamsConstants;
import org.kuali.kfs.sys.context.SpringContext;
import org.kuali.rice.core.api.datetime.DateTimeService;
import org.kuali.rice.krad.bo.DocumentHeader;
import org.kuali.rice.krad.bo.GlobalBusinessObject;
import org.kuali.rice.krad.bo.GlobalBusinessObjectDetail;
import org.kuali.rice.krad.bo.PersistableBusinessObject;
import org.kuali.rice.krad.bo.PersistableBusinessObjectBase;
import org.kuali.rice.krad.service.BusinessObjectService;
/**
* @author Kuali Nervous System Team (kualidev@oncourse.iu.edu)
*/
public class AssetLocationGlobal extends PersistableBusinessObjectBase implements GlobalBusinessObject {
private String documentNumber;
private DocumentHeader documentHeader;
private List<AssetLocationGlobalDetail> assetLocationGlobalDetails;
/**
* Default constructor.
*/
public AssetLocationGlobal() {
assetLocationGlobalDetails = new ArrayList<AssetLocationGlobalDetail>();
}
/**
* Gets the documentNumber attribute.
*
* @return Returns the documentNumber
*
*/
public String getDocumentNumber() {
return documentNumber;
}
/**
* Sets the documentNumber attribute.
*
* @param documentNumber The documentNumber to set.
*
*/
public void setDocumentNumber(String documentNumber) {
this.documentNumber = documentNumber;
}
/**
* Gets the documentHeader attribute.
* @return Returns the documentHeader.
*/
public DocumentHeader getDocumentHeader() {
return documentHeader;
}
/**
* Sets the documentHeader attribute value.
* @param documentHeader The documentHeader to set.
* @deprecated
*/
public void setDocumentHeader(DocumentHeader documentHeader) {
this.documentHeader = documentHeader;
}
/**
* Gets the assetLocationGlobalDetails attribute.
* @return Returns the assetLocationGlobalDetails.
*/
public List<AssetLocationGlobalDetail> getAssetLocationGlobalDetails() {
return assetLocationGlobalDetails;
}
/**
* Sets the assetLocationGlobalDetails attribute value.
* @param assetLocationGlobalDetails The assetLocationGlobalDetails to set.
*/
public void setAssetLocationGlobalDetails(List<AssetLocationGlobalDetail> assetLocationGlobalDetails) {
this.assetLocationGlobalDetails = assetLocationGlobalDetails;
}
/**
* @see org.kuali.rice.krad.document.GlobalBusinessObject#getGlobalChangesToDelete()
*/
public List<PersistableBusinessObject> generateDeactivationsToPersist() {
return null;
}
/**
* This returns a list of Assets to update
*
* @see org.kuali.rice.krad.bo.GlobalBusinessObject#generateGlobalChangesToPersist()
*/
public List<PersistableBusinessObject> generateGlobalChangesToPersist() {
// the list of persist-ready BOs
List<PersistableBusinessObject> persistables = new ArrayList();
// walk over each change detail record
for (AssetLocationGlobalDetail detail : assetLocationGlobalDetails) {
boolean isCampusCodeChanged = false, isBuildingCodeChanged = false, isBuildingRoomNumberChanged = false, isBuildingSubRoomNumberChanged = false, isCampusTagNumberChanged = false;
// load the object by keys
Asset asset = (Asset) SpringContext.getBean(BusinessObjectService.class).findByPrimaryKey(Asset.class, detail.getPrimaryKeys());
// if we got a valid asset, do the processing
if (asset != null) {
if (!StringUtils.equalsIgnoreCase(asset.getCampusCode(), detail.getCampusCode()) ) {
asset.setCampusCode(detail.getCampusCode());
isCampusCodeChanged = true;
}
if (!StringUtils.equalsIgnoreCase(asset.getBuildingCode(), detail.getBuildingCode()) ) {
asset.setBuildingCode(detail.getBuildingCode());
isBuildingCodeChanged = true;
}
if (!StringUtils.equalsIgnoreCase(asset.getBuildingRoomNumber(), detail.getBuildingRoomNumber()) ) {
asset.setBuildingRoomNumber(detail.getBuildingRoomNumber());
isBuildingRoomNumberChanged = true;
}
if (!StringUtils.equalsIgnoreCase(asset.getBuildingSubRoomNumber(), detail.getBuildingSubRoomNumber()) ) {
asset.setBuildingSubRoomNumber(detail.getBuildingSubRoomNumber());
isBuildingSubRoomNumberChanged = true;
}
if (!StringUtils.equalsIgnoreCase(detail.getCampusTagNumber(), asset.getCampusTagNumber())) {
asset.setOldTagNumber(asset.getCampusTagNumber());
asset.setCampusTagNumber(detail.getCampusTagNumber());
isCampusTagNumberChanged = true;
}
updateOffCampusWithOnCampusValues(asset);
if(isCampusCodeChanged || isBuildingCodeChanged || isBuildingRoomNumberChanged || isBuildingSubRoomNumberChanged || isCampusTagNumberChanged)
{
asset.setLastInventoryDate(new Timestamp(SpringContext.getBean(DateTimeService.class).getCurrentSqlDate().getTime()));
}
persistables.add(asset);
}
}
return persistables;
}
/**
* KFSMI-6695 Location Global allows update to building, room when asest has off campus location fields poplulated, after update
* assets has both on campus and off campus. An asset should not have both an on campus address ( buidling, and room) and an off
* campus addresses. If the building and room are updated from location global then the following fields should be set to null
* WHERE the ast_loc_typ_cd = 'O' cm_ast_loc_t.ast_loc_cntnt_nm cm_ast_loc_t.ast_loc_strt_addr cm_ast_loc_t.ast_loc_city_nm
* cm_ast_loc_t.ast_loc_state_cd cm_ast_loc_t.ast_loc_cntry_cd cm_ast_loc_t.ast_loc_zip_cd
*
* @param asset
*/
private void updateOffCampusWithOnCampusValues(Asset asset) {
List<AssetLocation> toDelete = new ArrayList<AssetLocation>();
if (asset.getAssetLocations() != null) {
for (AssetLocation location : asset.getAssetLocations()) {
boolean offCampus = CamsConstants.AssetLocationTypeCode.OFF_CAMPUS.equals(location.getAssetLocationTypeCode());
boolean buildingOrRoom = StringUtils.isNotBlank(asset.getBuildingCode()) || StringUtils.isNotBlank(asset.getBuildingRoomNumber());
if (offCampus && buildingOrRoom) {
location.setAssetLocationContactName(null); // cm_ast_loc_t.ast_loc_cntnt_nm
location.setAssetLocationStreetAddress(null); // cm_ast_loc_t.ast_loc_strt_addr
location.setAssetLocationCityName(null); // cm_ast_loc_t.ast_loc_city_nm
location.setAssetLocationStateCode(null); // cm_ast_loc_t.ast_loc_state_cd
location.setAssetLocationCountryCode(null); // cm_ast_loc_t.ast_loc_cntry_cd
location.setAssetLocationZipCode(null); // cm_ast_loc_t.ast_loc_zip_cd
// this didn't work
//toDelete.add(location);
}
}
}
// this didn't work
//asset.getAssetLocations().removeAll(toDelete);
}
public boolean isPersistable() {
return true;
}
public List<? extends GlobalBusinessObjectDetail> getAllDetailObjects() {
return getAssetLocationGlobalDetails();
}
/**
* @see org.kuali.rice.krad.bo.BusinessObjectBase#toStringMapper()
*/
protected LinkedHashMap toStringMapper_RICE20_REFACTORME() {
LinkedHashMap m = new LinkedHashMap();
m.put("documentNumber", this.documentNumber);
return m;
}
}