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.sql.Date; 019 import java.sql.Timestamp; 020 import java.util.ArrayList; 021 import java.util.Arrays; 022 import java.util.Iterator; 023 import java.util.List; 024 025 import org.apache.commons.lang.StringUtils; 026 import org.apache.log4j.Logger; 027 import org.kuali.kfs.coa.businessobject.ObjectCode; 028 import org.kuali.kfs.coa.businessobject.OffsetDefinition; 029 import org.kuali.kfs.coa.service.ObjectCodeService; 030 import org.kuali.kfs.coa.service.OffsetDefinitionService; 031 import org.kuali.kfs.module.cam.CamsConstants; 032 import org.kuali.kfs.module.cam.CamsPropertyConstants; 033 import org.kuali.kfs.module.cam.businessobject.Asset; 034 import org.kuali.kfs.module.cam.businessobject.AssetAcquisitionType; 035 import org.kuali.kfs.module.cam.businessobject.AssetGlobal; 036 import org.kuali.kfs.module.cam.businessobject.AssetGlobalDetail; 037 import org.kuali.kfs.module.cam.businessobject.AssetGlpeSourceDetail; 038 import org.kuali.kfs.module.cam.businessobject.AssetLocation; 039 import org.kuali.kfs.module.cam.businessobject.AssetObjectCode; 040 import org.kuali.kfs.module.cam.businessobject.AssetPayment; 041 import org.kuali.kfs.module.cam.businessobject.AssetPaymentDetail; 042 import org.kuali.kfs.module.cam.document.gl.CamsGeneralLedgerPendingEntrySourceBase; 043 import org.kuali.kfs.module.cam.document.service.AssetGlobalService; 044 import org.kuali.kfs.module.cam.document.service.AssetObjectCodeService; 045 import org.kuali.kfs.module.cam.document.service.AssetPaymentService; 046 import org.kuali.kfs.module.cam.document.service.AssetService; 047 import org.kuali.kfs.module.cam.document.service.PaymentSummaryService; 048 import org.kuali.kfs.module.cam.util.AssetSeparatePaymentDistributor; 049 import org.kuali.kfs.module.cam.util.KualiDecimalUtils; 050 import org.kuali.kfs.sys.context.SpringContext; 051 import org.kuali.kfs.sys.service.UniversityDateService; 052 import org.kuali.kfs.sys.service.impl.KfsParameterConstants.CAPITAL_ASSETS_BATCH; 053 import org.kuali.rice.kns.bo.PersistableBusinessObject; 054 import org.kuali.rice.kns.service.BusinessObjectService; 055 import org.kuali.rice.kns.service.ParameterService; 056 import org.kuali.rice.kns.util.KualiDecimal; 057 import org.kuali.rice.kns.util.ObjectUtils; 058 059 public class AssetGlobalServiceImpl implements AssetGlobalService { 060 061 protected enum AmountCategory { 062 063 PAYMENT { 064 void setParams(AssetGlpeSourceDetail postable, AssetPaymentDetail assetPaymentDetail, AssetObjectCode assetObjectCode, OffsetDefinition offsetDefinition, AssetAcquisitionType acquisitionType) { 065 postable.setPayment(true); 066 postable.setFinancialDocumentLineDescription(CamsConstants.AssetGlobal.LINE_DESCRIPTION_PAYMENT); 067 postable.setFinancialObjectCode(assetPaymentDetail.getFinancialObjectCode()); 068 postable.setObjectCode(assetPaymentDetail.getObjectCode()); 069 }; 070 071 }, 072 PAYMENT_OFFSET { 073 void setParams(AssetGlpeSourceDetail postable, AssetPaymentDetail assetPaymentDetail, AssetObjectCode assetObjectCode, OffsetDefinition offsetDefinition, AssetAcquisitionType acquisitionType) { 074 postable.setPaymentOffset(true); 075 postable.setFinancialDocumentLineDescription(CamsConstants.AssetGlobal.LINE_DESCRIPTION_PAYMENT_OFFSET); 076 postable.setFinancialObjectCode(acquisitionType.getIncomeAssetObjectCode()); 077 postable.setObjectCode(SpringContext.getBean(ObjectCodeService.class).getByPrimaryId(assetPaymentDetail.getPostingYear(), assetPaymentDetail.getChartOfAccountsCode(), acquisitionType.getIncomeAssetObjectCode())); 078 }; 079 080 }; 081 082 abstract void setParams(AssetGlpeSourceDetail postable, AssetPaymentDetail assetPaymentDetail, AssetObjectCode assetObjectCode, OffsetDefinition offsetDefinition, AssetAcquisitionType acquisitionType); 083 } 084 085 private ParameterService parameterService; 086 private AssetService assetService; 087 private UniversityDateService universityDateService; 088 private AssetObjectCodeService assetObjectCodeService; 089 private BusinessObjectService businessObjectService; 090 private AssetPaymentService assetPaymentService; 091 private PaymentSummaryService paymentSummaryService; 092 093 private static final Logger LOG = Logger.getLogger(AssetGlobalServiceImpl.class); 094 095 /** 096 * Creates an instance of AssetGlpeSourceDetail depending on the source flag 097 * 098 * @param universityDateService University Date Service 099 * @param assetPayment Payment record for which postable is created 100 * @param isSource Indicates if postable is for source organization 101 * @return GL Postable source detail 102 */ 103 protected AssetGlpeSourceDetail createAssetGlpePostable(AssetGlobal document, AssetPaymentDetail assetPaymentDetail, AmountCategory amountCategory) { 104 LOG.debug("Start - createAssetGlpePostable (" + document.getDocumentNumber() + "-" + assetPaymentDetail.getAccountNumber() + ")"); 105 AssetGlpeSourceDetail postable = new AssetGlpeSourceDetail(); 106 107 assetPaymentDetail.refreshReferenceObject(CamsPropertyConstants.AssetPaymentDetail.ACCOUNT); 108 postable.setAccount(assetPaymentDetail.getAccount()); 109 110 postable.setAmount(assetPaymentDetail.getAmount()); 111 postable.setAccountNumber(assetPaymentDetail.getAccountNumber()); 112 postable.setBalanceTypeCode(CamsConstants.Postable.GL_BALANCE_TYPE_CODE_AC); 113 postable.setChartOfAccountsCode(assetPaymentDetail.getChartOfAccountsCode()); 114 postable.setDocumentNumber(document.getDocumentNumber()); 115 postable.setFinancialSubObjectCode(assetPaymentDetail.getFinancialSubObjectCode()); 116 postable.setPostingYear(getUniversityDateService().getCurrentUniversityDate().getUniversityFiscalYear()); 117 postable.setProjectCode(assetPaymentDetail.getProjectCode()); 118 postable.setSubAccountNumber(assetPaymentDetail.getSubAccountNumber()); 119 postable.setOrganizationReferenceId(assetPaymentDetail.getOrganizationReferenceId()); 120 121 assetPaymentDetail.refreshReferenceObject(CamsPropertyConstants.AssetPaymentDetail.OBJECT_CODE); 122 ObjectCodeService objectCodeService = (ObjectCodeService) SpringContext.getBean(ObjectCodeService.class); 123 ObjectCode objectCode = objectCodeService.getByPrimaryIdForCurrentYear(assetPaymentDetail.getChartOfAccountsCode(), assetPaymentDetail.getFinancialObjectCode()); 124 125 AssetObjectCode assetObjectCode = getAssetObjectCodeService().findAssetObjectCode(assetPaymentDetail.getChartOfAccountsCode(), objectCode.getFinancialObjectSubTypeCode()); 126 127 OffsetDefinition offsetDefinition = SpringContext.getBean(OffsetDefinitionService.class).getByPrimaryId(getUniversityDateService().getCurrentFiscalYear(), assetPaymentDetail.getChartOfAccountsCode(), CamsConstants.AssetTransfer.DOCUMENT_TYPE_CODE, CamsConstants.Postable.GL_BALANCE_TYPE_CODE_AC); 128 document.refreshReferenceObject(CamsPropertyConstants.AssetGlobal.ACQUISITION_TYPE); 129 amountCategory.setParams(postable, assetPaymentDetail, assetObjectCode, offsetDefinition, document.getAcquisitionType()); 130 131 LOG.debug("End - createAssetGlpePostable(" + document.getDocumentNumber() + "-" + assetPaymentDetail.getAccountNumber() + "-" + ")"); 132 return postable; 133 } 134 135 /** 136 * @see org.kuali.kfs.module.cam.document.service.AssetGlobalService#createGLPostables(org.kuali.module.cams.document.AssetGlobal) 137 */ 138 public void createGLPostables(AssetGlobal assetGlobal, CamsGeneralLedgerPendingEntrySourceBase assetGlobalGlPoster) { 139 List<AssetPaymentDetail> assetPaymentDetails = assetGlobal.getAssetPaymentDetails(); 140 141 for (AssetPaymentDetail assetPaymentDetail : assetPaymentDetails) { 142 if (isPaymentFinancialObjectActive(assetPaymentDetail)) { 143 KualiDecimal accountChargeAmount = assetPaymentDetail.getAmount(); 144 if (accountChargeAmount != null && !accountChargeAmount.isZero()) { 145 assetGlobalGlPoster.getGeneralLedgerPendingEntrySourceDetails().add(createAssetGlpePostable(assetGlobal, assetPaymentDetail, AmountCategory.PAYMENT)); 146 assetGlobalGlPoster.getGeneralLedgerPendingEntrySourceDetails().add(createAssetGlpePostable(assetGlobal, assetPaymentDetail, AmountCategory.PAYMENT_OFFSET)); 147 } 148 } 149 } 150 } 151 152 153 public ParameterService getParameterService() { 154 return parameterService; 155 } 156 157 158 public void setParameterService(ParameterService parameterService) { 159 this.parameterService = parameterService; 160 } 161 162 163 /** 164 * Gets the assetObjectCodeService attribute. 165 * 166 * @return Returns the assetObjectCodeService. 167 */ 168 public AssetObjectCodeService getAssetObjectCodeService() { 169 return assetObjectCodeService; 170 } 171 172 173 /** 174 * Sets the assetObjectCodeService attribute value. 175 * 176 * @param assetObjectCodeService The assetObjectCodeService to set. 177 */ 178 public void setAssetObjectCodeService(AssetObjectCodeService assetObjectCodeService) { 179 this.assetObjectCodeService = assetObjectCodeService; 180 } 181 182 183 /** 184 * Gets the assetPaymentService attribute. 185 * 186 * @return Returns the assetPaymentService. 187 */ 188 public AssetPaymentService getAssetPaymentService() { 189 return assetPaymentService; 190 } 191 192 193 /** 194 * Sets the assetPaymentService attribute value. 195 * 196 * @param assetPaymentService The assetPaymentService to set. 197 */ 198 public void setAssetPaymentService(AssetPaymentService assetPaymentService) { 199 this.assetPaymentService = assetPaymentService; 200 } 201 202 /** 203 * Gets the businessObjectService attribute. 204 * 205 * @return Returns the businessObjectService. 206 */ 207 public BusinessObjectService getBusinessObjectService() { 208 return businessObjectService; 209 } 210 211 212 /** 213 * Sets the businessObjectService attribute value. 214 * 215 * @param businessObjectService The businessObjectService to set. 216 */ 217 public void setBusinessObjectService(BusinessObjectService businessObjectService) { 218 this.businessObjectService = businessObjectService; 219 } 220 221 222 /** 223 * Gets the universityDateService attribute. 224 * 225 * @return Returns the universityDateService. 226 */ 227 public UniversityDateService getUniversityDateService() { 228 return universityDateService; 229 } 230 231 232 /** 233 * Sets the universityDateService attribute value. 234 * 235 * @param universityDateService The universityDateService to set. 236 */ 237 public void setUniversityDateService(UniversityDateService universityDateService) { 238 this.universityDateService = universityDateService; 239 } 240 241 /** 242 * We need to calculate asset total amount from the sum of its payments. Otherwise, the asset total amount could mismatch with 243 * the sum of payments. 244 * 245 * @see org.kuali.kfs.module.cam.document.service.AssetGlobalService#totalPaymentByAsset(org.kuali.kfs.module.cam.businessobject.AssetGlobal) 246 */ 247 public KualiDecimal totalPaymentByAsset(AssetGlobal assetGlobal, boolean lastEntry) { 248 KualiDecimal assetTotalAmount = KualiDecimal.ZERO; 249 List<AssetPaymentDetail> assetPaymentDetails = assetGlobal.getAssetPaymentDetails(); 250 int numberOfTotalAsset = assetGlobal.getAssetGlobalDetails().size(); 251 if (numberOfTotalAsset > 0) { 252 for (AssetPaymentDetail assetPaymentDetail : assetPaymentDetails) { 253 KualiDecimal assetPaymentUnitCost = assetPaymentDetail.getAmount().divide(new KualiDecimal(numberOfTotalAsset)); 254 if (lastEntry) { 255 assetPaymentUnitCost = assetPaymentDetail.getAmount().subtract(assetPaymentUnitCost.multiply(new KualiDecimal(numberOfTotalAsset - 1))); 256 } 257 assetTotalAmount = assetTotalAmount.add(assetPaymentUnitCost); 258 } 259 } 260 261 return assetTotalAmount; 262 } 263 264 /** 265 * @see org.kuali.kfs.module.cam.document.service.AssetGlobalService#existsInGroup(java.lang.String, java.lang.String) 266 */ 267 public boolean existsInGroup(String groupName, String memberName) { 268 if (StringUtils.isBlank(groupName) || StringUtils.isBlank(memberName)) { 269 return false; 270 } 271 return Arrays.asList(groupName.split(";")).contains(memberName); 272 } 273 274 protected boolean isPaymentFinancialObjectActive(AssetPaymentDetail assetPayment) { 275 ObjectCode financialObjectCode = new ObjectCode(); 276 financialObjectCode.setUniversityFiscalYear(getUniversityDateService().getCurrentFiscalYear()); 277 financialObjectCode.setChartOfAccountsCode(assetPayment.getChartOfAccountsCode()); 278 financialObjectCode.setFinancialObjectCode(assetPayment.getFinancialObjectCode()); 279 financialObjectCode = (ObjectCode) getBusinessObjectService().retrieve(financialObjectCode); 280 if (ObjectUtils.isNotNull(financialObjectCode)) { 281 return financialObjectCode.isActive(); 282 } 283 return false; 284 } 285 286 /** 287 * Gets the assetService attribute. 288 * 289 * @return Returns the assetService. 290 */ 291 public AssetService getAssetService() { 292 return assetService; 293 } 294 295 /** 296 * Sets the assetService attribute value. 297 * 298 * @param assetService The assetService to set. 299 */ 300 public void setAssetService(AssetService assetService) { 301 this.assetService = assetService; 302 } 303 304 /** 305 * @see org.kuali.kfs.module.cam.document.service.AssetGlobalService#isAssetSeparate(org.kuali.kfs.module.cam.businessobject.AssetGlobal) 306 */ 307 public boolean isAssetSeparate(AssetGlobal assetGlobal) { 308 if (ObjectUtils.isNotNull(assetGlobal.getFinancialDocumentTypeCode()) && assetGlobal.getFinancialDocumentTypeCode().equals(CamsConstants.PaymentDocumentTypeCodes.ASSET_GLOBAL_SEPARATE)) { 309 return true; 310 } 311 return false; 312 } 313 314 /** 315 * @see org.kuali.kfs.module.cam.document.service.AssetGlobalService#isAssetSeparateByPayment(org.kuali.kfs.module.cam.businessobject.AssetGlobal) 316 */ 317 public boolean isAssetSeparateByPayment(AssetGlobal assetGlobal) { 318 if (this.isAssetSeparate(assetGlobal) && ObjectUtils.isNotNull(assetGlobal.getSeparateSourcePaymentSequenceNumber())) { 319 return true; 320 } 321 return false; 322 } 323 324 /** 325 * Add and return the total amount for all unique assets created. 326 * 327 * @param assetGlobal 328 * @return Returns the total separate source amount 329 */ 330 public KualiDecimal getUniqueAssetsTotalAmount(AssetGlobal assetGlobal) { 331 KualiDecimal totalAmount = KualiDecimal.ZERO; 332 // add new asset location 333 for (AssetGlobalDetail assetSharedDetail : assetGlobal.getAssetSharedDetails()) { 334 // existing 335 for (AssetGlobalDetail assetGlobalUniqueDetail : assetSharedDetail.getAssetGlobalUniqueDetails()) { 336 KualiDecimal separateSourceAmount = assetGlobalUniqueDetail.getSeparateSourceAmount(); 337 if (separateSourceAmount != null) { 338 totalAmount = totalAmount.add(separateSourceAmount); 339 } 340 } 341 } 342 return totalAmount; 343 } 344 345 /** 346 * @see org.kuali.kfs.module.cam.document.service.AssetGlobalService#getCreateNewAssets(org.kuali.kfs.module.cam.businessobject.AssetGlobal) 347 */ 348 public List<PersistableBusinessObject> getCreateNewAssets(AssetGlobal assetGlobal) { 349 List<PersistableBusinessObject> persistables = new ArrayList<PersistableBusinessObject>(); 350 351 // create new assets with inner loop handling payments 352 Iterator<AssetGlobalDetail> assetGlobalDetailsIterator = assetGlobal.getAssetGlobalDetails().iterator(); 353 for (int assetGlobalDetailsIndex = 0; assetGlobalDetailsIterator.hasNext(); assetGlobalDetailsIndex++) { 354 AssetGlobalDetail assetGlobalDetail = (AssetGlobalDetail) assetGlobalDetailsIterator.next(); 355 356 // Create the asset with most fields set as required 357 Asset asset = setupAsset(assetGlobal, assetGlobalDetail, false); 358 359 // track total cost of all payments for this assetGlobalDetail 360 KualiDecimal paymentsAccountChargeAmount = new KualiDecimal(0); 361 362 // take care of all the payments for this asset 363 for (AssetPaymentDetail assetPaymentDetail : assetGlobal.getAssetPaymentDetails()) { 364 AssetPayment assetPayment = setupCreateNewAssetPayment(assetGlobalDetail.getCapitalAssetNumber(), assetGlobal.getAcquisitionTypeCode(), assetGlobal.getAssetGlobalDetails().size(), assetGlobalDetailsIndex, assetPaymentDetail); 365 366 paymentsAccountChargeAmount = paymentsAccountChargeAmount.add(assetPayment.getAccountChargeAmount()); 367 368 asset.getAssetPayments().add(assetPayment); 369 } 370 371 // set the amount generically. Note for separate this should equal assetGlobalDetail.getSeparateSourceAmount() 372 asset.setTotalCostAmount(paymentsAccountChargeAmount); 373 374 persistables.add(asset); 375 } 376 377 return persistables; 378 } 379 380 /** 381 * @see org.kuali.kfs.module.cam.document.service.AssetGlobalService#getSeparateAssets(org.kuali.kfs.module.cam.businessobject.AssetGlobal) 382 */ 383 public List<PersistableBusinessObject> getSeparateAssets(AssetGlobal assetGlobal) { 384 385 // set the source asset amounts properly 386 Asset separateSourceCapitalAsset = assetGlobal.getSeparateSourceCapitalAsset(); 387 List<AssetPayment> sourcePayments = new ArrayList<AssetPayment>(); 388 389 for (AssetPayment assetPayment : separateSourceCapitalAsset.getAssetPayments()) { 390 if (!this.isAssetSeparateByPayment(assetGlobal)) { 391 sourcePayments.add(assetPayment); 392 } 393 else if (assetPayment.getPaymentSequenceNumber().equals(assetGlobal.getSeparateSourcePaymentSequenceNumber())) { 394 // If this is separate by payment, then only add the payment that we are interested in 395 sourcePayments.add(assetPayment); 396 break; 397 } 398 } 399 400 List<Asset> newAssets = new ArrayList<Asset>(); 401 // create new assets with inner loop handling payments 402 for (AssetGlobalDetail assetGlobalDetail : assetGlobal.getAssetGlobalDetails()) { 403 newAssets.add(setupAsset(assetGlobal, assetGlobalDetail, true)); 404 } 405 // adjust source asset amounts 406 KualiDecimalUtils kualiDecimalUtils = new KualiDecimalUtils(); 407 double separateRatio = 1 - (assetGlobal.getSeparateSourceTotalAmount().doubleValue() / assetGlobal.getSeparateSourceCapitalAsset().getTotalCostAmount().doubleValue()); 408 separateSourceCapitalAsset.setSalvageAmount(kualiDecimalUtils.safeMultiply(assetGlobal.getSeparateSourceCapitalAsset().getSalvageAmount(), separateRatio)); 409 separateSourceCapitalAsset.setReplacementAmount(kualiDecimalUtils.safeMultiply(assetGlobal.getSeparateSourceCapitalAsset().getReplacementAmount(), separateRatio)); 410 separateSourceCapitalAsset.setFabricationEstimatedTotalAmount(kualiDecimalUtils.safeMultiply(assetGlobal.getSeparateSourceCapitalAsset().getFabricationEstimatedTotalAmount(), separateRatio)); 411 412 Integer maxSequenceNumber = SpringContext.getBean(AssetPaymentService.class).getMaxSequenceNumber(separateSourceCapitalAsset.getCapitalAssetNumber()); 413 // Add to the save list 414 AssetSeparatePaymentDistributor distributor = new AssetSeparatePaymentDistributor(separateSourceCapitalAsset, sourcePayments, maxSequenceNumber, assetGlobal, newAssets); 415 distributor.distribute(); 416 // re-compute the source total cost amount after split 417 separateSourceCapitalAsset.setTotalCostAmount(getPaymentSummaryService().calculatePaymentTotalCost(separateSourceCapitalAsset)); 418 List<PersistableBusinessObject> persistables = new ArrayList<PersistableBusinessObject>(); 419 persistables.add(separateSourceCapitalAsset); 420 persistables.addAll(newAssets); 421 return persistables; 422 } 423 424 /** 425 * Creates a new Asset appropriate for either create new or separate. This does not create the payments for this asset. 426 * 427 * @param assetGlobal containing data for the asset to be created 428 * @param assetGlobalDetail containing data for the asset to be created 429 * @param separate indicating whether this is a separate and asset or not 430 * @return set of assets appropriate for this creation without payments 431 */ 432 protected Asset setupAsset(AssetGlobal assetGlobal, AssetGlobalDetail assetGlobalDetail, boolean separate) { 433 Asset asset = new Asset(assetGlobal, assetGlobalDetail, separate); 434 KualiDecimalUtils kualiDecimalUtils = new KualiDecimalUtils(); 435 436 // set financialObjectSubTypeCode per first payment entry if one exists 437 if (!assetGlobal.getAssetPaymentDetails().isEmpty() && ObjectUtils.isNotNull(assetGlobal.getAssetPaymentDetails().get(0).getObjectCode())) { 438 ObjectCodeService objectCodeService = (ObjectCodeService) SpringContext.getBean(ObjectCodeService.class); 439 AssetPaymentDetail assetPaymentDetail = assetGlobal.getAssetPaymentDetails().get(0); 440 441 ObjectCode objectCode = objectCodeService.getByPrimaryIdForCurrentYear(assetPaymentDetail.getChartOfAccountsCode(), assetPaymentDetail.getFinancialObjectCode()); 442 443 asset.setFinancialObjectSubTypeCode(objectCode.getFinancialObjectSubTypeCode()); 444 } 445 446 // create off campus location for each asset only if it was filled in 447 boolean offCampus = StringUtils.isNotBlank(assetGlobalDetail.getOffCampusName()) || StringUtils.isNotBlank(assetGlobalDetail.getOffCampusAddress()) || StringUtils.isNotBlank(assetGlobalDetail.getOffCampusCityName()) || StringUtils.isNotBlank(assetGlobalDetail.getOffCampusStateCode()) || StringUtils.isNotBlank(assetGlobalDetail.getOffCampusZipCode()) || StringUtils.isNotBlank(assetGlobalDetail.getOffCampusCountryCode()); 448 if (offCampus) { 449 setupAssetLocationOffCampus(assetGlobalDetail, asset); 450 } 451 452 // set specific values for new assets if document is Asset Separate 453 if (separate) { 454 double separateRatio = assetGlobalDetail.getSeparateSourceAmount().doubleValue() / assetGlobal.getSeparateSourceCapitalAsset().getTotalCostAmount().doubleValue(); 455 asset.setSalvageAmount(kualiDecimalUtils.safeMultiply(assetGlobal.getSeparateSourceCapitalAsset().getSalvageAmount(), separateRatio)); 456 asset.setReplacementAmount(kualiDecimalUtils.safeMultiply(assetGlobal.getSeparateSourceCapitalAsset().getReplacementAmount(), separateRatio)); 457 asset.setFabricationEstimatedTotalAmount(kualiDecimalUtils.safeMultiply(assetGlobal.getSeparateSourceCapitalAsset().getFabricationEstimatedTotalAmount(), separateRatio)); 458 Date lastInventoryDate = assetGlobal.getLastInventoryDate(); 459 if (lastInventoryDate != null) { 460 asset.setLastInventoryDate(new Timestamp(lastInventoryDate.getTime())); 461 } 462 } 463 464 return asset; 465 } 466 467 /** 468 * Off campus location appropriately set for this asset. 469 * 470 * @param assetGlobalDetail containing data for the location 471 * @param asset object that location is set in 472 */ 473 protected void setupAssetLocationOffCampus(AssetGlobalDetail assetGlobalDetail, Asset asset) { 474 // We are not checking if it already exists since on a new asset it can't 475 AssetLocation offCampusAssetLocation = new AssetLocation(); 476 offCampusAssetLocation.setCapitalAssetNumber(asset.getCapitalAssetNumber()); 477 offCampusAssetLocation.setAssetLocationTypeCode(CamsConstants.AssetLocationTypeCode.OFF_CAMPUS); 478 asset.getAssetLocations().add(offCampusAssetLocation); 479 480 // Set the location fields either way 481 offCampusAssetLocation.setAssetLocationContactName(assetGlobalDetail.getOffCampusName()); 482 offCampusAssetLocation.setAssetLocationContactIdentifier(assetGlobalDetail.getRepresentativeUniversalIdentifier()); 483 offCampusAssetLocation.setAssetLocationInstitutionName(assetGlobalDetail.getAssetRepresentative().getPrimaryDepartmentCode()); 484 offCampusAssetLocation.setAssetLocationStreetAddress(assetGlobalDetail.getOffCampusAddress()); 485 offCampusAssetLocation.setAssetLocationCityName(assetGlobalDetail.getOffCampusCityName()); 486 offCampusAssetLocation.setAssetLocationStateCode(assetGlobalDetail.getOffCampusStateCode()); 487 offCampusAssetLocation.setAssetLocationCountryCode(assetGlobalDetail.getOffCampusCountryCode()); 488 offCampusAssetLocation.setAssetLocationZipCode(assetGlobalDetail.getOffCampusZipCode()); 489 490 // There is no phone number field on Asset Global... odd... 491 offCampusAssetLocation.setAssetLocationPhoneNumber(null); 492 } 493 494 /** 495 * Creates a payment for an asset in create new mode. 496 * 497 * @param capitalAssetNumber to use for the payment 498 * @param acquisitionTypeCode for logic in determining how dates are to be set 499 * @param assetGlobalDetailsSize for logic in determining depreciation amounts (if asset is depreciable) 500 * @param assetGlobalDetailsIndex for logic in determining depreciation amounts (if asset is depreciable) 501 * @param assetPaymentDetail containing data for the payment 502 * @return payment for an asset in create new 503 */ 504 protected AssetPayment setupCreateNewAssetPayment(Long capitalAssetNumber, String acquisitionTypeCode, int assetGlobalDetailsSize, int assetGlobalDetailsIndex, AssetPaymentDetail assetPaymentDetail) { 505 AssetPayment assetPayment = new AssetPayment(assetPaymentDetail, acquisitionTypeCode); 506 assetPayment.setCapitalAssetNumber(capitalAssetNumber); 507 assetPayment.setPaymentSequenceNumber(assetPaymentDetail.getSequenceNumber()); 508 assetPayment.setTransferPaymentCode(CamsConstants.AssetPayment.TRANSFER_PAYMENT_CODE_N); 509 // Running this every time of the loop is inefficient, could be put into HashMap 510 KualiDecimalUtils kualiDecimalService = new KualiDecimalUtils(assetPaymentDetail.getAmount(), CamsConstants.CURRENCY_USD); 511 KualiDecimal[] amountBuckets = kualiDecimalService.allocateByQuantity(assetGlobalDetailsSize); 512 513 assetPayment.setAccountChargeAmount(amountBuckets[assetGlobalDetailsIndex]); 514 ObjectCodeService objectCodeService = (ObjectCodeService) SpringContext.getBean(ObjectCodeService.class); 515 ObjectCode objectCode = objectCodeService.getByPrimaryIdForCurrentYear(assetPayment.getChartOfAccountsCode(), assetPayment.getFinancialObjectCode()); 516 517 boolean isDepreciablePayment = ObjectUtils.isNotNull(assetPaymentDetail.getObjectCode()) && !Arrays.asList(parameterService.getParameterValue(CAPITAL_ASSETS_BATCH.class, CamsConstants.Parameters.NON_DEPRECIABLE_FEDERALLY_OWNED_OBJECT_SUB_TYPES).split(";")).contains(objectCode.getFinancialObjectSubTypeCode()); 518 if (isDepreciablePayment) { 519 assetPayment.setPrimaryDepreciationBaseAmount(amountBuckets[assetGlobalDetailsIndex]); 520 } 521 else { 522 assetPayment.setPrimaryDepreciationBaseAmount(KualiDecimal.ZERO); 523 } 524 525 return assetPayment; 526 } 527 528 529 /** 530 * Gets the paymentSummaryService attribute. 531 * 532 * @return Returns the paymentSummaryService. 533 */ 534 public PaymentSummaryService getPaymentSummaryService() { 535 return paymentSummaryService; 536 } 537 538 /** 539 * Sets the paymentSummaryService attribute value. 540 * 541 * @param paymentSummaryService The paymentSummaryService to set. 542 */ 543 public void setPaymentSummaryService(PaymentSummaryService paymentSummaryService) { 544 this.paymentSummaryService = paymentSummaryService; 545 } 546 547 /** 548 * @return the parameter value for the new acquisition type code 549 */ 550 public String getNewAcquisitionTypeCode() { 551 return getParameterService().getParameterValue(AssetGlobal.class, 552 CamsConstants.AssetGlobal.NEW_ACQUISITION_CODE_PARAM); 553 } 554 /** 555 * @return the parameter value for the capital object acquisition code group 556 */ 557 public String getCapitalObjectAcquisitionCodeGroup() { 558 return getParameterService().getParameterValue(AssetGlobal.class, 559 CamsConstants.AssetGlobal.CAPITAL_OBJECT_ACQUISITION_CODE_PARAM); 560 } 561 /** 562 * @return the parameter value for the not new acquisition code group 563 */ 564 public String getNonNewAcquisitionCodeGroup() { 565 return getParameterService().getParameterValue(AssetGlobal.class, 566 CamsConstants.AssetGlobal.NON_NEW_ACQUISITION_GROUP_PARAM); 567 } 568 569 570 }