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.document.service.impl; 017 018 import java.util.ArrayList; 019 import java.util.List; 020 021 import org.apache.log4j.Logger; 022 import org.kuali.kfs.coa.businessobject.Account; 023 import org.kuali.kfs.coa.businessobject.ObjectCode; 024 import org.kuali.kfs.coa.businessobject.OffsetDefinition; 025 import org.kuali.kfs.coa.service.ObjectCodeService; 026 import org.kuali.kfs.coa.service.OffsetDefinitionService; 027 import org.kuali.kfs.module.cam.CamsConstants; 028 import org.kuali.kfs.module.cam.CamsPropertyConstants; 029 import org.kuali.kfs.module.cam.businessobject.Asset; 030 import org.kuali.kfs.module.cam.businessobject.AssetGlpeSourceDetail; 031 import org.kuali.kfs.module.cam.businessobject.AssetLocation; 032 import org.kuali.kfs.module.cam.businessobject.AssetObjectCode; 033 import org.kuali.kfs.module.cam.businessobject.AssetOrganization; 034 import org.kuali.kfs.module.cam.businessobject.AssetPayment; 035 import org.kuali.kfs.module.cam.document.AssetTransferDocument; 036 import org.kuali.kfs.module.cam.document.service.AssetLocationService; 037 import org.kuali.kfs.module.cam.document.service.AssetObjectCodeService; 038 import org.kuali.kfs.module.cam.document.service.AssetPaymentService; 039 import org.kuali.kfs.module.cam.document.service.AssetService; 040 import org.kuali.kfs.module.cam.document.service.AssetTransferService; 041 import org.kuali.kfs.module.cam.util.ObjectValueUtils; 042 import org.kuali.kfs.sys.context.SpringContext; 043 import org.kuali.kfs.sys.service.UniversityDateService; 044 import org.kuali.rice.kns.bo.PersistableBusinessObject; 045 import org.kuali.rice.kns.service.BusinessObjectService; 046 import org.kuali.rice.kns.service.DateTimeService; 047 import org.kuali.rice.kns.util.DateUtils; 048 import org.kuali.rice.kns.util.ObjectUtils; 049 050 public class AssetTransferServiceImpl implements AssetTransferService { 051 protected static enum AmountCategory { 052 CAPITALIZATION { 053 public void setParams(AssetGlpeSourceDetail postable, AssetPayment assetPayment, AssetObjectCode assetObjectCode, boolean isSource, OffsetDefinition offsetDefinition) { 054 postable.setFinancialDocumentLineDescription("" + (isSource ? "Reverse" : "Transfer") + " asset cost"); 055 postable.setAmount(assetPayment.getAccountChargeAmount()); 056 postable.setFinancialObjectCode(assetObjectCode.getCapitalizationFinancialObjectCode()); 057 postable.setObjectCode(assetObjectCode.getCapitalizationFinancialObject()); 058 postable.setCapitalization(true); 059 }; 060 061 }, 062 ACCUM_DEPRECIATION { 063 public void setParams(AssetGlpeSourceDetail postable, AssetPayment assetPayment, AssetObjectCode assetObjectCode, boolean isSource, OffsetDefinition offsetDefinition) { 064 postable.setFinancialDocumentLineDescription("" + (isSource ? "Reverse" : "Transfer") + " accumulated depreciation"); 065 postable.setAmount(assetPayment.getAccumulatedPrimaryDepreciationAmount()); 066 postable.setFinancialObjectCode(assetObjectCode.getAccumulatedDepreciationFinancialObjectCode()); 067 postable.setObjectCode(assetObjectCode.getAccumulatedDepreciationFinancialObject()); 068 postable.setAccumulatedDepreciation(true); 069 }; 070 071 }, 072 OFFSET_AMOUNT { 073 public void setParams(AssetGlpeSourceDetail postable, AssetPayment assetPayment, AssetObjectCode assetObjectCode, boolean isSource, OffsetDefinition offsetDefinition) { 074 postable.setFinancialDocumentLineDescription("" + (isSource ? "Reverse" : "Transfer") + " offset amount"); 075 postable.setAmount(assetPayment.getAccountChargeAmount().subtract(assetPayment.getAccumulatedPrimaryDepreciationAmount())); 076 postable.setFinancialObjectCode(offsetDefinition.getFinancialObjectCode()); 077 postable.setObjectCode(offsetDefinition.getFinancialObject()); 078 postable.setCapitalizationOffset(true); 079 }; 080 081 }; 082 abstract void setParams(AssetGlpeSourceDetail postable, AssetPayment assetPayment, AssetObjectCode assetObjectCode, boolean isSource, OffsetDefinition offsetDefinition); 083 } 084 085 private static final Logger LOG = Logger.getLogger(AssetTransferServiceImpl.class); 086 private AssetService assetService; 087 private UniversityDateService universityDateService; 088 private BusinessObjectService businessObjectService; 089 private AssetPaymentService assetPaymentService; 090 private AssetObjectCodeService assetObjectCodeService; 091 private DateTimeService dateTimeService; 092 private AssetLocationService assetLocationService; 093 094 095 /** 096 * Creates an instance of AssetGlpeSourceDetail depending on the source flag 097 * 098 * @param universityDateService University Date Service 099 * @param plantAccount Plant account for the organization 100 * @param assetPayment Payment record for which postable is created 101 * @param isSource Indicates if postable is for source organization 102 * @return GL Postable source detail 103 */ 104 protected AssetGlpeSourceDetail createAssetGlpePostable(AssetTransferDocument document, Account plantAccount, AssetPayment assetPayment, boolean isSource, AmountCategory amountCategory) { 105 LOG.debug("Start - createAssetGlpePostable (" + document.getDocumentNumber() + "-" + plantAccount.getAccountNumber() + ")"); 106 AssetGlpeSourceDetail postable = new AssetGlpeSourceDetail(); 107 postable.setSource(isSource); 108 postable.setAccount(plantAccount); 109 postable.setAccountNumber(plantAccount.getAccountNumber()); 110 postable.setBalanceTypeCode(CamsConstants.Postable.GL_BALANCE_TYPE_CODE_AC); 111 String organizationOwnerChartOfAccountsCode = null; 112 if (isSource) { 113 organizationOwnerChartOfAccountsCode = document.getAsset().getOrganizationOwnerChartOfAccountsCode(); 114 postable.setSubAccountNumber(assetPayment.getSubAccountNumber()); 115 } 116 else { 117 organizationOwnerChartOfAccountsCode = document.getOrganizationOwnerChartOfAccountsCode(); 118 postable.setSubAccountNumber(null); 119 } 120 ObjectCodeService objectCodeService = (ObjectCodeService) SpringContext.getBean(ObjectCodeService.class); 121 ObjectCode objectCode = objectCodeService.getByPrimaryIdForCurrentYear(assetPayment.getChartOfAccountsCode(), assetPayment.getFinancialObjectCode()); 122 postable.setChartOfAccountsCode(organizationOwnerChartOfAccountsCode); 123 postable.setDocumentNumber(document.getDocumentNumber()); 124 postable.setFinancialSubObjectCode(assetPayment.getFinancialSubObjectCode()); 125 postable.setPostingYear(getUniversityDateService().getCurrentUniversityDate().getUniversityFiscalYear()); 126 postable.setProjectCode(assetPayment.getProjectCode()); 127 postable.setOrganizationReferenceId(assetPayment.getOrganizationReferenceId()); 128 129 AssetObjectCode assetObjectCode = getAssetObjectCodeService().findAssetObjectCode(organizationOwnerChartOfAccountsCode, objectCode.getFinancialObjectSubTypeCode()); 130 OffsetDefinition offsetDefinition = SpringContext.getBean(OffsetDefinitionService.class).getByPrimaryId(getUniversityDateService().getCurrentFiscalYear(), organizationOwnerChartOfAccountsCode, CamsConstants.AssetTransfer.DOCUMENT_TYPE_CODE, CamsConstants.Postable.GL_BALANCE_TYPE_CODE_AC); 131 amountCategory.setParams(postable, assetPayment, assetObjectCode, isSource, offsetDefinition); 132 LOG.debug("End - createAssetGlpePostable(" + document.getDocumentNumber() + "-" + plantAccount.getAccountNumber() + "-" + ")"); 133 return postable; 134 } 135 136 /** 137 * @see org.kuali.kfs.module.cam.document.service.AssetTransferService#createGLPostables(org.kuali.kfs.module.cam.document.AssetTransferDocument) 138 */ 139 public void createGLPostables(AssetTransferDocument document) { 140 document.clearGlPostables(); 141 // Create GL entries only for capital assets 142 ObjectCodeService objectCodeService = (ObjectCodeService) SpringContext.getBean(ObjectCodeService.class); 143 144 Asset asset = document.getAsset(); 145 if (getAssetService().isCapitalAsset(asset) && !asset.getAssetPayments().isEmpty()) { 146 asset.refreshReferenceObject(CamsPropertyConstants.Asset.ORGANIZATION_OWNER_ACCOUNT); 147 document.refreshReferenceObject(CamsPropertyConstants.AssetTransferDocument.ORGANIZATION_OWNER_ACCOUNT); 148 149 String finObjectSubTypeCode = asset.getFinancialObjectSubTypeCode(); 150 if (finObjectSubTypeCode == null) { 151 AssetPayment firstAssetPayment = asset.getAssetPayments().get(0); 152 ObjectCode objectCode = objectCodeService.getByPrimaryIdForCurrentYear(firstAssetPayment.getChartOfAccountsCode(), firstAssetPayment.getFinancialObjectCode()); 153 finObjectSubTypeCode = objectCode.getFinancialObjectSubTypeCode(); 154 } 155 boolean movableAsset = getAssetService().isAssetMovableCheckByPayment(finObjectSubTypeCode); 156 if (isGLPostable(document, asset, movableAsset)) { 157 asset.refreshReferenceObject(CamsPropertyConstants.Asset.ASSET_PAYMENTS); 158 List<AssetPayment> assetPayments = asset.getAssetPayments(); 159 createSourceGLPostables(document, assetPayments, movableAsset); 160 createTargetGLPostables(document, assetPayments, movableAsset); 161 } 162 } 163 } 164 165 166 /** 167 * Creates new payment records for new organization account 168 * 169 * @param document Current document 170 * @param persistableObjects Saved objects list 171 * @param originalPayments Original payments for the asset 172 * @param maxSequence Payment sequence number 173 * @return Incremented sequence number 174 */ 175 protected Integer createNewPayments(AssetTransferDocument document, List<PersistableBusinessObject> persistableObjects, List<AssetPayment> originalPayments, Integer maxSequence) { 176 Integer maxSequenceNo = maxSequence; 177 for (AssetPayment assetPayment : originalPayments) { 178 if (!CamsConstants.AssetPayment.TRANSFER_PAYMENT_CODE_Y.equals(assetPayment.getTransferPaymentCode())) { 179 // copy and create new payment 180 AssetPayment newPayment; 181 try { 182 if (maxSequenceNo == null) { 183 maxSequenceNo = SpringContext.getBean(AssetPaymentService.class).getMaxSequenceNumber(assetPayment.getCapitalAssetNumber()); 184 } 185 // create new payment info 186 // newPayment = (AssetPayment) ObjectUtils.deepCopy(assetPayment); 187 newPayment = new AssetPayment(); 188 ObjectValueUtils.copySimpleProperties(assetPayment, newPayment); 189 newPayment.setPaymentSequenceNumber(++maxSequenceNo); 190 newPayment.setAccountNumber(document.getOrganizationOwnerAccountNumber()); 191 newPayment.setChartOfAccountsCode(document.getOrganizationOwnerChartOfAccountsCode()); 192 newPayment.setSubAccountNumber(null); 193 newPayment.setDocumentNumber(document.getDocumentNumber()); 194 newPayment.setFinancialDocumentTypeCode(CamsConstants.AssetTransfer.DOCUMENT_TYPE_CODE); 195 newPayment.setFinancialDocumentPostingDate(DateUtils.convertToSqlDate(dateTimeService.getCurrentDate())); 196 newPayment.setFinancialDocumentPostingYear(getUniversityDateService().getCurrentUniversityDate().getUniversityFiscalYear()); 197 newPayment.setFinancialDocumentPostingPeriodCode(getUniversityDateService().getCurrentUniversityDate().getUniversityFiscalAccountingPeriod()); 198 getAssetPaymentService().adjustPaymentAmounts(newPayment, false, true); 199 newPayment.setTransferPaymentCode(CamsConstants.AssetPayment.TRANSFER_PAYMENT_CODE_N); 200 // add new payment 201 persistableObjects.add(newPayment); 202 } 203 catch (Exception e) { 204 throw new RuntimeException(e); 205 } 206 } 207 } 208 return maxSequenceNo; 209 } 210 211 212 /** 213 * Creates offset payment copying the details from original payments and reversing the amounts 214 * 215 * @param document Current Document 216 * @param persistableObjects List of update objects 217 * @param originalPayments Original list of payments 218 * @return Incremented sequence number 219 */ 220 protected Integer createOffsetPayments(AssetTransferDocument document, List<PersistableBusinessObject> persistableObjects, List<AssetPayment> originalPayments) { 221 Integer maxSequenceNo = null; 222 for (AssetPayment assetPayment : originalPayments) { 223 if (!CamsConstants.AssetPayment.TRANSFER_PAYMENT_CODE_Y.equals(assetPayment.getTransferPaymentCode())) { 224 // copy and create an offset payment 225 try { 226 if (maxSequenceNo == null) { 227 maxSequenceNo = SpringContext.getBean(AssetPaymentService.class).getMaxSequenceNumber(assetPayment.getCapitalAssetNumber()); 228 } 229 // AssetPayment offsetPayment = (AssetPayment) ObjectUtils.deepCopy(assetPayment); 230 AssetPayment offsetPayment = new AssetPayment(); 231 ObjectValueUtils.copySimpleProperties(assetPayment, offsetPayment); 232 offsetPayment.setDocumentNumber(document.getDocumentNumber()); 233 offsetPayment.setFinancialDocumentTypeCode(CamsConstants.AssetTransfer.DOCUMENT_TYPE_CODE); 234 offsetPayment.setFinancialDocumentPostingDate(DateUtils.convertToSqlDate(dateTimeService.getCurrentDate())); 235 offsetPayment.setFinancialDocumentPostingYear(getUniversityDateService().getCurrentUniversityDate().getUniversityFiscalYear()); 236 offsetPayment.setFinancialDocumentPostingPeriodCode(getUniversityDateService().getCurrentUniversityDate().getUniversityFiscalAccountingPeriod()); 237 getAssetPaymentService().adjustPaymentAmounts(offsetPayment, true, true); 238 offsetPayment.setTransferPaymentCode(CamsConstants.AssetPayment.TRANSFER_PAYMENT_CODE_Y); 239 offsetPayment.setPaymentSequenceNumber(++maxSequenceNo); 240 persistableObjects.add(offsetPayment); 241 } 242 catch (Exception e) { 243 throw new RuntimeException(e); 244 } 245 } 246 } 247 return maxSequenceNo; 248 } 249 250 251 /** 252 * Creates GL Postables for the source organization 253 * 254 * @param universityDateService University Date Service to get the current fiscal year and period 255 * @param assetPayments Payments for which GL entries needs to be created 256 */ 257 protected void createSourceGLPostables(AssetTransferDocument document, List<AssetPayment> assetPayments, boolean movableAsset) { 258 Account srcPlantAcct = null; 259 OffsetDefinition offsetDefinition = SpringContext.getBean(OffsetDefinitionService.class).getByPrimaryId(getUniversityDateService().getCurrentFiscalYear(), document.getAsset().getOrganizationOwnerChartOfAccountsCode(), CamsConstants.AssetTransfer.DOCUMENT_TYPE_CODE, CamsConstants.Postable.GL_BALANCE_TYPE_CODE_AC); 260 261 if (movableAsset) { 262 srcPlantAcct = document.getAsset().getOrganizationOwnerAccount().getOrganization().getOrganizationPlantAccount(); 263 } 264 else { 265 srcPlantAcct = document.getAsset().getOrganizationOwnerAccount().getOrganization().getCampusPlantAccount(); 266 } 267 ObjectCodeService objectCodeService = (ObjectCodeService) SpringContext.getBean(ObjectCodeService.class); 268 269 for (AssetPayment assetPayment : assetPayments) { 270 if (getAssetPaymentService().isPaymentEligibleForGLPosting(assetPayment)) { 271 ObjectCode objectCode = objectCodeService.getByPrimaryIdForCurrentYear(assetPayment.getChartOfAccountsCode(), assetPayment.getFinancialObjectCode()); 272 if (ObjectUtils.isNotNull(objectCode)) { 273 if (getAssetPaymentService().isPaymentEligibleForCapitalizationGLPosting(assetPayment)) { 274 document.getSourceAssetGlpeSourceDetails().add(createAssetGlpePostable(document, srcPlantAcct, assetPayment, true, AmountCategory.CAPITALIZATION)); 275 } 276 if (getAssetPaymentService().isPaymentEligibleForAccumDeprGLPosting(assetPayment)) { 277 document.getSourceAssetGlpeSourceDetails().add(createAssetGlpePostable(document, srcPlantAcct, assetPayment, true, AmountCategory.ACCUM_DEPRECIATION)); 278 } 279 if (getAssetPaymentService().isPaymentEligibleForOffsetGLPosting(assetPayment)) { 280 document.getSourceAssetGlpeSourceDetails().add(createAssetGlpePostable(document, srcPlantAcct, assetPayment, true, AmountCategory.OFFSET_AMOUNT)); 281 } 282 } 283 } 284 } 285 } 286 287 288 /** 289 * Creates target GL Postable for the receiving organization 290 * 291 * @param universityDateService University Date Service to get the current fiscal year and period 292 * @param assetPayments Payments for which GL entries needs to be created 293 */ 294 protected void createTargetGLPostables(AssetTransferDocument document, List<AssetPayment> assetPayments, boolean movableAsset) { 295 Account targetPlantAcct = null; 296 297 if (movableAsset) { 298 targetPlantAcct = document.getOrganizationOwnerAccount().getOrganization().getOrganizationPlantAccount(); 299 } 300 else { 301 targetPlantAcct = document.getOrganizationOwnerAccount().getOrganization().getCampusPlantAccount(); 302 } 303 for (AssetPayment assetPayment : assetPayments) { 304 if (getAssetPaymentService().isPaymentEligibleForGLPosting(assetPayment)) { 305 if (getAssetPaymentService().isPaymentEligibleForCapitalizationGLPosting(assetPayment)) { 306 document.getTargetAssetGlpeSourceDetails().add(createAssetGlpePostable(document, targetPlantAcct, assetPayment, false, AmountCategory.CAPITALIZATION)); 307 } 308 if (getAssetPaymentService().isPaymentEligibleForAccumDeprGLPosting(assetPayment)) { 309 document.getTargetAssetGlpeSourceDetails().add(createAssetGlpePostable(document, targetPlantAcct, assetPayment, false, AmountCategory.ACCUM_DEPRECIATION)); 310 } 311 if (getAssetPaymentService().isPaymentEligibleForOffsetGLPosting(assetPayment)) { 312 document.getTargetAssetGlpeSourceDetails().add(createAssetGlpePostable(document, targetPlantAcct, assetPayment, false, AmountCategory.OFFSET_AMOUNT)); 313 } 314 } 315 } 316 } 317 318 319 public AssetPaymentService getAssetPaymentService() { 320 return assetPaymentService; 321 } 322 323 324 public AssetService getAssetService() { 325 return assetService; 326 } 327 328 329 public BusinessObjectService getBusinessObjectService() { 330 return businessObjectService; 331 } 332 333 334 public UniversityDateService getUniversityDateService() { 335 return universityDateService; 336 } 337 338 /** 339 * Checks if it is ready for GL Posting by validating the accounts and plant account numbers 340 * 341 * @return true if all accounts are valid 342 */ 343 protected boolean isGLPostable(AssetTransferDocument document, Asset asset, boolean movableAsset) { 344 boolean isGLPostable = true; 345 346 Account srcPlantAcct = null; 347 348 if (ObjectUtils.isNotNull(asset.getOrganizationOwnerAccount())) { 349 if (movableAsset) { 350 srcPlantAcct = asset.getOrganizationOwnerAccount().getOrganization().getOrganizationPlantAccount(); 351 } 352 else { 353 srcPlantAcct = asset.getOrganizationOwnerAccount().getOrganization().getCampusPlantAccount(); 354 } 355 } 356 357 if (ObjectUtils.isNull(srcPlantAcct)) { 358 isGLPostable &= false; 359 } 360 Account targetPlantAcct = null; 361 if (ObjectUtils.isNotNull(document.getOrganizationOwnerAccount())) { 362 if (movableAsset) { 363 targetPlantAcct = document.getOrganizationOwnerAccount().getOrganization().getOrganizationPlantAccount(); 364 } 365 else { 366 targetPlantAcct = document.getOrganizationOwnerAccount().getOrganization().getCampusPlantAccount(); 367 } 368 } 369 if (ObjectUtils.isNull(targetPlantAcct)) { 370 isGLPostable &= false; 371 372 } 373 return isGLPostable; 374 } 375 376 377 /** 378 * @see org.kuali.kfs.module.cam.document.service.AssetTransferService#saveApprovedChanges(org.kuali.kfs.module.cam.document.AssetTransferDocument) 379 */ 380 public void saveApprovedChanges(AssetTransferDocument document) { 381 // save new asset location details to asset table, inventory date 382 List<PersistableBusinessObject> persistableObjects = new ArrayList<PersistableBusinessObject>(); 383 Asset saveAsset = new Asset(); 384 saveAsset.setCapitalAssetNumber(document.getCapitalAssetNumber()); 385 saveAsset = (Asset) getBusinessObjectService().retrieve(saveAsset); 386 saveAssetOwnerData(document, saveAsset); 387 saveLocationChanges(document, saveAsset); 388 saveOrganizationChanges(document, saveAsset); 389 390 if (getAssetService().isCapitalAsset(saveAsset)) { 391 // for capital assets, create new asset payment records and offset payment records 392 if (ObjectUtils.isNull(saveAsset.getAssetPayments())) { 393 saveAsset.refreshReferenceObject(CamsPropertyConstants.Asset.ASSET_PAYMENTS); 394 } 395 List<AssetPayment> originalPayments = saveAsset.getAssetPayments(); 396 Integer maxSequence = createOffsetPayments(document, persistableObjects, originalPayments); 397 maxSequence = createNewPayments(document, persistableObjects, originalPayments, maxSequence); 398 updateOriginalPayments(persistableObjects, originalPayments); 399 } 400 saveAsset.setTransferOfFundsFinancialDocumentNumber(document.getTransferOfFundsFinancialDocumentNumber()); 401 // save asset 402 persistableObjects.add(saveAsset); 403 getBusinessObjectService().save(persistableObjects); 404 } 405 406 407 /** 408 * Updates organization data for the asset 409 * 410 * @param document Current document 411 * @param saveAsset Asset 412 */ 413 protected void saveAssetOwnerData(AssetTransferDocument document, Asset saveAsset) { 414 saveAsset.setOrganizationOwnerAccountNumber(document.getOrganizationOwnerAccountNumber()); 415 saveAsset.setOrganizationOwnerChartOfAccountsCode(document.getOrganizationOwnerChartOfAccountsCode()); 416 } 417 418 /** 419 * Updates location details to the asset 420 * 421 * @param document Current document 422 * @param saveAsset Asset 423 */ 424 protected void saveLocationChanges(AssetTransferDocument document, Asset saveAsset) { 425 // change inventory date 426 saveAsset.setLastInventoryDate(SpringContext.getBean(DateTimeService.class).getCurrentTimestamp()); 427 // save asset location details 428 saveAsset.setCampusCode(document.getCampusCode()); 429 saveAsset.setBuildingCode(document.getBuildingCode()); 430 saveAsset.setBuildingRoomNumber(document.getBuildingRoomNumber()); 431 saveAsset.setBuildingSubRoomNumber(document.getBuildingSubRoomNumber()); 432 433 // save off campus location details 434 AssetLocation offCampusLocation = null; 435 List<AssetLocation> orginalLocations = saveAsset.getAssetLocations(); 436 for (AssetLocation assetLocation : orginalLocations) { 437 if (CamsConstants.AssetLocationTypeCode.OFF_CAMPUS.equals(assetLocation.getAssetLocationTypeCode())) { 438 offCampusLocation = assetLocation; 439 break; 440 } 441 } 442 if (ObjectUtils.isNull(offCampusLocation)) { 443 offCampusLocation = new AssetLocation(); 444 offCampusLocation.setCapitalAssetNumber(saveAsset.getCapitalAssetNumber()); 445 offCampusLocation.setAssetLocationTypeCode(CamsConstants.AssetLocationTypeCode.OFF_CAMPUS); 446 saveAsset.getAssetLocations().add(offCampusLocation); 447 } 448 // save details 449 offCampusLocation.setAssetLocationContactName(document.getOffCampusName()); 450 offCampusLocation.setAssetLocationState(document.getOffCampusState()); 451 offCampusLocation.setPostalZipCode(document.getPostalZipCode()); 452 offCampusLocation.setAssetLocationCountryCode(document.getOffCampusCountryCode()); 453 offCampusLocation.setAssetLocationStreetAddress(document.getOffCampusAddress()); 454 offCampusLocation.setAssetLocationCityName(document.getOffCampusCityName()); 455 offCampusLocation.setAssetLocationStateCode(document.getOffCampusStateCode()); 456 offCampusLocation.setAssetLocationZipCode(document.getOffCampusZipCode()); 457 458 // remove off Campus Location if it's an empty record. When asset transfer from off to on campus, the off campus location will be removed. 459 if (getAssetLocationService().isOffCampusLocationEmpty(offCampusLocation)) { 460 saveAsset.getAssetLocations().remove(offCampusLocation); 461 } 462 } 463 464 465 /** 466 * Updates organization changes 467 * 468 * @param document Current document 469 * @param saveAsset Asset 470 */ 471 protected void saveOrganizationChanges(AssetTransferDocument document, Asset saveAsset) { 472 if (ObjectUtils.isNull(saveAsset.getAssetOrganization())) { 473 AssetOrganization assetOrganization = new AssetOrganization(); 474 assetOrganization.setCapitalAssetNumber(saveAsset.getCapitalAssetNumber()); 475 saveAsset.setAssetOrganization(assetOrganization); 476 } 477 478 saveAsset.setOrganizationInventoryName(document.getOrganizationInventoryName()); 479 saveAsset.setRepresentativeUniversalIdentifier(document.getRepresentativeUniversalIdentifier()); 480 saveAsset.getAssetOrganization().setOrganizationTagNumber(document.getOrganizationTagNumber()); 481 saveAsset.getAssetOrganization().setOrganizationText(document.getOrganizationText()); 482 } 483 484 public void setAssetPaymentService(AssetPaymentService assetPaymentService) { 485 this.assetPaymentService = assetPaymentService; 486 } 487 488 489 public void setAssetService(AssetService assetService) { 490 this.assetService = assetService; 491 } 492 493 494 public void setBusinessObjectService(BusinessObjectService businessObjectService) { 495 this.businessObjectService = businessObjectService; 496 } 497 498 public void setUniversityDateService(UniversityDateService universityDateService) { 499 this.universityDateService = universityDateService; 500 } 501 502 /** 503 * Updates original payment records 504 * 505 * @param persistableObjects List of saveable objects 506 * @param originalPayments Original payments list 507 */ 508 protected void updateOriginalPayments(List<PersistableBusinessObject> persistableObjects, List<AssetPayment> originalPayments) { 509 for (AssetPayment assetPayment : originalPayments) { 510 if (!CamsConstants.AssetPayment.TRANSFER_PAYMENT_CODE_Y.equals(assetPayment.getTransferPaymentCode())) { 511 // change payment code 512 assetPayment.setTransferPaymentCode(CamsConstants.AssetPayment.TRANSFER_PAYMENT_CODE_Y); 513 persistableObjects.add(assetPayment); 514 } 515 } 516 } 517 518 public AssetObjectCodeService getAssetObjectCodeService() { 519 return assetObjectCodeService; 520 } 521 522 public void setAssetObjectCodeService(AssetObjectCodeService assetObjectCodeService) { 523 this.assetObjectCodeService = assetObjectCodeService; 524 } 525 526 /** 527 * Gets the dateTimeService attribute. 528 * 529 * @return Returns the dateTimeService. 530 */ 531 public DateTimeService getDateTimeService() { 532 return dateTimeService; 533 } 534 535 /** 536 * Sets the dateTimeService attribute value. 537 * 538 * @param dateTimeService The dateTimeService to set. 539 */ 540 public void setDateTimeService(DateTimeService dateTimeService) { 541 this.dateTimeService = dateTimeService; 542 } 543 544 /** 545 * Gets the assetLocationService attribute. 546 * 547 * @return Returns the assetLocationService 548 */ 549 public AssetLocationService getAssetLocationService() { 550 return assetLocationService; 551 } 552 553 /** 554 * Sets the assetLocationService attribute. 555 * 556 * @param assetLocationService The assetLocationService to set 557 */ 558 public void setAssetLocationService(AssetLocationService assetLocationService) { 559 this.assetLocationService = assetLocationService; 560 } 561 }