/*
* 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.service.impl;
import java.sql.Date;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.kuali.kfs.coa.businessobject.ObjectCode;
import org.kuali.kfs.coa.businessobject.OffsetDefinition;
import org.kuali.kfs.coa.service.ObjectCodeService;
import org.kuali.kfs.coa.service.OffsetDefinitionService;
import org.kuali.kfs.module.cam.CamsConstants;
import org.kuali.kfs.module.cam.CamsPropertyConstants;
import org.kuali.kfs.module.cam.businessobject.Asset;
import org.kuali.kfs.module.cam.businessobject.AssetAcquisitionType;
import org.kuali.kfs.module.cam.businessobject.AssetGlobal;
import org.kuali.kfs.module.cam.businessobject.AssetGlobalDetail;
import org.kuali.kfs.module.cam.businessobject.AssetGlpeSourceDetail;
import org.kuali.kfs.module.cam.businessobject.AssetLocation;
import org.kuali.kfs.module.cam.businessobject.AssetObjectCode;
import org.kuali.kfs.module.cam.businessobject.AssetPayment;
import org.kuali.kfs.module.cam.businessobject.AssetPaymentDetail;
import org.kuali.kfs.module.cam.document.gl.CamsGeneralLedgerPendingEntrySourceBase;
import org.kuali.kfs.module.cam.document.service.AssetGlobalService;
import org.kuali.kfs.module.cam.document.service.AssetObjectCodeService;
import org.kuali.kfs.module.cam.document.service.AssetPaymentService;
import org.kuali.kfs.module.cam.document.service.AssetService;
import org.kuali.kfs.module.cam.document.service.PaymentSummaryService;
import org.kuali.kfs.module.cam.util.AssetSeparatePaymentDistributor;
import org.kuali.kfs.module.cam.util.KualiDecimalUtils;
import org.kuali.kfs.sys.context.SpringContext;
import org.kuali.kfs.sys.service.UniversityDateService;
import org.kuali.kfs.sys.service.impl.KfsParameterConstants;
import org.kuali.kfs.sys.service.impl.KfsParameterConstants.CAPITAL_ASSETS_BATCH;
import org.kuali.rice.core.api.datetime.DateTimeService;
import org.kuali.rice.core.api.util.type.KualiDecimal;
import org.kuali.rice.coreservice.framework.parameter.ParameterService;
import org.kuali.rice.krad.bo.PersistableBusinessObject;
import org.kuali.rice.krad.service.BusinessObjectService;
import org.kuali.rice.krad.util.ObjectUtils;
public class AssetGlobalServiceImpl implements AssetGlobalService {
protected enum AmountCategory {
PAYMENT {
@Override
void setParams(AssetGlpeSourceDetail postable, AssetPaymentDetail assetPaymentDetail, AssetObjectCode assetObjectCode, OffsetDefinition offsetDefinition, AssetAcquisitionType acquisitionType) {
postable.setPayment(true);
postable.setFinancialDocumentLineDescription(CamsConstants.AssetGlobal.LINE_DESCRIPTION_PAYMENT);
postable.setFinancialObjectCode(assetPaymentDetail.getFinancialObjectCode());
postable.setObjectCode(assetPaymentDetail.getObjectCode());
};
},
PAYMENT_OFFSET {
@Override
void setParams(AssetGlpeSourceDetail postable, AssetPaymentDetail assetPaymentDetail, AssetObjectCode assetObjectCode, OffsetDefinition offsetDefinition, AssetAcquisitionType acquisitionType) {
postable.setPaymentOffset(true);
postable.setFinancialDocumentLineDescription(CamsConstants.AssetGlobal.LINE_DESCRIPTION_PAYMENT_OFFSET);
postable.setFinancialObjectCode(acquisitionType.getIncomeAssetObjectCode());
postable.setObjectCode(SpringContext.getBean(ObjectCodeService.class).getByPrimaryId(assetPaymentDetail.getPostingYear(), assetPaymentDetail.getChartOfAccountsCode(), acquisitionType.getIncomeAssetObjectCode()));
};
};
abstract void setParams(AssetGlpeSourceDetail postable, AssetPaymentDetail assetPaymentDetail, AssetObjectCode assetObjectCode, OffsetDefinition offsetDefinition, AssetAcquisitionType acquisitionType);
}
protected ParameterService parameterService;
protected AssetService assetService;
protected UniversityDateService universityDateService;
protected AssetObjectCodeService assetObjectCodeService;
protected BusinessObjectService businessObjectService;
protected AssetPaymentService assetPaymentService;
protected PaymentSummaryService paymentSummaryService;
protected DateTimeService dateTimeService;
protected ObjectCodeService objectCodeService;
protected OffsetDefinitionService offsetDefinitionService;
private static final Logger LOG = Logger.getLogger(AssetGlobalServiceImpl.class);
/**
* Creates an instance of AssetGlpeSourceDetail depending on the source flag
*
* @param universityDateService University Date Service
* @param assetPayment Payment record for which postable is created
* @param isSource Indicates if postable is for source organization
* @return GL Postable source detail
*/
protected AssetGlpeSourceDetail createAssetGlpePostable(AssetGlobal document, AssetPaymentDetail assetPaymentDetail, AmountCategory amountCategory) {
if (LOG.isDebugEnabled()) {
LOG.debug("Start - createAssetGlpePostable (" + document.getDocumentNumber() + "-" + assetPaymentDetail.getAccountNumber() + ")");
}
AssetGlpeSourceDetail postable = new AssetGlpeSourceDetail();
assetPaymentDetail.refreshReferenceObject(CamsPropertyConstants.AssetPaymentDetail.ACCOUNT);
postable.setAccount(assetPaymentDetail.getAccount());
postable.setAmount(assetPaymentDetail.getAmount());
postable.setAccountNumber(assetPaymentDetail.getAccountNumber());
postable.setBalanceTypeCode(CamsConstants.Postable.GL_BALANCE_TYPE_CODE_AC);
postable.setChartOfAccountsCode(assetPaymentDetail.getChartOfAccountsCode());
postable.setDocumentNumber(document.getDocumentNumber());
postable.setFinancialSubObjectCode(assetPaymentDetail.getFinancialSubObjectCode());
postable.setPostingYear(universityDateService.getCurrentUniversityDate().getUniversityFiscalYear());
postable.setProjectCode(assetPaymentDetail.getProjectCode());
postable.setSubAccountNumber(assetPaymentDetail.getSubAccountNumber());
postable.setOrganizationReferenceId(assetPaymentDetail.getOrganizationReferenceId());
assetPaymentDetail.refreshReferenceObject(CamsPropertyConstants.AssetPaymentDetail.OBJECT_CODE);
ObjectCode objectCode = objectCodeService.getByPrimaryIdForCurrentYear(assetPaymentDetail.getChartOfAccountsCode(), assetPaymentDetail.getFinancialObjectCode());
AssetObjectCode assetObjectCode = assetObjectCodeService.findAssetObjectCode(assetPaymentDetail.getChartOfAccountsCode(), objectCode.getFinancialObjectSubTypeCode());
OffsetDefinition offsetDefinition = offsetDefinitionService.getByPrimaryId(universityDateService.getCurrentFiscalYear(), assetPaymentDetail.getChartOfAccountsCode(), CamsConstants.AssetTransfer.DOCUMENT_TYPE_CODE, CamsConstants.Postable.GL_BALANCE_TYPE_CODE_AC);
document.refreshReferenceObject(CamsPropertyConstants.AssetGlobal.ACQUISITION_TYPE);
amountCategory.setParams(postable, assetPaymentDetail, assetObjectCode, offsetDefinition, document.getAcquisitionType());
if (LOG.isDebugEnabled()) {
LOG.debug("End - createAssetGlpePostable(" + document.getDocumentNumber() + "-" + assetPaymentDetail.getAccountNumber() + "-" + ")");
}
return postable;
}
/**
* @see org.kuali.kfs.module.cam.document.service.AssetGlobalService#createGLPostables(org.kuali.module.cams.document.AssetGlobal)
*/
@Override
public void createGLPostables(AssetGlobal assetGlobal, CamsGeneralLedgerPendingEntrySourceBase assetGlobalGlPoster) {
List<AssetPaymentDetail> assetPaymentDetails = assetGlobal.getAssetPaymentDetails();
for (AssetPaymentDetail assetPaymentDetail : assetPaymentDetails) {
if (isPaymentFinancialObjectActive(assetPaymentDetail)) {
KualiDecimal accountChargeAmount = assetPaymentDetail.getAmount();
if (accountChargeAmount != null && !accountChargeAmount.isZero()) {
assetGlobalGlPoster.getGeneralLedgerPendingEntrySourceDetails().add(createAssetGlpePostable(assetGlobal, assetPaymentDetail, AmountCategory.PAYMENT));
assetGlobalGlPoster.getGeneralLedgerPendingEntrySourceDetails().add(createAssetGlpePostable(assetGlobal, assetPaymentDetail, AmountCategory.PAYMENT_OFFSET));
}
}
}
}
public void setParameterService(ParameterService parameterService) {
this.parameterService = parameterService;
}
public void setAssetObjectCodeService(AssetObjectCodeService assetObjectCodeService) {
this.assetObjectCodeService = assetObjectCodeService;
}
public void setAssetPaymentService(AssetPaymentService assetPaymentService) {
this.assetPaymentService = assetPaymentService;
}
public void setBusinessObjectService(BusinessObjectService businessObjectService) {
this.businessObjectService = businessObjectService;
}
public void setUniversityDateService(UniversityDateService universityDateService) {
this.universityDateService = universityDateService;
}
/**
* We need to calculate asset total amount from the sum of its payments. Otherwise, the asset total amount could mismatch with
* the sum of payments.
*
* @see org.kuali.kfs.module.cam.document.service.AssetGlobalService#totalPaymentByAsset(org.kuali.kfs.module.cam.businessobject.AssetGlobal)
*/
@Override
public KualiDecimal totalPaymentByAsset(AssetGlobal assetGlobal, boolean lastEntry) {
KualiDecimal assetTotalAmount = KualiDecimal.ZERO;
List<AssetPaymentDetail> assetPaymentDetails = assetGlobal.getAssetPaymentDetails();
int numberOfTotalAsset = assetGlobal.getAssetGlobalDetails().size();
if (numberOfTotalAsset > 0) {
for (AssetPaymentDetail assetPaymentDetail : assetPaymentDetails) {
KualiDecimal assetPaymentUnitCost = assetPaymentDetail.getAmount().divide(new KualiDecimal(numberOfTotalAsset));
if (lastEntry) {
assetPaymentUnitCost = assetPaymentDetail.getAmount().subtract(assetPaymentUnitCost.multiply(new KualiDecimal(numberOfTotalAsset - 1)));
}
assetTotalAmount = assetTotalAmount.add(assetPaymentUnitCost);
}
}
return assetTotalAmount;
}
/**
* @see org.kuali.kfs.module.cam.document.service.AssetGlobalService#existsInGroup(java.lang.String, java.lang.String)
*/
@Override
public boolean existsInGroup(String groupName, String memberName) {
if (StringUtils.isBlank(groupName) || StringUtils.isBlank(memberName)) {
return false;
}
return Arrays.asList(groupName.split(";")).contains(memberName);
}
protected boolean isPaymentFinancialObjectActive(AssetPaymentDetail assetPayment) {
ObjectCode financialObjectCode = objectCodeService.getByPrimaryIdForCurrentYear(assetPayment.getChartOfAccountsCode(),assetPayment.getFinancialObjectCode());
if ( financialObjectCode != null ) {
return financialObjectCode.isActive();
}
return false;
}
public void setAssetService(AssetService assetService) {
this.assetService = assetService;
}
/**
* @see org.kuali.kfs.module.cam.document.service.AssetGlobalService#isAssetSeparate(org.kuali.kfs.module.cam.businessobject.AssetGlobal)
*/
@Override
public boolean isAssetSeparate(AssetGlobal assetGlobal) {
if (ObjectUtils.isNotNull(assetGlobal.getFinancialDocumentTypeCode()) && assetGlobal.getFinancialDocumentTypeCode().equals(CamsConstants.PaymentDocumentTypeCodes.ASSET_GLOBAL_SEPARATE)) {
return true;
}
return false;
}
/**
* @see org.kuali.kfs.module.cam.document.service.AssetGlobalService#isAssetSeparateByPayment(org.kuali.kfs.module.cam.businessobject.AssetGlobal)
*/
@Override
public boolean isAssetSeparateByPayment(AssetGlobal assetGlobal) {
if (this.isAssetSeparate(assetGlobal) && ObjectUtils.isNotNull(assetGlobal.getSeparateSourcePaymentSequenceNumber())) {
return true;
}
return false;
}
/**
* Add and return the total amount for all unique assets created.
*
* @param assetGlobal
* @return Returns the total separate source amount
*/
@Override
public KualiDecimal getUniqueAssetsTotalAmount(AssetGlobal assetGlobal) {
KualiDecimal totalAmount = KualiDecimal.ZERO;
// add new asset location
for (AssetGlobalDetail assetSharedDetail : assetGlobal.getAssetSharedDetails()) {
// existing
for (AssetGlobalDetail assetGlobalUniqueDetail : assetSharedDetail.getAssetGlobalUniqueDetails()) {
KualiDecimal separateSourceAmount = assetGlobalUniqueDetail.getSeparateSourceAmount();
if (separateSourceAmount != null) {
totalAmount = totalAmount.add(separateSourceAmount);
}
}
}
return totalAmount;
}
/**
* @see org.kuali.kfs.module.cam.document.service.AssetGlobalService#getCreateNewAssets(org.kuali.kfs.module.cam.businessobject.AssetGlobal)
*/
@Override
public List<PersistableBusinessObject> getCreateNewAssets(AssetGlobal assetGlobal) {
List<PersistableBusinessObject> persistables = new ArrayList<PersistableBusinessObject>();
// create new assets with inner loop handling payments
Iterator<AssetGlobalDetail> assetGlobalDetailsIterator = assetGlobal.getAssetGlobalDetails().iterator();
for (int assetGlobalDetailsIndex = 0; assetGlobalDetailsIterator.hasNext(); assetGlobalDetailsIndex++) {
AssetGlobalDetail assetGlobalDetail = assetGlobalDetailsIterator.next();
// Create the asset with most fields set as required
Asset asset = setupAsset(assetGlobal, assetGlobalDetail, false);
// track total cost of all payments for this assetGlobalDetail
KualiDecimal paymentsAccountChargeAmount = new KualiDecimal(0);
// take care of all the payments for this asset
for (AssetPaymentDetail assetPaymentDetail : assetGlobal.getAssetPaymentDetails()) {
AssetPayment assetPayment = setupCreateNewAssetPayment(assetGlobalDetail.getCapitalAssetNumber(), assetGlobal.getAcquisitionTypeCode(), assetGlobal.getAssetGlobalDetails().size(), assetGlobalDetailsIndex, assetPaymentDetail);
paymentsAccountChargeAmount = paymentsAccountChargeAmount.add(assetPayment.getAccountChargeAmount());
asset.getAssetPayments().add(assetPayment);
}
// set the amount generically. Note for separate this should equal assetGlobalDetail.getSeparateSourceAmount()
asset.setTotalCostAmount(paymentsAccountChargeAmount);
persistables.add(asset);
}
return persistables;
}
/**
* @see org.kuali.kfs.module.cam.document.service.AssetGlobalService#getSeparateAssets(org.kuali.kfs.module.cam.businessobject.AssetGlobal)
*/
@Override
public List<PersistableBusinessObject> getSeparateAssets(AssetGlobal assetGlobal) {
// set the source asset amounts properly
Asset separateSourceCapitalAsset = assetGlobal.getSeparateSourceCapitalAsset();
List<AssetPayment> sourcePayments = new ArrayList<AssetPayment>();
for (AssetPayment assetPayment : separateSourceCapitalAsset.getAssetPayments()) {
if (!this.isAssetSeparateByPayment(assetGlobal)) {
sourcePayments.add(assetPayment);
}
else if (assetPayment.getPaymentSequenceNumber().equals(assetGlobal.getSeparateSourcePaymentSequenceNumber())) {
// If this is separate by payment, then only add the payment that we are interested in
sourcePayments.add(assetPayment);
break;
}
}
List<Asset> newAssets = new ArrayList<Asset>();
// create new assets with inner loop handling payments
for (AssetGlobalDetail assetGlobalDetail : assetGlobal.getAssetGlobalDetails()) {
newAssets.add(setupAsset(assetGlobal, assetGlobalDetail, true));
}
// adjust source asset amounts
KualiDecimalUtils kualiDecimalUtils = new KualiDecimalUtils();
double separateRatio = 1 - (assetGlobal.getSeparateSourceTotalAmount().doubleValue() / assetGlobal.getSeparateSourceCapitalAsset().getTotalCostAmount().doubleValue());
separateSourceCapitalAsset.setSalvageAmount(kualiDecimalUtils.safeMultiply(assetGlobal.getSeparateSourceCapitalAsset().getSalvageAmount(), separateRatio));
separateSourceCapitalAsset.setReplacementAmount(kualiDecimalUtils.safeMultiply(assetGlobal.getSeparateSourceCapitalAsset().getReplacementAmount(), separateRatio));
separateSourceCapitalAsset.setFabricationEstimatedTotalAmount(kualiDecimalUtils.safeMultiply(assetGlobal.getSeparateSourceCapitalAsset().getFabricationEstimatedTotalAmount(), separateRatio));
Integer maxSequenceNumber = assetPaymentService.getMaxSequenceNumber(separateSourceCapitalAsset.getCapitalAssetNumber());
// Add to the save list
AssetSeparatePaymentDistributor distributor = new AssetSeparatePaymentDistributor(separateSourceCapitalAsset, sourcePayments, maxSequenceNumber, assetGlobal, newAssets);
distributor.distribute();
// re-compute the source total cost amount after split
separateSourceCapitalAsset.setTotalCostAmount(paymentSummaryService.calculatePaymentTotalCost(separateSourceCapitalAsset));
List<PersistableBusinessObject> persistables = new ArrayList<PersistableBusinessObject>();
persistables.add(separateSourceCapitalAsset);
persistables.addAll(newAssets);
return persistables;
}
/**
* Creates a new Asset appropriate for either create new or separate. This does not create the payments for this asset.
*
* @param assetGlobal containing data for the asset to be created
* @param assetGlobalDetail containing data for the asset to be created
* @param separate indicating whether this is a separate and asset or not
* @return set of assets appropriate for this creation without payments
*/
protected Asset setupAsset(AssetGlobal assetGlobal, AssetGlobalDetail assetGlobalDetail, boolean separate) {
Asset asset = new Asset(assetGlobal, assetGlobalDetail, separate);
KualiDecimalUtils kualiDecimalUtils = new KualiDecimalUtils();
// set financialObjectSubTypeCode per first payment entry if one exists
if (!assetGlobal.getAssetPaymentDetails().isEmpty() && ObjectUtils.isNotNull(assetGlobal.getAssetPaymentDetails().get(0).getObjectCode())) {
AssetPaymentDetail assetPaymentDetail = assetGlobal.getAssetPaymentDetails().get(0);
ObjectCode objectCode = objectCodeService.getByPrimaryIdForCurrentYear(assetPaymentDetail.getChartOfAccountsCode(), assetPaymentDetail.getFinancialObjectCode());
asset.setFinancialObjectSubTypeCode(objectCode.getFinancialObjectSubTypeCode());
}
// create off campus location for each asset only if it was filled in
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());
if (offCampus) {
setupAssetLocationOffCampus(assetGlobalDetail, asset);
}
// set specific values for new assets if document is Asset Separate
if (separate) {
double separateRatio = assetGlobalDetail.getSeparateSourceAmount().doubleValue() / assetGlobal.getSeparateSourceCapitalAsset().getTotalCostAmount().doubleValue();
asset.setSalvageAmount(kualiDecimalUtils.safeMultiply(assetGlobal.getSeparateSourceCapitalAsset().getSalvageAmount(), separateRatio));
asset.setReplacementAmount(kualiDecimalUtils.safeMultiply(assetGlobal.getSeparateSourceCapitalAsset().getReplacementAmount(), separateRatio));
asset.setFabricationEstimatedTotalAmount(kualiDecimalUtils.safeMultiply(assetGlobal.getSeparateSourceCapitalAsset().getFabricationEstimatedTotalAmount(), separateRatio));
Date lastInventoryDate = assetGlobal.getLastInventoryDate();
if (lastInventoryDate != null) {
asset.setLastInventoryDate(new Timestamp(lastInventoryDate.getTime()));
}
}
return asset;
}
/**
* Off campus location appropriately set for this asset.
*
* @param assetGlobalDetail containing data for the location
* @param asset object that location is set in
*/
protected void setupAssetLocationOffCampus(AssetGlobalDetail assetGlobalDetail, Asset asset) {
// We are not checking if it already exists since on a new asset it can't
AssetLocation offCampusAssetLocation = new AssetLocation();
offCampusAssetLocation.setCapitalAssetNumber(asset.getCapitalAssetNumber());
offCampusAssetLocation.setAssetLocationTypeCode(CamsConstants.AssetLocationTypeCode.OFF_CAMPUS);
asset.getAssetLocations().add(offCampusAssetLocation);
// Set the location fields either way
offCampusAssetLocation.setAssetLocationContactName(assetGlobalDetail.getOffCampusName());
offCampusAssetLocation.setAssetLocationContactIdentifier(assetGlobalDetail.getRepresentativeUniversalIdentifier());
offCampusAssetLocation.setAssetLocationInstitutionName(assetGlobalDetail.getAssetRepresentative().getPrimaryDepartmentCode());
offCampusAssetLocation.setAssetLocationStreetAddress(assetGlobalDetail.getOffCampusAddress());
offCampusAssetLocation.setAssetLocationCityName(assetGlobalDetail.getOffCampusCityName());
offCampusAssetLocation.setAssetLocationStateCode(assetGlobalDetail.getOffCampusStateCode());
offCampusAssetLocation.setAssetLocationCountryCode(assetGlobalDetail.getOffCampusCountryCode());
offCampusAssetLocation.setAssetLocationZipCode(assetGlobalDetail.getOffCampusZipCode());
// There is no phone number field on Asset Global... odd...
offCampusAssetLocation.setAssetLocationPhoneNumber(null);
}
/**
* Creates a payment for an asset in create new mode.
*
* @param capitalAssetNumber to use for the payment
* @param acquisitionTypeCode for logic in determining how dates are to be set
* @param assetGlobalDetailsSize for logic in determining depreciation amounts (if asset is depreciable)
* @param assetGlobalDetailsIndex for logic in determining depreciation amounts (if asset is depreciable)
* @param assetPaymentDetail containing data for the payment
* @return payment for an asset in create new
*/
protected AssetPayment setupCreateNewAssetPayment(Long capitalAssetNumber, String acquisitionTypeCode, int assetGlobalDetailsSize, int assetGlobalDetailsIndex, AssetPaymentDetail assetPaymentDetail) {
AssetPayment assetPayment = new AssetPayment(assetPaymentDetail, acquisitionTypeCode);
assetPayment.setCapitalAssetNumber(capitalAssetNumber);
assetPayment.setPaymentSequenceNumber(assetPaymentDetail.getSequenceNumber());
assetPayment.setTransferPaymentCode(CamsConstants.AssetPayment.TRANSFER_PAYMENT_CODE_N);
// Running this every time of the loop is inefficient, could be put into HashMap
KualiDecimal[] amountBuckets = KualiDecimalUtils.allocateByQuantity(assetPaymentDetail.getAmount(), assetGlobalDetailsSize);
assetPayment.setAccountChargeAmount(amountBuckets[assetGlobalDetailsIndex]);
ObjectCode objectCode = objectCodeService.getByPrimaryIdForCurrentYear(assetPayment.getChartOfAccountsCode(), assetPayment.getFinancialObjectCode());
boolean isDepreciablePayment = ObjectUtils.isNotNull(assetPaymentDetail.getObjectCode()) && !Arrays.asList(parameterService.getParameterValueAsString(CAPITAL_ASSETS_BATCH.class, CamsConstants.Parameters.NON_DEPRECIABLE_FEDERALLY_OWNED_OBJECT_SUB_TYPES).split(";")).contains(objectCode.getFinancialObjectSubTypeCode());
if (isDepreciablePayment) {
assetPayment.setPrimaryDepreciationBaseAmount(amountBuckets[assetGlobalDetailsIndex]);
}
else {
assetPayment.setPrimaryDepreciationBaseAmount(KualiDecimal.ZERO);
}
return assetPayment;
}
public void setPaymentSummaryService(PaymentSummaryService paymentSummaryService) {
this.paymentSummaryService = paymentSummaryService;
}
/**
* @return the parameter value for the new acquisition type code
*/
@Override
public String getNewAcquisitionTypeCode() {
return parameterService.getParameterValueAsString(AssetGlobal.class,
CamsConstants.AssetGlobal.NEW_ACQUISITION_CODE_PARAM);
}
/**
* @return the parameter value for the capital object acquisition code group
*/
@Override
public String getCapitalObjectAcquisitionCodeGroup() {
return parameterService.getParameterValueAsString(AssetGlobal.class,
CamsConstants.AssetGlobal.CAPITAL_OBJECT_ACQUISITION_CODE_PARAM);
}
/**
* @return the parameter value for the not new acquisition code group
*/
@Override
public String getNonNewAcquisitionCodeGroup() {
return parameterService.getParameterValueAsString(AssetGlobal.class,
CamsConstants.AssetGlobal.NON_NEW_ACQUISITION_GROUP_PARAM);
}
/**
* @see org.kuali.kfs.module.cam.document.service.AssetGlobalService#getFiscalYearEndDayAndMonth()
*/
@Override
public String getFiscalYearEndDayAndMonth() {
String yearEndDateAndMonth = parameterService.getParameterValueAsString(KfsParameterConstants.CAPITAL_ASSETS_ALL.class, CamsConstants.Parameters.FISCAL_YEAR_END_MONTH_AND_DAY);
return yearEndDateAndMonth.substring(0, 2).concat("/").concat(yearEndDateAndMonth.substring(2, 4));
}
public void setDateTimeService(DateTimeService dateTimeService) {
this.dateTimeService = dateTimeService;
}
public void setObjectCodeService(ObjectCodeService objectCodeService) {
this.objectCodeService = objectCodeService;
}
public void setOffsetDefinitionService(OffsetDefinitionService offsetDefinitionService) {
this.offsetDefinitionService = offsetDefinitionService;
}
}