001 /* 002 * Copyright 2011 The Kuali Foundation. 003 * 004 * Licensed under the Educational Community License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.opensource.org/licenses/ecl2.php 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 package org.kuali.kfs.module.bc.util; 017 018 import java.math.BigDecimal; 019 import java.util.ArrayList; 020 import java.util.List; 021 022 import org.kuali.kfs.module.bc.BCConstants; 023 import org.kuali.kfs.module.bc.businessobject.BudgetConstructionCalculatedSalaryFoundationTracker; 024 import org.kuali.kfs.module.bc.businessobject.PendingBudgetConstructionAppointmentFunding; 025 import org.kuali.kfs.sys.KFSConstants; 026 import org.kuali.rice.kns.util.KualiDecimal; 027 import org.kuali.rice.kns.util.KualiInteger; 028 029 public class SalarySettingCalculator { 030 private static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(SalarySettingCalculator.class); 031 032 /** 033 * calculate the standard working hours through the given time percent 034 * 035 * @param timePercent the given time percent 036 * @return the standard working hour calculated from the given time percent 037 */ 038 public static BigDecimal getStandarHours(BigDecimal timePercent) { 039 BigDecimal standarHours = timePercent.multiply(BudgetParameterFinder.getWeeklyWorkingHoursAsDecimal()).divide(BCConstants.ONE_HUNDRED, 2, KualiDecimal.ROUND_BEHAVIOR); 040 return standarHours; 041 } 042 043 /** 044 * calcaulte the total requested csf amount for the given appointment funding lines 045 * 046 * @param AppointmentFundings the given appointment funding lines 047 * @return the total requested csf amount for the given appointment funding lines 048 */ 049 public static KualiInteger getAppointmentRequestedCsfAmountTotal(List<PendingBudgetConstructionAppointmentFunding> AppointmentFundings) { 050 KualiInteger appointmentRequestedCsfAmountTotal = KualiInteger.ZERO; 051 052 for (PendingBudgetConstructionAppointmentFunding appointmentFunding : AppointmentFundings) { 053 KualiInteger requestedCsfAmount = appointmentFunding.getAppointmentRequestedCsfAmount(); 054 055 if (requestedCsfAmount != null) { 056 appointmentRequestedCsfAmountTotal = appointmentRequestedCsfAmountTotal.add(requestedCsfAmount); 057 } 058 } 059 060 return appointmentRequestedCsfAmountTotal; 061 } 062 063 /** 064 * calcaulte the total requested csf time percent for the given appointment funding lines 065 * 066 * @param AppointmentFundings the given appointment funding lines 067 * @return the total requested csf time percent for the given appointment funding lines 068 */ 069 public static BigDecimal getAppointmentRequestedCsfTimePercentTotal(List<PendingBudgetConstructionAppointmentFunding> AppointmentFundings) { 070 BigDecimal appointmentRequestedCsfTimePercentTotal = BigDecimal.ZERO; 071 072 for (PendingBudgetConstructionAppointmentFunding appointmentFunding : AppointmentFundings) { 073 BigDecimal requestedCsfTimePercent = appointmentFunding.getAppointmentRequestedCsfTimePercent(); 074 075 if (requestedCsfTimePercent != null) { 076 appointmentRequestedCsfTimePercentTotal = appointmentRequestedCsfTimePercentTotal.add(requestedCsfTimePercent); 077 } 078 } 079 080 return appointmentRequestedCsfTimePercentTotal; 081 } 082 083 /** 084 * calcaulte the total requested csf standard hours for the given appointment funding lines 085 * 086 * @param AppointmentFundings the given appointment funding lines 087 * @return the total requested csf standard hours for the given appointment funding lines 088 */ 089 public static BigDecimal getAppointmentRequestedCsfStandardHoursTotal(List<PendingBudgetConstructionAppointmentFunding> AppointmentFundings) { 090 return getStandarHours(getAppointmentRequestedCsfTimePercentTotal(AppointmentFundings)); 091 } 092 093 /** 094 * calcaulte the total requested csf full time employee quantity for the given appointment funding lines 095 * 096 * @param AppointmentFundings the given appointment funding lines 097 * @return the total requested csf full time employee quantity for the given appointment funding lines 098 */ 099 public static BigDecimal getAppointmentRequestedCsfFteQuantityTotal(List<PendingBudgetConstructionAppointmentFunding> AppointmentFundings) { 100 BigDecimal appointmentRequestedCsfFteQuantityTotal = BigDecimal.ZERO; 101 102 for (PendingBudgetConstructionAppointmentFunding appointmentFunding : AppointmentFundings) { 103 BigDecimal requestedCsfFteQuantity = appointmentFunding.getAppointmentRequestedCsfFteQuantity(); 104 105 if (requestedCsfFteQuantity != null) { 106 appointmentRequestedCsfFteQuantityTotal = appointmentRequestedCsfFteQuantityTotal.add(requestedCsfFteQuantity); 107 } 108 } 109 110 return appointmentRequestedCsfFteQuantityTotal; 111 } 112 113 /** 114 * calcaulte the total requested amount for the given appointment funding lines 115 * 116 * @param AppointmentFundings the given appointment funding lines 117 * @return the total requested amount for the given appointment funding lines 118 */ 119 public static KualiInteger getAppointmentRequestedAmountTotal(List<PendingBudgetConstructionAppointmentFunding> AppointmentFundings) { 120 KualiInteger appointmentRequestedAmountTotal = KualiInteger.ZERO; 121 122 for (PendingBudgetConstructionAppointmentFunding appointmentFunding : AppointmentFundings) { 123 KualiInteger requestedAmount = appointmentFunding.getAppointmentRequestedAmount(); 124 125 if (requestedAmount != null) { 126 appointmentRequestedAmountTotal = appointmentRequestedAmountTotal.add(requestedAmount); 127 } 128 } 129 return appointmentRequestedAmountTotal; 130 } 131 132 /** 133 * calcaulte the total requested time percent for the given appointment funding lines 134 * 135 * @param AppointmentFundings the given appointment funding lines 136 * @return the total requested time percent for the given appointment funding lines 137 */ 138 public static BigDecimal getAppointmentRequestedTimePercentTotal(List<PendingBudgetConstructionAppointmentFunding> AppointmentFundings) { 139 BigDecimal appointmentRequestedTimePercentTotal = BigDecimal.ZERO; 140 141 for (PendingBudgetConstructionAppointmentFunding appointmentFunding : AppointmentFundings) { 142 BigDecimal requestedTimePercent = appointmentFunding.getAppointmentRequestedTimePercent(); 143 144 if (requestedTimePercent != null) { 145 appointmentRequestedTimePercentTotal = appointmentRequestedTimePercentTotal.add(requestedTimePercent); 146 } 147 } 148 return appointmentRequestedTimePercentTotal; 149 } 150 151 /** 152 * calcaulte the total requested standard hours for the given appointment funding lines 153 * 154 * @param AppointmentFundings the given appointment funding lines 155 * @return the total requested standard hours for the given appointment funding lines 156 */ 157 public static BigDecimal getAppointmentRequestedStandardHoursTotal(List<PendingBudgetConstructionAppointmentFunding> AppointmentFundings) { 158 return getStandarHours(getAppointmentRequestedTimePercentTotal(AppointmentFundings)); 159 } 160 161 /** 162 * calcaulte the total requested full time employee quantity for the given appointment funding lines 163 * 164 * @param AppointmentFundings the given appointment funding lines 165 * @return the total requested full time employee quantity for the given appointment funding lines 166 */ 167 public static BigDecimal getAppointmentRequestedFteQuantityTotal(List<PendingBudgetConstructionAppointmentFunding> AppointmentFundings) { 168 BigDecimal appointmentRequestedFteQuantityTotal = BigDecimal.ZERO; 169 170 for (PendingBudgetConstructionAppointmentFunding appointmentFunding : AppointmentFundings) { 171 BigDecimal requestedFteQuantity = appointmentFunding.getAppointmentRequestedFteQuantity(); 172 173 if (requestedFteQuantity != null) { 174 appointmentRequestedFteQuantityTotal = appointmentRequestedFteQuantityTotal.add(requestedFteQuantity); 175 } 176 } 177 return appointmentRequestedFteQuantityTotal; 178 } 179 180 /** 181 * calcaulte the total csf amount for the given appointment funding lines 182 * 183 * @param AppointmentFundings the given appointment funding lines 184 * @return the total csf amount for the given appointment funding lines 185 */ 186 public static KualiInteger getCsfAmountTotal(List<PendingBudgetConstructionAppointmentFunding> AppointmentFundings) { 187 KualiInteger csfAmountTotal = KualiInteger.ZERO; 188 189 for (PendingBudgetConstructionAppointmentFunding appointmentFunding : AppointmentFundings) { 190 BudgetConstructionCalculatedSalaryFoundationTracker csfTracker = appointmentFunding.getEffectiveCSFTracker(); 191 192 if (csfTracker != null && csfTracker.getCsfAmount() != null) { 193 csfAmountTotal = csfAmountTotal.add(csfTracker.getCsfAmount()); 194 } 195 } 196 return csfAmountTotal; 197 } 198 199 /** 200 * calcaulte the total csf time percent for the given appointment funding lines 201 * 202 * @param AppointmentFundings the given appointment funding lines 203 * @return the total csf time percent for the given appointment funding lines 204 */ 205 public static BigDecimal getCsfTimePercentTotal(List<PendingBudgetConstructionAppointmentFunding> AppointmentFundings) { 206 BigDecimal csfTimePercentTotal = BigDecimal.ZERO; 207 208 for (PendingBudgetConstructionAppointmentFunding appointmentFunding : AppointmentFundings) { 209 BudgetConstructionCalculatedSalaryFoundationTracker csfTracker = appointmentFunding.getEffectiveCSFTracker(); 210 211 if (csfTracker != null && csfTracker.getCsfTimePercent() != null) { 212 csfTimePercentTotal = csfTimePercentTotal.add(csfTracker.getCsfTimePercent()); 213 } 214 } 215 return csfTimePercentTotal; 216 } 217 218 /** 219 * calcaulte the total csf standard hours for the given appointment funding lines 220 * 221 * @param AppointmentFundings the given appointment funding lines 222 * @return the total csf standard hours for the given appointment funding lines 223 */ 224 public static BigDecimal getCsfStandardHoursTotal(List<PendingBudgetConstructionAppointmentFunding> AppointmentFundings) { 225 return getStandarHours(getCsfTimePercentTotal(AppointmentFundings)); 226 } 227 228 /** 229 * calcaulte the total csf full time employee quantity for the given appointment funding lines 230 * 231 * @param AppointmentFundings the given appointment funding lines 232 * @return the total csf full time employee quantity for the given appointment funding lines 233 */ 234 public static BigDecimal getCsfFullTimeEmploymentQuantityTotal(List<PendingBudgetConstructionAppointmentFunding> AppointmentFundings) { 235 BigDecimal csfFullTimeEmploymentQuantityTotal = BigDecimal.ZERO; 236 237 for (PendingBudgetConstructionAppointmentFunding appointmentFunding : AppointmentFundings) { 238 BudgetConstructionCalculatedSalaryFoundationTracker csfTracker = appointmentFunding.getEffectiveCSFTracker(); 239 240 if (csfTracker != null && csfTracker.getCsfFullTimeEmploymentQuantity() != null) { 241 csfFullTimeEmploymentQuantityTotal = csfFullTimeEmploymentQuantityTotal.add(csfTracker.getCsfFullTimeEmploymentQuantity()); 242 } 243 } 244 return csfFullTimeEmploymentQuantityTotal; 245 } 246 247 /** 248 * Get a collection of PendingBudgetConstructionAppointmentFunding objects that are not purged and not excluded from total. This 249 * is used to decide whether or not to include csf, request or requestCsf amounts in the totals. This allows marked deleted line 250 * in the set, but this is benign since marked deleted lines have zero request and requestCsf amounts by definition and we want 251 * marked delete csf amounts included in the totals. 252 * 253 * @param AppointmentFundings the given appointment funding lines 254 * @return a collection of PendingBudgetConstructionAppointmentFunding objects that are not marked as deleted 255 */ 256 public static List<PendingBudgetConstructionAppointmentFunding> getEffectiveAppointmentFundings(List<PendingBudgetConstructionAppointmentFunding> AppointmentFundings) { 257 List<PendingBudgetConstructionAppointmentFunding> effectiveAppointmentFundings = new ArrayList<PendingBudgetConstructionAppointmentFunding>(); 258 259 for (PendingBudgetConstructionAppointmentFunding appointmentFunding : AppointmentFundings) { 260 // if (!appointmentFunding.isAppointmentFundingDeleteIndicator() && !appointmentFunding.isExcludedFromTotal() && 261 // !appointmentFunding.isPurged()) { 262 if (!appointmentFunding.isExcludedFromTotal() && !appointmentFunding.isPurged()) { 263 effectiveAppointmentFundings.add(appointmentFunding); 264 } 265 } 266 267 return effectiveAppointmentFundings; 268 } 269 270 /** 271 * calculate the changing percent between the requested amount and the base amount 272 * 273 * @param baseAmount the given base amount 274 * @param requestedAmount the requested amount 275 * @return the changing percent between the requested amount and the base amount if both of amounts are numbers; otherwise, 276 * return null 277 */ 278 public static KualiDecimal getPercentChange(KualiInteger baseAmount, KualiInteger requestedAmount) { 279 KualiDecimal percentChange = null; 280 281 if (requestedAmount != null && baseAmount != null && baseAmount.isNonZero()) { 282 KualiInteger difference = requestedAmount.subtract(baseAmount); 283 BigDecimal percentChangeAsBigDecimal = difference.multiply(KFSConstants.ONE_HUNDRED).divide(baseAmount); 284 285 percentChange = new KualiDecimal(percentChangeAsBigDecimal); 286 } 287 288 return percentChange; 289 } 290 }