/* * 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.validation.impl; import java.math.BigDecimal; import org.kuali.kfs.module.cam.CamsKeyConstants; import org.kuali.kfs.module.cam.CamsPropertyConstants; import org.kuali.kfs.module.cam.businessobject.AssetPaymentAssetDetail; import org.kuali.kfs.module.cam.document.AssetPaymentDocument; import org.kuali.kfs.module.cam.document.service.AssetPaymentService; import org.kuali.kfs.module.cam.util.distribution.AssetDistribution; import org.kuali.kfs.sys.businessobject.AccountingLineBase; import org.kuali.kfs.sys.document.validation.GenericValidation; import org.kuali.kfs.sys.document.validation.event.AttributedDocumentEvent; import org.kuali.rice.core.api.util.type.KualiDecimal; import org.kuali.rice.krad.util.GlobalVariables; /** * Validate Asset Distribution (allocation) sums */ public class AssetPaymentAllocationValidation extends GenericValidation { private AssetPaymentService assetPaymentService; /** * @see org.kuali.kfs.sys.document.validation.Validation#validate(org.kuali.kfs.sys.document.validation.event.AttributedDocumentEvent) */ @Override public boolean validate(AttributedDocumentEvent event) { boolean valid = true; AssetPaymentDocument assetPaymentDocument = (AssetPaymentDocument) event.getDocument(); AssetDistribution distributor = assetPaymentDocument.getAssetPaymentDistributor(); if (CamsPropertyConstants.AssetPaymentAllocation.ASSET_DISTRIBUTION_BY_PERCENTAGE_CODE.equals(assetPaymentDocument.getAssetPaymentAllocationTypeCode())) { valid &= validatePercentSum(assetPaymentDocument); } else if (CamsPropertyConstants.AssetPaymentAllocation.ASSET_DISTRIBUTION_BY_AMOUNT_CODE.equals(assetPaymentDocument.getAssetPaymentAllocationTypeCode())) { valid = validateAmountSum(assetPaymentDocument); } return valid; } /** * Allocation by amount must sum to the accounting line total * * @param assetPaymentDocument * @return true if the amounts are correct */ protected boolean validateAmountSum(AssetPaymentDocument assetPaymentDocument) { KualiDecimal total = getAllocatedTotal(assetPaymentDocument); KualiDecimal sourceTotal = getSourceLinesTotal(assetPaymentDocument); if (!total.equals(sourceTotal)) { GlobalVariables.getMessageMap().putErrorForSectionId(CamsPropertyConstants.COMMON_ERROR_SECTION_ID, CamsKeyConstants.AssetPaymentAllocation.ERROR_AMOUNT_NOT_EQUAL); return false; } return true; } /** * @param assetPaymentDocument * @return sum of the source accounting lines amounts. */ private KualiDecimal getSourceLinesTotal(AssetPaymentDocument assetPaymentDocument) { KualiDecimal sourceTotal = KualiDecimal.ZERO; for (Object sal : assetPaymentDocument.getSourceAccountingLines()) { sourceTotal = sourceTotal.add(((AccountingLineBase) sal).getAmount()); } return sourceTotal; } /** * * @param assetPaymentDocument * @return sum of allocated user value. */ private KualiDecimal getAllocatedTotal(AssetPaymentDocument assetPaymentDocument) { KualiDecimal total = KualiDecimal.ZERO; for (AssetPaymentAssetDetail apad : assetPaymentDocument.getAssetPaymentAssetDetail()) { //KFSCNTRB-1209: if the document is created by the system from fp/purap side then //use the property allocatedAmount to sum up the amounts of the assets else //use allocatedUserValue to sum up the total. if (assetPaymentDocument.isAllocationFromFPDocuments()) { total = total.add(apad.getAllocatedAmount()); } else { total = total.add(apad.getAllocatedUserValue()); } } return total; } /** * Allocation by percentages must total 100% * * @param assetPaymentDocument * @return true if the percentage is correct */ private boolean validatePercentSum(AssetPaymentDocument assetPaymentDocument) { BigDecimal total = new BigDecimal(0d); for (AssetPaymentAssetDetail apad : assetPaymentDocument.getAssetPaymentAssetDetail()) { BigDecimal buggyFix = new BigDecimal("" + apad.getAllocatedUserValuePct().doubleValue()); total = total.add(buggyFix); } if (total.doubleValue() != 100.00d) { GlobalVariables.getMessageMap().putErrorForSectionId(CamsPropertyConstants.COMMON_ERROR_SECTION_ID, CamsKeyConstants.AssetPaymentAllocation.ERROR_PERCENT_NOT_100); return false; } return true; } public AssetPaymentService getAssetPaymentService() { return assetPaymentService; } public void setAssetPaymentService(AssetPaymentService assetPaymentService) { this.assetPaymentService = assetPaymentService; } }