/*
* 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.utils;
import java.util.ArrayList;
import java.util.List;
import org.kuali.kfs.module.cam.businessobject.Asset;
import org.kuali.kfs.module.cam.businessobject.AssetGlobal;
import org.kuali.kfs.module.cam.businessobject.AssetGlobalDetail;
import org.kuali.kfs.module.cam.businessobject.AssetPayment;
import org.kuali.kfs.module.cam.util.AssetSeparatePaymentDistributor;
import org.kuali.kfs.sys.ConfigureContext;
import org.kuali.kfs.sys.context.KualiTestBase;
import org.kuali.rice.core.api.util.type.KualiDecimal;
@ConfigureContext
public class AssetSeparatePaymentDistributorTest extends KualiTestBase {
public void testDistributeByAsset() throws Exception {
Asset sourceAsset = new Asset();
sourceAsset.getAssetPayments().add(createPayment("0", "DUMMY1"));
sourceAsset.getAssetPayments().add(createPayment("13", "DUMMY2"));
sourceAsset.getAssetPayments().add(createPayment("13", "DUMMY3"));
sourceAsset.getAssetPayments().add(createPayment("13", "DUMMY4"));
sourceAsset.getAssetPayments().add(createPayment("0", "DUMMY5"));
AssetGlobal assetGlobal = new AssetGlobal();
assetGlobal.setTotalCostAmount(new KualiDecimal("39"));
assetGlobal.setSeparateSourceTotalAmount(new KualiDecimal("39"));
assetGlobal.setSeparateSourceRemainingAmount(new KualiDecimal("13"));
assetGlobal.getAssetGlobalDetails().add(createDetail(1L, new KualiDecimal("22")));
assetGlobal.getAssetGlobalDetails().add(createDetail(2L, new KualiDecimal("17")));
List<Asset> newAssets = new ArrayList<Asset>();
newAssets.add(createAsset(1L));
newAssets.add(createAsset(2L));
AssetSeparatePaymentDistributor distributor = new AssetSeparatePaymentDistributor(sourceAsset, sourceAsset.getAssetPayments(), 5, assetGlobal, newAssets);
distributor.distribute();
// make sure payments are added to new asset
Asset asset = newAssets.get(0);
assertEquals(3, asset.getAssetPayments().size());
assertEquals(new KualiDecimal("7.33"), asset.getAssetPayments().get(0).getAccountChargeAmount());
assertEquals("DUMMY2", asset.getAssetPayments().get(0).getAccountNumber());
assertEquals(new KualiDecimal("7.33"), asset.getAssetPayments().get(1).getAccountChargeAmount());
assertEquals("DUMMY3", asset.getAssetPayments().get(1).getAccountNumber());
assertEquals(new KualiDecimal("7.34"), asset.getAssetPayments().get(2).getAccountChargeAmount());
assertEquals("DUMMY4", asset.getAssetPayments().get(2).getAccountNumber());
assertEquals(new KualiDecimal("7.33"), asset.getAssetPayments().get(0).getPrimaryDepreciationBaseAmount());
assertEquals(new KualiDecimal("7.33"), asset.getAssetPayments().get(1).getPrimaryDepreciationBaseAmount());
assertEquals(new KualiDecimal("7.34"), asset.getAssetPayments().get(2).getPrimaryDepreciationBaseAmount());
assertEquals(new KualiDecimal("3.89"), asset.getAssetPayments().get(0).getAccumulatedPrimaryDepreciationAmount());
assertEquals(new KualiDecimal("3.89"), asset.getAssetPayments().get(1).getAccumulatedPrimaryDepreciationAmount());
assertEquals(new KualiDecimal("3.89"), asset.getAssetPayments().get(2).getAccumulatedPrimaryDepreciationAmount());
asset = newAssets.get(1);
assertEquals(3, asset.getAssetPayments().size());
assertEquals(new KualiDecimal("5.67"), asset.getAssetPayments().get(0).getAccountChargeAmount());
assertEquals("DUMMY2", asset.getAssetPayments().get(0).getAccountNumber());
assertEquals(new KualiDecimal("5.67"), asset.getAssetPayments().get(1).getAccountChargeAmount());
assertEquals("DUMMY3", asset.getAssetPayments().get(1).getAccountNumber());
assertEquals(new KualiDecimal("5.66"), asset.getAssetPayments().get(2).getAccountChargeAmount());
assertEquals("DUMMY4", asset.getAssetPayments().get(2).getAccountNumber());
assertEquals(new KualiDecimal("5.67"), asset.getAssetPayments().get(0).getPrimaryDepreciationBaseAmount());
assertEquals(new KualiDecimal("5.67"), asset.getAssetPayments().get(1).getPrimaryDepreciationBaseAmount());
assertEquals(new KualiDecimal("5.66"), asset.getAssetPayments().get(2).getPrimaryDepreciationBaseAmount());
assertEquals(new KualiDecimal("3.01"), asset.getAssetPayments().get(0).getAccumulatedPrimaryDepreciationAmount());
assertEquals(new KualiDecimal("3.01"), asset.getAssetPayments().get(1).getAccumulatedPrimaryDepreciationAmount());
assertEquals(new KualiDecimal("3.01"), asset.getAssetPayments().get(2).getAccumulatedPrimaryDepreciationAmount());
// make sure offset payments are added to source asset
assertEquals(8, sourceAsset.getAssetPayments().size());
assertEquals(new KualiDecimal("-13"), sourceAsset.getAssetPayments().get(5).getAccountChargeAmount());
assertEquals("DUMMY2", sourceAsset.getAssetPayments().get(5).getAccountNumber());
assertEquals(new KualiDecimal("-13"), sourceAsset.getAssetPayments().get(6).getAccountChargeAmount());
assertEquals("DUMMY3", sourceAsset.getAssetPayments().get(6).getAccountNumber());
assertEquals(new KualiDecimal("-13"), sourceAsset.getAssetPayments().get(7).getAccountChargeAmount());
assertEquals("DUMMY4", sourceAsset.getAssetPayments().get(7).getAccountNumber());
assertEquals(new KualiDecimal("-13"), sourceAsset.getAssetPayments().get(5).getPrimaryDepreciationBaseAmount());
assertEquals(new KualiDecimal("-13"), sourceAsset.getAssetPayments().get(6).getPrimaryDepreciationBaseAmount());
assertEquals(new KualiDecimal("-13"), sourceAsset.getAssetPayments().get(7).getPrimaryDepreciationBaseAmount());
assertEquals(new KualiDecimal("-6.9"), sourceAsset.getAssetPayments().get(5).getAccumulatedPrimaryDepreciationAmount());
assertEquals(new KualiDecimal("-6.9"), sourceAsset.getAssetPayments().get(6).getAccumulatedPrimaryDepreciationAmount());
assertEquals(new KualiDecimal("-6.9"), sourceAsset.getAssetPayments().get(7).getAccumulatedPrimaryDepreciationAmount());
// sum and see if dollar amount sums up correctly
assertEquals(new KualiDecimal("13"), newAssets.get(0).getAssetPayments().get(0).getAccountChargeAmount().add(newAssets.get(1).getAssetPayments().get(0).getAccountChargeAmount()));
assertEquals(new KualiDecimal("13"), newAssets.get(0).getAssetPayments().get(1).getAccountChargeAmount().add(newAssets.get(1).getAssetPayments().get(1).getAccountChargeAmount()));
assertEquals(new KualiDecimal("13"), newAssets.get(0).getAssetPayments().get(2).getAccountChargeAmount().add(newAssets.get(1).getAssetPayments().get(2).getAccountChargeAmount()));
}
private Asset createAsset(long assetNumber) {
Asset asset = new Asset();
asset.setCapitalAssetNumber(assetNumber);
return asset;
}
private AssetGlobalDetail createDetail(long assetNumber, KualiDecimal separateAmount) {
AssetGlobalDetail detail = new AssetGlobalDetail();
detail.setCapitalAssetNumber(assetNumber);
detail.setSeparateSourceAmount(separateAmount);
return detail;
}
private AssetPayment createPayment(String amount, String acctNo) {
AssetPayment payment = new AssetPayment();
payment.setAccountNumber(acctNo);
payment.setAccountChargeAmount(new KualiDecimal(amount));
payment.setPrimaryDepreciationBaseAmount(new KualiDecimal(amount));
payment.setPreviousYearPrimaryDepreciationAmount(new KualiDecimal("2.3"));
payment.setAccumulatedPrimaryDepreciationAmount(new KualiDecimal("6.9"));
payment.setPeriod2Depreciation1Amount(new KualiDecimal("2.3"));
payment.setPeriod3Depreciation1Amount(new KualiDecimal("2.3"));
payment.setPeriod4Depreciation1Amount(KualiDecimal.ZERO);
payment.setPeriod5Depreciation1Amount(null);
return payment;
}
}