/* * 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.ec.util; import static org.kuali.kfs.sys.KFSConstants.CurrencyTypeAmounts.HUNDRED_DOLLAR_AMOUNT; import org.kuali.kfs.sys.KFSConstants; import org.kuali.rice.core.api.util.type.KualiDecimal; /** * To hold the payroll amount and percent */ public class PayrollAmountHolder { private KualiDecimal payrollAmount; private Integer payrollPercent; private KualiDecimal totalAmount; private KualiDecimal accumulatedAmount; private Integer accumulatedPercent; /** * Constructs a PayrollAmountHolder.java. * * @param totalAmount the total payroll amount * @param accumulatedAmount the accumulated payroll amount * @param accumulatedPercent the accumulated payroll percent */ public PayrollAmountHolder(KualiDecimal totalAmount, KualiDecimal accumulatedAmount, Integer accumulatedPercent) { super(); this.totalAmount = totalAmount; this.accumulatedAmount = accumulatedAmount; this.accumulatedPercent = accumulatedPercent; } /** * Gets the payrollAmount attribute. * * @return Returns the payrollAmount. */ public KualiDecimal getPayrollAmount() { return payrollAmount; } /** * Sets the payrollAmount attribute value. * * @param payrollAmount The payrollAmount to set. */ public void setPayrollAmount(KualiDecimal payrollAmount) { this.payrollAmount = payrollAmount; } /** * Gets the payrollPercent attribute. * * @return Returns the payrollPercent. */ public Integer getPayrollPercent() { return payrollPercent; } /** * Sets the payrollPercent attribute value. * * @param payrollPercent The payrollPercent to set. */ public void setPayrollPercent(Integer payrollPercent) { this.payrollPercent = payrollPercent; } /** * Gets the totalAmount attribute. * * @return Returns the totalAmount. */ public KualiDecimal getTotalAmount() { return totalAmount; } /** * Sets the totalAmount attribute value. * * @param totalAmount The totalAmount to set. */ public void setTotalAmount(KualiDecimal totalAmount) { this.totalAmount = totalAmount; } /** * Gets the accumulatedAmount attribute. * * @return Returns the accumulatedAmount. */ public KualiDecimal getAccumulatedAmount() { return accumulatedAmount; } /** * Sets the accumulatedAmount attribute value. * * @param accumulatedAmount The accumulatedAmount to set. */ public void setAccumulatedAmount(KualiDecimal accumulatedAmount) { this.accumulatedAmount = accumulatedAmount; } /** * Gets the accumulatedPercent attribute. * * @return Returns the accumulatedPercent. */ public Integer getAccumulatedPercent() { return accumulatedPercent; } /** * Sets the accumulatedPercent attribute value. * * @param accumulatedPercent The accumulatedPercent to set. */ public void setAccumulatedPercent(Integer accumulatedPercent) { this.accumulatedPercent = accumulatedPercent; } /** * calculate the payroll percentage based on the given information in payroll amount holder * * @param payrollAmountHolder the given payroll amount holder containing relating information */ public static void calculatePayrollPercent(PayrollAmountHolder payrollAmountHolder) { KualiDecimal totalAmount = payrollAmountHolder.getTotalAmount(); if (totalAmount.isZero()) { return; } KualiDecimal payrollAmount = payrollAmountHolder.getPayrollAmount(); KualiDecimal accumulatedAmount = payrollAmountHolder.getAccumulatedAmount(); accumulatedAmount = accumulatedAmount.add(payrollAmount); int accumulatedPercent = payrollAmountHolder.getAccumulatedPercent(); int quotientOne = Math.round(payrollAmount.multiply(HUNDRED_DOLLAR_AMOUNT).divide(totalAmount).floatValue()); accumulatedPercent = accumulatedPercent + quotientOne; int quotientTwo = Math.round(accumulatedAmount.multiply(HUNDRED_DOLLAR_AMOUNT).divide(totalAmount).floatValue()); quotientTwo = quotientTwo - accumulatedPercent; payrollAmountHolder.setAccumulatedAmount(accumulatedAmount); payrollAmountHolder.setAccumulatedPercent(accumulatedPercent + quotientTwo); payrollAmountHolder.setPayrollPercent(quotientOne + quotientTwo); } /** * recalculate the payroll amount based on the given total amount and effort percent * * @param totalPayrollAmount the given total amount * @param effortPercent the given effort percent * @return the payroll amount calculated from the given total amount and effort percent */ public static KualiDecimal recalculatePayrollAmount(KualiDecimal totalPayrollAmount, Integer effortPercent) { double amount = totalPayrollAmount.doubleValue() * effortPercent / HUNDRED_DOLLAR_AMOUNT.doubleValue(); return new KualiDecimal(amount); } /** * recalculate the effort percent based on the given total amount and payroll amount * * @param totalPayrollAmount the given total amount * @param payrollAmount the given payroll amount * @return the effort percent calculated from the given total amount and payroll amount */ public static Double recalculateEffortPercent(KualiDecimal totalPayrollAmount, KualiDecimal payrollAmount) { double percent = payrollAmount.doubleValue() * HUNDRED_DOLLAR_AMOUNT.doubleValue() / totalPayrollAmount.doubleValue(); return percent; } /** * recalculate the effort percent based on the given total amount and payroll amount and return it as of type String * * @param totalPayrollAmount the given total amount * @param payrollAmount the given payroll amount * @return the effort percent as String calculated from the given total amount and payroll amount */ public static String recalculateEffortPercentAsString(KualiDecimal totalPayrollAmount, KualiDecimal payrollAmount) { double actualPercentAsDouble = 0; if (totalPayrollAmount.isNonZero()) { actualPercentAsDouble = recalculateEffortPercent(totalPayrollAmount, payrollAmount); } return String.format("%.4f%s", actualPercentAsDouble, KFSConstants.PERCENTAGE_SIGN); } }