/*
* 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.util.distribution;
import static org.kuali.rice.core.api.util.type.KualiDecimal.ZERO;
import java.util.HashMap;
import java.util.Map;
import org.kuali.kfs.module.cam.businessobject.AssetPaymentAssetDetail;
import org.kuali.kfs.module.cam.businessobject.AssetPaymentDetail;
import org.kuali.kfs.module.cam.document.AssetPaymentDocument;
import org.kuali.rice.core.api.util.type.KualiDecimal;
/**
* Distribute Payment amounts equally among all assets
*/
public class AssetDistributionEvenly extends AssetDistribution {
private Map<String, Map<AssetPaymentAssetDetail, KualiDecimal>> distributionResult;
/**
* @param assetPaymentDetailLines
* @param assetPaymentAssetDetails
* @param totalHistoricalCost
*/
public AssetDistributionEvenly(AssetPaymentDocument doc) {
super(doc);
}
/**
* Do the calculation.
*/
private void precalculate() {
distributionResult = new HashMap<String, Map<AssetPaymentAssetDetail, KualiDecimal>>();
KualiDecimal total = ZERO;
KualiDecimal distributionAmount = ZERO;
int size = doc.getAssetPaymentAssetDetail().size();
KualiDecimal assetDetailSize = new KualiDecimal(size);
if (assetDetailSize.isNonZero()) {
for (AssetPaymentDetail sourceLine : getAssetPaymentDetailLines()) {
total = sourceLine.getAmount();
distributionAmount = total.divide(assetDetailSize);
Map<AssetPaymentAssetDetail, KualiDecimal> assetDetailMap = new HashMap<AssetPaymentAssetDetail, KualiDecimal>();
for (int i = 0; i < size; i++) {
AssetPaymentAssetDetail assetDetail = doc.getAssetPaymentAssetDetail().get(i);
if (i < size - 1) {
assetDetailMap.put(assetDetail, distributionAmount);
total = total.subtract(distributionAmount);
} else {
assetDetailMap.put(assetDetail, total);
}
}
distributionResult.put(sourceLine.getAssetPaymentDetailKey(), assetDetailMap);
}
}
}
/**
* @see org.kuali.kfs.module.cam.util.distribution.AssetDistribution#getAssetPaymentDistributions()
*/
public Map<String, Map<AssetPaymentAssetDetail, KualiDecimal>> getAssetPaymentDistributions() {
precalculate();
return distributionResult;
}
}