001 /** 002 * Copyright 2004-2013 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.hr.lm.leavepayout.service; 017 018 import static org.junit.Assert.*; 019 020 import java.math.BigDecimal; 021 import java.util.ArrayList; 022 import java.util.Date; 023 import java.util.List; 024 import java.util.Map; 025 import java.util.Map.Entry; 026 027 import org.apache.commons.lang.time.DateUtils; 028 import org.junit.After; 029 import org.junit.Before; 030 import org.junit.Test; 031 import org.kuali.hr.lm.LMConstants; 032 import org.kuali.hr.lm.accrual.AccrualCategoryRule; 033 import org.kuali.hr.lm.leavepayout.LeavePayout; 034 import org.kuali.hr.lm.employeeoverride.EmployeeOverride; 035 import org.kuali.hr.lm.leaveSummary.LeaveSummary; 036 import org.kuali.hr.lm.leaveSummary.LeaveSummaryRow; 037 import org.kuali.hr.lm.leaveblock.LeaveBlock; 038 import org.kuali.hr.lm.leavecalendar.LeaveCalendarDocument; 039 import org.kuali.hr.test.KPMETestCase; 040 import org.kuali.hr.time.calendar.CalendarEntries; 041 import org.kuali.hr.time.service.base.TkServiceLocator; 042 import org.kuali.hr.time.timesheet.TimesheetDocument; 043 import org.kuali.hr.time.util.TKUtils; 044 import org.kuali.rice.krad.util.ObjectUtils; 045 046 public class LeavePayoutServiceTest extends KPMETestCase { 047 048 /** 049 * Leave Calendar Document Test data 050 */ 051 private final String USER_ID = "testUser1"; 052 053 private LeaveCalendarDocument janLCD; 054 private CalendarEntries janEntry; 055 private LeaveCalendarDocument decLCD; 056 private CalendarEntries decEntry; 057 058 private Date janStart; 059 private Date janEnd; 060 private Date decStart; 061 private Date decEnd; 062 063 private final String JAN_ID = "5001"; 064 private final String DEC_ID = "5000"; 065 066 /** 067 * Timesheet Document Test Data; 068 */ 069 070 private final String TS_USER_ID = "testUser2"; 071 072 private TimesheetDocument endJanTSD; 073 private CalendarEntries endJanTSDEntry; 074 private TimesheetDocument midJanTSD; 075 private CalendarEntries midJanTSDEntry; 076 private TimesheetDocument endDecTSD; 077 private CalendarEntries endDecTSDEntry; 078 private TimesheetDocument midDecTSD; 079 private CalendarEntries midDecTSDEntry; 080 081 private Date midJanStart; 082 private Date midJanEnd; 083 private Date endDecStart; 084 private Date endDecEnd; 085 private Date midDecStart; 086 private Date midDecEnd; 087 088 private final String TSD_MID_DEC_PERIOD_ID = "5000"; 089 private final String TSD_END_DEC_PERIOD_ID = "5001"; 090 private final String TSD_MID_JAN_PERIOD_ID = "5002"; 091 private final String TSD_END_JAN_PERIOD_ID = "5003"; 092 093 /** 094 * Common data 095 */ 096 097 private final String OD_XFER = "5000"; 098 private final String YE_XFER = "5001"; 099 private final String LA_XFER = "5002"; 100 private final String OD_XFER_MAC = "5003"; 101 private final String YE_XFER_MAC = "5004"; 102 private final String LA_XFER_MAC = "5005"; 103 private final String OD_LOSE = "5006"; 104 private final String YE_LOSE = "5007"; 105 private final String LA_LOSE = "5008"; 106 private final String OD_LOSE_MAC = "5009"; 107 private final String YE_LOSE_MAC = "5010"; 108 private final String LA_LOSE_MAC = "5011"; 109 private final String YE_XFER_EO = "5012"; 110 private final java.sql.Date LM_FROM = TKUtils.formatDateString("11/01/2012"); 111 private final java.sql.Date LM_TO = TKUtils.formatDateString("02/01/2013"); 112 private final java.sql.Date TK_FROM = TKUtils.formatDateString("11/01/2011"); 113 private final java.sql.Date TK_TO = TKUtils.formatDateString("02/01/2012"); 114 115 @Before 116 public void setUp() throws Exception { 117 super.setUp(); 118 TkServiceLocator.getAccrualService().runAccrual(USER_ID,LM_FROM,LM_TO,true,USER_ID); 119 janLCD = TkServiceLocator.getLeaveCalendarService().getLeaveCalendarDocument(JAN_ID); 120 janEntry = janLCD.getCalendarEntry(); 121 janStart = janEntry.getBeginPeriodDate(); 122 janEnd = janEntry.getEndPeriodDate(); 123 decLCD = TkServiceLocator.getLeaveCalendarService().getLeaveCalendarDocument(DEC_ID); 124 decEntry = decLCD.getCalendarEntry(); 125 decStart = decEntry.getBeginPeriodDate(); 126 decEnd = decEntry.getEndPeriodDate(); 127 } 128 129 @After 130 public void tearDown() throws Exception { 131 super.tearDown(); 132 } 133 134 /***************************** 135 * Use-case specific testing * 136 ****************************/ 137 138 // 139 // ACTION_AT_MAX_BALANCE = TRANSFER 140 // 141 142 @Test 143 public void testInitializePayoutNullAccrualRule() throws Exception { 144 LeavePayout lp = new LeavePayout(); 145 146 java.sql.Date effectiveDate = new java.sql.Date(DateUtils.addDays(decStart,3).getTime()); 147 lp = TkServiceLocator.getLeavePayoutService().initializePayout(USER_ID, null, BigDecimal.ZERO, effectiveDate); 148 assertNull(lp); 149 } 150 151 @Test 152 public void testInitializePayoutNullLeaveSummary() throws Exception { 153 LeavePayout lp = new LeavePayout(); 154 155 lp = TkServiceLocator.getLeavePayoutService().initializePayout(USER_ID, OD_XFER, null, TKUtils.getCurrentDate()); 156 assertNull(lp); 157 } 158 159 @Test 160 public void testInitializePayoutNullAccrualRuleNullLeaveSummary() { 161 LeavePayout lp = new LeavePayout(); 162 lp = TkServiceLocator.getLeavePayoutService().initializePayout(USER_ID, null, null, TKUtils.getCurrentDate()); 163 assertNull(lp); 164 } 165 166 @Test 167 public void testInitializePayoutOnDemand() throws Exception { 168 LeavePayout lp = new LeavePayout(); 169 LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(USER_ID, decEntry); 170 LeaveSummaryRow aRow = summary.getLeaveSummaryRowForAccrualCategory(OD_XFER); 171 java.sql.Date effectiveDate = new java.sql.Date(DateUtils.addDays(decStart,3).getTime()); 172 lp = TkServiceLocator.getLeavePayoutService().initializePayout(USER_ID, OD_XFER, aRow.getAccruedBalance(), effectiveDate); 173 assertEquals("payoutOnDemand payout amount", (new BigDecimal(1)).longValue(), lp.getPayoutAmount().longValue()); 174 assertEquals("payoutOnDemand forfeited amount",(new BigDecimal(0)).longValue(), lp.getForfeitedAmount().longValue()); 175 ////assertEquals("payoutOnDemand amount payoutred", (new BigDecimal(0.5)).longValue(), lp.getAmountPayoutred().longValue()); 176 } 177 178 @Test 179 public void testInitializePayoutOnDemandWithForfeiture() throws Exception { 180 LeavePayout lp = new LeavePayout(); 181 LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(USER_ID, janEntry); 182 LeaveSummaryRow aRow = summary.getLeaveSummaryRowForAccrualCategory(OD_XFER); 183 java.sql.Date effectiveDate = new java.sql.Date(DateUtils.addDays(janStart,3).getTime()); 184 lp = TkServiceLocator.getLeavePayoutService().initializePayout(USER_ID, OD_XFER, aRow.getAccruedBalance(), effectiveDate); 185 assertEquals("payoutOnDemand payout amount", (new BigDecimal(10)).longValue(), lp.getPayoutAmount().longValue()); 186 assertEquals("payoutOnDemand forfeited amount", (new BigDecimal(7)).longValue(), lp.getForfeitedAmount().longValue()); 187 //assertEquals("payoutOnDemand amount payoutred", (new BigDecimal(5)).longValue(), lp.getAmountPayoutred().longValue()); 188 } 189 190 @Test 191 public void testInitializePayoutOnYearEnd() throws Exception { 192 LeavePayout lp = new LeavePayout(); 193 TkServiceLocator.getLeaveBlockService().deleteLeaveBlocksForDocumentId(DEC_ID); 194 LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(USER_ID, janEntry); 195 LeaveSummaryRow aRow = summary.getLeaveSummaryRowForAccrualCategory(YE_XFER); 196 java.sql.Date effectiveDate = new java.sql.Date(DateUtils.addDays(janStart,3).getTime()); 197 lp = TkServiceLocator.getLeavePayoutService().initializePayout(USER_ID, YE_XFER, aRow.getAccruedBalance(), effectiveDate); 198 assertEquals("payoutOnDemand payout amount", (new BigDecimal(1)).longValue(), lp.getPayoutAmount().longValue()); 199 assertEquals("payoutOnDemand forfeited amount",(new BigDecimal(0)).longValue(), lp.getForfeitedAmount().longValue()); 200 //assertEquals("payoutOnDemand amount payoutred", (new BigDecimal(0.5)).longValue(), lp.getAmountPayoutred().longValue()); 201 } 202 203 @Test 204 public void testInitializePayoutOnYearEndWithForfeiture() throws Exception { 205 LeavePayout lp = new LeavePayout(); 206 LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(USER_ID, janEntry); 207 LeaveSummaryRow aRow = summary.getLeaveSummaryRowForAccrualCategory(YE_XFER); 208 java.sql.Date effectiveDate = new java.sql.Date(DateUtils.addDays(janStart,3).getTime()); 209 lp = TkServiceLocator.getLeavePayoutService().initializePayout(USER_ID, YE_XFER, aRow.getAccruedBalance(), effectiveDate); 210 assertEquals("payoutOnDemand payout amount", (new BigDecimal(10)).longValue(), lp.getPayoutAmount().longValue()); 211 assertEquals("payoutOnDemand forfeited amount", (new BigDecimal(7)).longValue(), lp.getForfeitedAmount().longValue()); 212 //assertEquals("payoutOnDemand amount payoutred", (new BigDecimal(5)).longValue(), lp.getAmountPayoutred().longValue()); 213 } 214 215 @Test 216 public void testInitializePayoutOnLeaveApprove() throws Exception { 217 LeavePayout lp = new LeavePayout(); 218 LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(USER_ID, decEntry); 219 LeaveSummaryRow aRow = summary.getLeaveSummaryRowForAccrualCategory(LA_XFER); 220 java.sql.Date effectiveDate = new java.sql.Date(DateUtils.addDays(decStart,3).getTime()); 221 lp = TkServiceLocator.getLeavePayoutService().initializePayout(USER_ID, LA_XFER, aRow.getAccruedBalance(), effectiveDate); 222 assertEquals("payoutOnDemand payout amount", (new BigDecimal(1)).longValue(), lp.getPayoutAmount().longValue()); 223 assertEquals("payoutOnDemand forfeited amount",(new BigDecimal(0)).longValue(), lp.getForfeitedAmount().longValue()); 224 //assertEquals("payoutOnDemand amount payoutred", (new BigDecimal(0.5)).longValue(), lp.getAmountPayoutred().longValue()); 225 } 226 227 @Test 228 public void testInitializePayoutOnLeaveApproveWithForfeiture() throws Exception { 229 LeavePayout lp = new LeavePayout(); 230 LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(USER_ID, janEntry); 231 LeaveSummaryRow aRow = summary.getLeaveSummaryRowForAccrualCategory(LA_XFER); 232 java.sql.Date effectiveDate = new java.sql.Date(DateUtils.addDays(janStart,3).getTime()); 233 lp = TkServiceLocator.getLeavePayoutService().initializePayout(USER_ID, LA_XFER, aRow.getAccruedBalance(), effectiveDate); 234 assertEquals("payoutOnDemand payout amount", (new BigDecimal(10)).longValue(), lp.getPayoutAmount().longValue()); 235 assertEquals("payoutOnDemand forfeited amount", (new BigDecimal(7)).longValue(), lp.getForfeitedAmount().longValue()); 236 //assertEquals("payoutOnDemand amount payoutred", (new BigDecimal(5)).longValue(), lp.getAmountPayoutred().longValue()); 237 } 238 239 @Test 240 public void testInitializePayoutOnDemandMaxCarryOver() throws Exception { 241 //N/A - Max Carry Over on Year End payouts. 242 LeavePayout lp = new LeavePayout(); 243 LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(USER_ID, decEntry); 244 LeaveSummaryRow aRow = summary.getLeaveSummaryRowForAccrualCategory(OD_XFER_MAC); 245 java.sql.Date effectiveDate = new java.sql.Date(DateUtils.addDays(decStart,3).getTime()); 246 lp = TkServiceLocator.getLeavePayoutService().initializePayout(USER_ID, OD_XFER_MAC, aRow.getAccruedBalance(), effectiveDate); 247 assertEquals("payoutOnDemand payout amount", (new BigDecimal(1)).longValue(), lp.getPayoutAmount().longValue()); 248 assertEquals("payoutOnDemand forfeited amount",(new BigDecimal(0)).longValue(), lp.getForfeitedAmount().longValue()); 249 //assertEquals("payoutOnDemand amount payoutred", (new BigDecimal(0.5)).longValue(), lp.getAmountPayoutred().longValue()); 250 } 251 252 @Test 253 public void testInitializePayoutOnYearEndMaxCarryOver() throws Exception { 254 /** 255 * decEntry is not the last calendar entry in the leave plan. Want to check amounts for this action & action frequency 256 * without exceeding the payout limit. 257 * 258 * max payout amount = 10 259 * leave balance = 16 260 * max balance = 15 261 * max carry over = 10 262 * 263 * all excess should be payoutrable. 1 unit of time for excess over max balance, 5 units of time for 264 * excess over max carry over. 265 * 266 */ 267 LeavePayout lp = new LeavePayout(); 268 LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(USER_ID, decEntry); 269 LeaveSummaryRow aRow = summary.getLeaveSummaryRowForAccrualCategory(YE_XFER_MAC); 270 java.sql.Date effectiveDate = new java.sql.Date(DateUtils.addDays(decStart,3).getTime()); 271 lp = TkServiceLocator.getLeavePayoutService().initializePayout(USER_ID, YE_XFER_MAC, aRow.getAccruedBalance(), effectiveDate); 272 assertEquals("payoutOnDemand payout amount", (new BigDecimal(6)).longValue(), lp.getPayoutAmount().longValue()); 273 assertEquals("payoutOnDemand forfeited amount", (new BigDecimal(0)).longValue(), lp.getForfeitedAmount().longValue()); 274 //assertEquals("payoutOnDemand amount payoutred", (new BigDecimal(3)).longValue(), lp.getAmountPayoutred().longValue()); 275 } 276 277 /* @Test 278 public void testInitializePayoutUnderMaxBalanceOnYearEndMaxCarryOver() throws Exception { 279 //Create a leave block that will bring the available balance for january down to 14. 280 //this balance would be under the max available balance (15), but over the max annual carry over amount. 281 //i.o.w., this payout would not due to max balance limit, but max annual carry over. 282 //could also simply change the accrual amount. 283 LeaveBlock usage = new LeaveBlock(); 284 usage.setAccrualCategory(YE_XFER_MAC); 285 usage.setLeaveDate(new java.sql.Date(DateUtils.addDays(janStart,5).getTime())); 286 usage.setLeaveAmount(new BigDecimal(-18)); 287 usage.setPrincipalId(USER_ID); 288 usage.setAccrualGenerated(false); 289 usage.setRequestStatus(LMConstants.REQUEST_STATUS.APPROVED); 290 usage.setDocumentId(janLCD.getDocumentId()); 291 usage.setLmLeaveBlockId("99999"); 292 usage.setEarnCode("EC5"); 293 usage.setBlockId(0L); 294 usage.setLeaveBlockType(LMConstants.LEAVE_BLOCK_TYPE.LEAVE_CALENDAR); 295 List<LeaveBlock> leaveBlocks = new ArrayList<LeaveBlock>(); 296 leaveBlocks.add(usage); 297 TkServiceLocator.getLeaveBlockService().saveLeaveBlocks(leaveBlocks); 298 299 LeavePayout lp = new LeavePayout(); 300 janLCD = TkServiceLocator.getLeaveCalendarService().getLeaveCalendarDocument(JAN_ID); 301 LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(USER_ID, janLCD.getCalendarEntry()); 302 java.sql.Date effectiveDate = new java.sql.Date(DateUtils.addDays(janStart,3).getTime()); 303 lp = TkServiceLocator.getLeavePayoutService().initializePayout(USER_ID, YE_XFER_MAC, aRow.getAccruedBalance(), effectiveDate); 304 assertEquals("payoutOnDemand payout amount", (new BigDecimal(4)).longValue(), lp.getPayoutAmount().longValue()); 305 assertEquals("payoutOnDemand forfeited amount", (new BigDecimal(0)).longValue(), lp.getForfeitedAmount().longValue()); 306 //assertEquals("payoutOnDemand amount payoutred", (new BigDecimal(2)).longValue(), lp.getAmountPayoutred().longValue()); 307 }*/ 308 309 @Test 310 public void testInitializePayoutOnYearEndMaxCarryOverWithForfeiture() throws Exception { 311 //max bal limit reached and max annual carry over triggererd. 312 LeavePayout lp = new LeavePayout(); 313 LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(USER_ID, janEntry); 314 LeaveSummaryRow aRow = summary.getLeaveSummaryRowForAccrualCategory(YE_XFER_MAC); 315 java.sql.Date effectiveDate = new java.sql.Date(DateUtils.addDays(janStart,3).getTime()); 316 lp = TkServiceLocator.getLeavePayoutService().initializePayout(USER_ID, YE_XFER_MAC, aRow.getAccruedBalance(), effectiveDate); 317 assertEquals("payoutOnDemand payout amount", (new BigDecimal(10)).longValue(), lp.getPayoutAmount().longValue()); 318 assertEquals("payoutOnDemand forfeited amount", (new BigDecimal(12)).longValue(), lp.getForfeitedAmount().longValue()); 319 //assertEquals("payoutOnDemand amount payoutred", (new BigDecimal(5)).longValue(), lp.getAmountPayoutred().longValue()); 320 } 321 322 @Test 323 public void testInitializePayoutOnLeaveApproveMaxCarryOver() throws Exception { 324 LeavePayout lp = new LeavePayout(); 325 LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(USER_ID, decEntry); 326 LeaveSummaryRow aRow = summary.getLeaveSummaryRowForAccrualCategory(LA_XFER_MAC); 327 java.sql.Date effectiveDate = new java.sql.Date(DateUtils.addDays(decStart,3).getTime()); 328 lp = TkServiceLocator.getLeavePayoutService().initializePayout(USER_ID, LA_XFER_MAC, aRow.getAccruedBalance(), effectiveDate); 329 assertEquals("payoutOnDemand payout amount", (new BigDecimal(1)).longValue(), lp.getPayoutAmount().longValue()); 330 assertEquals("payoutOnDemand forfeited amount",(new BigDecimal(0)).longValue(), lp.getForfeitedAmount().longValue()); 331 //assertEquals("payoutOnDemand amount payoutred", (new BigDecimal(0.5)).longValue(), lp.getAmountPayoutred().longValue()); 332 } 333 334 @Test 335 public void testInitializePayoutWithOverrides() throws Exception { 336 LeavePayout lp = new LeavePayout(); 337 LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(USER_ID, janEntry); 338 LeaveSummaryRow aRow = summary.getLeaveSummaryRowForAccrualCategory(YE_XFER_EO); 339 java.sql.Date effectiveDate = new java.sql.Date(DateUtils.addDays(janStart,3).getTime()); 340 lp = TkServiceLocator.getLeavePayoutService().initializePayout(USER_ID, YE_XFER_EO, aRow.getAccruedBalance(), effectiveDate); 341 assertEquals("payoutOnDemand payout amount", (new BigDecimal(7)).longValue(), lp.getPayoutAmount().longValue()); 342 assertEquals("payoutOnDemand forfeited amount",(new BigDecimal(20)).longValue(), lp.getForfeitedAmount().longValue()); 343 // max balance payout conversion factor is undefined for YE_XFER_EO 344 //assertEquals("payoutOnDemand amount payoutred", (new BigDecimal(7)).longValue(), lp.getAmountPayoutred().longValue()); 345 } 346 /** 347 * End Use-case testing 348 */ 349 350 @Test 351 public void testPayoutNullLeavePayout() { 352 LeavePayout LeavePayout = null; 353 try { 354 LeavePayout = TkServiceLocator.getLeavePayoutService().payout(LeavePayout); 355 } catch (RuntimeException re) { 356 assertTrue(re.getMessage().contains("did not supply a valid LeavePayout object")); 357 } 358 } 359 360 @Test 361 public void testPayoutWithZeroPayoutAmount() throws Exception { 362 LeavePayout lp = new LeavePayout(); 363 LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(USER_ID, janEntry); 364 LeaveSummaryRow aRow = summary.getLeaveSummaryRowForAccrualCategory(YE_LOSE); 365 java.sql.Date effectiveDate = new java.sql.Date(DateUtils.addDays(janStart,3).getTime()); 366 //lp = TkServiceLocator.getLeavePayoutService().initializePayout(USER_ID, YE_LOSE, aRow.getAccruedBalance(), effectiveDate); 367 lp.setPayoutAmount(BigDecimal.ZERO); 368 lp = TkServiceLocator.getLeavePayoutService().payout(lp); 369 LeaveBlock forfeitedLeaveBlock = TkServiceLocator.getLeaveBlockService().getLeaveBlock(lp.getForfeitedLeaveBlockId()); 370 LeaveBlock payoutLeaveBlock = TkServiceLocator.getLeaveBlockService().getLeaveBlock(lp.getPayoutLeaveBlockId()); 371 LeaveBlock payoutFromLeaveBlock = TkServiceLocator.getLeaveBlockService().getLeaveBlock(lp.getPayoutFromLeaveBlockId()); 372 assertTrue("forfeited leave block should not exist", ObjectUtils.isNull(forfeitedLeaveBlock)); 373 assertTrue("accrued leave block should not exist",ObjectUtils.isNull(payoutLeaveBlock)); 374 assertTrue("debited leave block should not exist",ObjectUtils.isNull(payoutFromLeaveBlock)); 375 } 376 377 @Test 378 public void testPayoutWithZeroForfeiture() throws Exception { 379 LeavePayout lp = new LeavePayout(); 380 LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(USER_ID, decEntry); 381 LeaveSummaryRow aRow = summary.getLeaveSummaryRowForAccrualCategory(OD_XFER); 382 java.sql.Date effectiveDate = new java.sql.Date(DateUtils.addDays(decStart,3).getTime()); 383 lp = TkServiceLocator.getLeavePayoutService().initializePayout(USER_ID, OD_XFER, aRow.getAccruedBalance(), effectiveDate); 384 lp = TkServiceLocator.getLeavePayoutService().payout(lp); 385 LeaveBlock forfeitedLeaveBlock = TkServiceLocator.getLeaveBlockService().getLeaveBlock(lp.getForfeitedLeaveBlockId()); 386 LeaveBlock payoutLeaveBlock = TkServiceLocator.getLeaveBlockService().getLeaveBlock(lp.getPayoutLeaveBlockId()); 387 LeaveBlock payoutFromLeaveBlock = TkServiceLocator.getLeaveBlockService().getLeaveBlock(lp.getPayoutFromLeaveBlockId()); 388 assertEquals("accrued leave block leave amount incorrect", (new BigDecimal(1)).longValue(), payoutLeaveBlock.getLeaveAmount().longValue()); 389 assertTrue("forfeited leave block should not exist",ObjectUtils.isNull(forfeitedLeaveBlock)); 390 assertEquals("payouted leave block leave amount incorrect", (new BigDecimal(-1)).longValue(), payoutFromLeaveBlock.getLeaveAmount().longValue()); 391 } 392 393 @Test 394 public void testPayoutWithThreeLeaveBlocks() throws Exception { 395 LeavePayout lp = new LeavePayout(); 396 LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(USER_ID, janEntry); 397 LeaveSummaryRow aRow = summary.getLeaveSummaryRowForAccrualCategory(YE_XFER); 398 java.sql.Date effectiveDate = new java.sql.Date(DateUtils.addDays(janStart,3).getTime()); 399 lp = TkServiceLocator.getLeavePayoutService().initializePayout(USER_ID, YE_XFER, aRow.getAccruedBalance(), effectiveDate); 400 lp = TkServiceLocator.getLeavePayoutService().payout(lp); 401 LeaveBlock forfeitedLeaveBlock = TkServiceLocator.getLeaveBlockService().getLeaveBlock(lp.getForfeitedLeaveBlockId()); 402 LeaveBlock payoutLeaveBlock = TkServiceLocator.getLeaveBlockService().getLeaveBlock(lp.getPayoutLeaveBlockId()); 403 LeaveBlock payoutFromLeaveBlock = TkServiceLocator.getLeaveBlockService().getLeaveBlock(lp.getPayoutFromLeaveBlockId()); 404 assertEquals("forfeited leave block leave amount incorrect", (new BigDecimal(-7)).longValue(), forfeitedLeaveBlock.getLeaveAmount().longValue()); 405 assertEquals((new BigDecimal(10)).longValue(), payoutLeaveBlock.getLeaveAmount().longValue()); 406 assertEquals((new BigDecimal(-10)).longValue(), payoutFromLeaveBlock.getLeaveAmount().longValue()); 407 } 408 409 //TODO: write tests for adjusted max balance cases - i.e. FTE < 1, employee override's w/ type MAX_BALANCE 410 411 @Test 412 public void testgetEligiblePayoutsLeaveApprove() throws Exception { 413 Map<String, ArrayList<String>> eligiblePayouts = TkServiceLocator.getLeavePayoutService().getEligiblePayouts(janEntry, USER_ID); 414 assertEquals(2, eligiblePayouts.get(LMConstants.MAX_BAL_ACTION_FREQ.LEAVE_APPROVE).size()); 415 assertEquals(3, eligiblePayouts.get(LMConstants.MAX_BAL_ACTION_FREQ.YEAR_END).size()); 416 assertEquals(2, eligiblePayouts.get(LMConstants.MAX_BAL_ACTION_FREQ.ON_DEMAND).size()); 417 List<AccrualCategoryRule> rules = new ArrayList<AccrualCategoryRule>(); 418 for(String eligiblePayout : eligiblePayouts.get(LMConstants.MAX_BAL_ACTION_FREQ.LEAVE_APPROVE)) 419 rules.add(TkServiceLocator.getAccrualCategoryRuleService().getAccrualCategoryRule(eligiblePayout)); 420 421 LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(USER_ID, janEntry); 422 for(AccrualCategoryRule aRule : rules) { 423 LeaveSummaryRow row = summary.getLeaveSummaryRowForAccrualCategory(aRule.getLmAccrualCategoryId()); 424 assertNotNull("eligible accrual category has no balance limit",ObjectUtils.isNotNull(aRule.getMaxBalance())); 425 assertTrue("accrual category not eligible for payout",row.getAccruedBalance().compareTo(aRule.getMaxBalance()) > 0); 426 } 427 } 428 429 @Test 430 public void testgetEligiblePayoutsYearEnd() throws Exception { 431 Map<String, ArrayList<String>> eligiblePayouts = TkServiceLocator.getLeavePayoutService().getEligiblePayouts(janEntry, USER_ID); 432 assertEquals(2, eligiblePayouts.get(LMConstants.MAX_BAL_ACTION_FREQ.LEAVE_APPROVE).size()); 433 assertEquals(3, eligiblePayouts.get(LMConstants.MAX_BAL_ACTION_FREQ.YEAR_END).size()); 434 assertEquals(2, eligiblePayouts.get(LMConstants.MAX_BAL_ACTION_FREQ.ON_DEMAND).size()); 435 List<AccrualCategoryRule> rules = new ArrayList<AccrualCategoryRule>(); 436 for(String eligiblePayout : eligiblePayouts.get(LMConstants.MAX_BAL_ACTION_FREQ.YEAR_END)) 437 rules.add(TkServiceLocator.getAccrualCategoryRuleService().getAccrualCategoryRule(eligiblePayout)); 438 439 // Set should contain an accrual category whose rule's max balance is trumped by an employee override. 440 // Comparing accrued balance to a rule's defined max balance is insufficient for testing 441 // whether or not an accrual category is indeed over it's balance limit. Same can be said for FTE-proration. 442 LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(USER_ID, janEntry); 443 for(AccrualCategoryRule aRule : rules) { 444 LeaveSummaryRow row = summary.getLeaveSummaryRowForAccrualCategory(aRule.getLmAccrualCategoryId()); 445 BigDecimal maxBalance = aRule.getMaxBalance(); 446 EmployeeOverride mbOverride = TkServiceLocator.getEmployeeOverrideService().getEmployeeOverride(USER_ID, 447 "testLP", 448 row.getAccrualCategory(), 449 "MB", 450 janEntry.getBeginPeriodDate()); 451 if(ObjectUtils.isNotNull(mbOverride)) 452 maxBalance = new BigDecimal(mbOverride.getOverrideValue()); 453 assertNotNull("eligible accrual category has no balance limit",maxBalance); 454 assertTrue("accrual category not eligible for payout",row.getAccruedBalance().compareTo(maxBalance) > 0); 455 } 456 } 457 458 @Test 459 public void testgetEligiblePayoutsOnDemand() throws Exception { 460 Map<String, ArrayList<String>> eligiblePayouts = TkServiceLocator.getLeavePayoutService().getEligiblePayouts(janEntry, USER_ID); 461 assertEquals(2, eligiblePayouts.get(LMConstants.MAX_BAL_ACTION_FREQ.LEAVE_APPROVE).size()); 462 assertEquals(3, eligiblePayouts.get(LMConstants.MAX_BAL_ACTION_FREQ.YEAR_END).size()); 463 assertEquals(2, eligiblePayouts.get(LMConstants.MAX_BAL_ACTION_FREQ.ON_DEMAND).size()); 464 List<AccrualCategoryRule> rules = new ArrayList<AccrualCategoryRule>(); 465 for(String eligiblePayout : eligiblePayouts.get(LMConstants.MAX_BAL_ACTION_FREQ.ON_DEMAND)) 466 rules.add(TkServiceLocator.getAccrualCategoryRuleService().getAccrualCategoryRule(eligiblePayout)); 467 468 LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(USER_ID, janEntry); 469 for(AccrualCategoryRule aRule : rules) { 470 LeaveSummaryRow row = summary.getLeaveSummaryRowForAccrualCategory(aRule.getLmAccrualCategoryId()); 471 assertNotNull("eligible accrual category has no balance limit",ObjectUtils.isNotNull(aRule.getMaxBalance())); 472 assertTrue("accrual category not eligible for payout",row.getAccruedBalance().compareTo(aRule.getMaxBalance()) > 0); 473 } 474 } 475 476 @Test 477 public void testgetEligiblePayoutsOnYearEndCaseOne() throws Exception { 478 //calendar entry is not the last calendar entry of the leave plan's calendar year. 479 Map<String, ArrayList<String>> eligiblePayouts = TkServiceLocator.getLeavePayoutService().getEligiblePayouts(decEntry, USER_ID); 480 assertEquals(2, eligiblePayouts.get(LMConstants.MAX_BAL_ACTION_FREQ.LEAVE_APPROVE).size()); 481 assertEquals(0, eligiblePayouts.get(LMConstants.MAX_BAL_ACTION_FREQ.YEAR_END).size()); 482 assertEquals(2, eligiblePayouts.get(LMConstants.MAX_BAL_ACTION_FREQ.ON_DEMAND).size()); 483 List<AccrualCategoryRule> rules = new ArrayList<AccrualCategoryRule>(); 484 for(String eligiblePayout : eligiblePayouts.get(LMConstants.MAX_BAL_ACTION_FREQ.YEAR_END)) 485 rules.add(TkServiceLocator.getAccrualCategoryRuleService().getAccrualCategoryRule(eligiblePayout)); 486 487 LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(USER_ID, decEntry); 488 for(AccrualCategoryRule aRule : rules) { 489 LeaveSummaryRow row = summary.getLeaveSummaryRowForAccrualCategory(aRule.getLmAccrualCategoryId()); 490 assertNotNull("eligible accrual category has no balance limit",ObjectUtils.isNotNull(aRule.getMaxBalance())); 491 assertTrue("accrual category not eligible for payout",row.getAccruedBalance().compareTo(aRule.getMaxBalance()) > 0); 492 } 493 } 494 495 @Test 496 public void testgetEligiblePayoutsOnYearEndCaseTwo() throws Exception { 497 //calendar entry is the last calendar entry of the leave plan's calendar year. 498 Map<String, ArrayList<String>> eligiblePayouts = TkServiceLocator.getLeavePayoutService().getEligiblePayouts(janEntry, USER_ID); 499 assertEquals(2, eligiblePayouts.get(LMConstants.MAX_BAL_ACTION_FREQ.LEAVE_APPROVE).size()); 500 assertEquals(3, eligiblePayouts.get(LMConstants.MAX_BAL_ACTION_FREQ.YEAR_END).size()); 501 assertEquals(2, eligiblePayouts.get(LMConstants.MAX_BAL_ACTION_FREQ.ON_DEMAND).size()); 502 List<AccrualCategoryRule> rules = new ArrayList<AccrualCategoryRule>(); 503 for(String eligiblePayout : eligiblePayouts.get(LMConstants.MAX_BAL_ACTION_FREQ.YEAR_END)) 504 rules.add(TkServiceLocator.getAccrualCategoryRuleService().getAccrualCategoryRule(eligiblePayout)); 505 506 LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(USER_ID, janEntry); 507 for(AccrualCategoryRule aRule : rules) { 508 LeaveSummaryRow row = summary.getLeaveSummaryRowForAccrualCategory(aRule.getLmAccrualCategoryId()); 509 BigDecimal maxBalance = aRule.getMaxBalance(); 510 EmployeeOverride mbOverride = TkServiceLocator.getEmployeeOverrideService().getEmployeeOverride(USER_ID, 511 "testLP", 512 row.getAccrualCategory(), 513 "MB", 514 janEntry.getBeginPeriodDate()); 515 EmployeeOverride macOverride = TkServiceLocator.getEmployeeOverrideService().getEmployeeOverride(USER_ID, 516 "testLP", 517 row.getAccrualCategory(), 518 "MAC", 519 janEntry.getBeginPeriodDate()); 520 if(ObjectUtils.isNotNull(mbOverride) && ObjectUtils.isNotNull(macOverride)) 521 maxBalance = new BigDecimal(Math.min(mbOverride.getOverrideValue(), macOverride.getOverrideValue())); 522 else { 523 if(ObjectUtils.isNotNull(macOverride)) 524 maxBalance = new BigDecimal(macOverride.getOverrideValue()); 525 if(ObjectUtils.isNotNull(mbOverride)) 526 maxBalance = new BigDecimal(mbOverride.getOverrideValue()); 527 } 528 assertNotNull("eligible accrual category has no balance limit",ObjectUtils.isNotNull(maxBalance)); 529 assertTrue("accrual category not eligible for payout",row.getAccruedBalance().compareTo(maxBalance) > 0); 530 } 531 } 532 533 @Test 534 public void testSubmitToWorkflow() { 535 assertNull(null); 536 } 537 538 /** 539 * 540 * TIMESHEET ELIGIBLE TESTS 541 * 542 */ 543 544 @Test 545 public void testgetEligiblePayoutsLeaveApproveForTimesheetCaseOne() throws Exception { 546 //Timesheet does not contain the leave calendar end period 547 TkServiceLocator.getAccrualService().runAccrual(TS_USER_ID,TK_FROM,TK_TO,true,TS_USER_ID); 548 midDecTSD = TkServiceLocator.getTimesheetService().getTimesheetDocument(TSD_MID_DEC_PERIOD_ID); 549 midDecTSDEntry = midDecTSD.getCalendarEntry(); 550 551 Map<String, ArrayList<String>> eligiblePayouts = TkServiceLocator.getLeavePayoutService().getEligiblePayouts(midDecTSDEntry, TS_USER_ID); 552 //Assert correct number of payout eligible for frequency 553 assertEquals(2, eligiblePayouts.get(LMConstants.MAX_BAL_ACTION_FREQ.LEAVE_APPROVE).size()); 554 555 //Assert that the accrual categories returned by BT service are in fact over their balance limit, 556 //according to their rules. - does not consider FTE. 557 List<AccrualCategoryRule> rules = new ArrayList<AccrualCategoryRule>(); 558 for(String eligiblePayout : eligiblePayouts.get(LMConstants.MAX_BAL_ACTION_FREQ.LEAVE_APPROVE)) 559 rules.add(TkServiceLocator.getAccrualCategoryRuleService().getAccrualCategoryRule(eligiblePayout)); 560 561 LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(TS_USER_ID, midDecTSDEntry); 562 for(AccrualCategoryRule aRule : rules) { 563 LeaveSummaryRow row = summary.getLeaveSummaryRowForAccrualCategory(aRule.getLmAccrualCategoryId()); 564 assertNotNull("eligible accrual category has no balance limit",ObjectUtils.isNotNull(aRule.getMaxBalance())); 565 assertTrue("accrual category not eligible for payout",row.getAccruedBalance().compareTo(aRule.getMaxBalance()) > 0); 566 } 567 } 568 569 @Test 570 public void testgetEligiblePayoutsYearEndForTimesheetCaseOne() throws Exception { 571 //Timesheet does not include the leave calendar end period 572 TkServiceLocator.getAccrualService().runAccrual(TS_USER_ID,TK_FROM,TK_TO,true,TS_USER_ID); 573 midDecTSD = TkServiceLocator.getTimesheetService().getTimesheetDocument(TSD_MID_DEC_PERIOD_ID); 574 midDecTSDEntry = midDecTSD.getCalendarEntry(); 575 576 Map<String, ArrayList<String>> eligiblePayouts = TkServiceLocator.getLeavePayoutService().getEligiblePayouts(midDecTSDEntry, TS_USER_ID); 577 //Assert correct number of payout eligible for frequency 578 assertEquals(0, eligiblePayouts.get(LMConstants.MAX_BAL_ACTION_FREQ.YEAR_END).size()); 579 580 /** 581 * No eligible payouts to test balance limit. 582 */ 583 /* //Assert that the accrual categories returned by BT service are in fact over their balance limit, 584 //according to their rules. 585 List<AccrualCategoryRule> rules = new ArrayList<AccrualCategoryRule>(); 586 for(String eligiblePayout : eligiblePayouts.get(LMConstants.MAX_BAL_ACTION_FREQ.YEAR_END)) 587 rules.add(TkServiceLocator.getAccrualCategoryRuleService().getAccrualCategoryRule(eligiblePayout)); 588 589 // Set should contain an accrual category whose rule's max balance is trumped by an employee override. 590 // Comparing accrued balance to a rule's defined max balance is insufficient for testing 591 // whether or not an accrual category is indeed over it's balance limit. Same can be said for FTE-proration. 592 // However, in this case, using an employee override will 593 LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(TS_USER_ID, midDecTSDEntry); 594 for(AccrualCategoryRule aRule : rules) { 595 LeaveSummaryRow row = summary.getLeaveSummaryRowForAccrualCategory(aRule.getLmAccrualCategoryId()); 596 BigDecimal maxBalance = aRule.getMaxBalance(); 597 EmployeeOverride mbOverride = TkServiceLocator.getEmployeeOverrideService().getEmployeeOverride(TS_USER_ID, 598 "testLP", 599 row.getAccrualCategory(), 600 "MB", 601 janEntry.getBeginPeriodDate()); 602 if(ObjectUtils.isNotNull(mbOverride)) 603 maxBalance = new BigDecimal(mbOverride.getOverrideValue()); 604 //Don't care about employee override existence, this is not the leave plan's roll-over period. 605 assertNotNull("eligible accrual category has no balance limit",maxBalance); 606 assertTrue("accrual category not eligible for payout",row.getAccruedBalance().compareTo(maxBalance) > 0); 607 }*/ 608 } 609 610 @Test 611 public void testgetEligiblePayoutsOnDemandForTimesheetCaseOne() throws Exception { 612 //Timesheet does not include the leave calendar end period 613 TkServiceLocator.getAccrualService().runAccrual(TS_USER_ID,TK_FROM,TK_TO,true,TS_USER_ID); 614 midDecTSD = TkServiceLocator.getTimesheetService().getTimesheetDocument(TSD_MID_DEC_PERIOD_ID); 615 midDecTSDEntry = midDecTSD.getCalendarEntry(); 616 617 Map<String, ArrayList<String>> eligiblePayouts = TkServiceLocator.getLeavePayoutService().getEligiblePayouts(midDecTSDEntry, TS_USER_ID); 618 //Assert correct number of payout eligible for frequency 619 assertEquals(2, eligiblePayouts.get(LMConstants.MAX_BAL_ACTION_FREQ.ON_DEMAND).size()); 620 621 //Assert that the accrual categories returned by BT service are in fact over their balance limit, 622 //according to their rules. - does not consider FTE. 623 List<AccrualCategoryRule> rules = new ArrayList<AccrualCategoryRule>(); 624 for(String eligiblePayout : eligiblePayouts.get(LMConstants.MAX_BAL_ACTION_FREQ.ON_DEMAND)) 625 rules.add(TkServiceLocator.getAccrualCategoryRuleService().getAccrualCategoryRule(eligiblePayout)); 626 627 LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(TS_USER_ID, midDecTSDEntry); 628 for(AccrualCategoryRule aRule : rules) { 629 LeaveSummaryRow row = summary.getLeaveSummaryRowForAccrualCategory(aRule.getLmAccrualCategoryId()); 630 assertNotNull("eligible accrual category has no balance limit",ObjectUtils.isNotNull(aRule.getMaxBalance())); 631 assertTrue("accrual category not eligible for payout",row.getAccruedBalance().compareTo(aRule.getMaxBalance()) > 0); 632 } 633 } 634 635 @Test 636 public void testgetEligiblePayoutsLeaveApproveForTimesheetCaseTwo() throws Exception { 637 //Timesheet includes the leave calendar end period, but does not include the leave plan's start date. 638 TkServiceLocator.getAccrualService().runAccrual(TS_USER_ID,TK_FROM,TK_TO,true,TS_USER_ID); 639 endDecTSD = TkServiceLocator.getTimesheetService().getTimesheetDocument(TSD_END_DEC_PERIOD_ID); 640 endDecTSDEntry = endDecTSD.getCalendarEntry(); 641 642 Map<String, ArrayList<String>> eligiblePayouts = TkServiceLocator.getLeavePayoutService().getEligiblePayouts(endDecTSDEntry, TS_USER_ID); 643 //Assert correct number of payout eligible for frequency 644 assertEquals(2, eligiblePayouts.get(LMConstants.MAX_BAL_ACTION_FREQ.LEAVE_APPROVE).size()); 645 646 //Assert that the accrual categories returned by BT service are in fact over their balance limit, 647 //according to their rules. - does not consider FTE. 648 List<AccrualCategoryRule> rules = new ArrayList<AccrualCategoryRule>(); 649 for(String eligiblePayout : eligiblePayouts.get(LMConstants.MAX_BAL_ACTION_FREQ.LEAVE_APPROVE)) 650 rules.add(TkServiceLocator.getAccrualCategoryRuleService().getAccrualCategoryRule(eligiblePayout)); 651 652 LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(TS_USER_ID, endDecTSDEntry); 653 for(AccrualCategoryRule aRule : rules) { 654 LeaveSummaryRow row = summary.getLeaveSummaryRowForAccrualCategory(aRule.getLmAccrualCategoryId()); 655 assertNotNull("eligible accrual category has no balance limit",ObjectUtils.isNotNull(aRule.getMaxBalance())); 656 assertTrue("accrual category not eligible for payout",row.getAccruedBalance().compareTo(aRule.getMaxBalance()) > 0); 657 } 658 } 659 660 @Test 661 public void testgetEligiblePayoutsYearEndForTimesheetCaseTwo() throws Exception { 662 //Timesheet includes the leave calendar end period, but does not include the leave plan's start date. 663 TkServiceLocator.getAccrualService().runAccrual(TS_USER_ID,TK_FROM,TK_TO,true,TS_USER_ID); 664 endDecTSD = TkServiceLocator.getTimesheetService().getTimesheetDocument(TSD_END_DEC_PERIOD_ID); 665 endDecTSDEntry = endDecTSD.getCalendarEntry(); 666 667 Map<String, ArrayList<String>> eligiblePayouts = TkServiceLocator.getLeavePayoutService().getEligiblePayouts(endDecTSDEntry, TS_USER_ID); 668 //Assert correct number of payout eligible for frequency 669 assertEquals(0, eligiblePayouts.get(LMConstants.MAX_BAL_ACTION_FREQ.YEAR_END).size()); 670 671 //Assert that the accrual categories returned by BT service are in fact over their balance limit, 672 //according to their rules. - does not consider FTE. 673 List<AccrualCategoryRule> rules = new ArrayList<AccrualCategoryRule>(); 674 for(String eligiblePayout : eligiblePayouts.get(LMConstants.MAX_BAL_ACTION_FREQ.YEAR_END)) 675 rules.add(TkServiceLocator.getAccrualCategoryRuleService().getAccrualCategoryRule(eligiblePayout)); 676 677 // Set should contain an accrual category whose rule's max balance is trumped by an employee override. 678 // Comparing accrued balance to a rule's defined max balance is insufficient for testing 679 // whether or not an accrual category is indeed over it's balance limit. Same can be said for FTE-proration. 680 LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(TS_USER_ID, endDecTSDEntry); 681 for(AccrualCategoryRule aRule : rules) { 682 LeaveSummaryRow row = summary.getLeaveSummaryRowForAccrualCategory(aRule.getLmAccrualCategoryId()); 683 BigDecimal maxBalance = aRule.getMaxBalance(); 684 EmployeeOverride mbOverride = TkServiceLocator.getEmployeeOverrideService().getEmployeeOverride(TS_USER_ID, 685 "testLP", 686 row.getAccrualCategory(), 687 "MB", 688 janEntry.getBeginPeriodDate()); 689 if(ObjectUtils.isNotNull(mbOverride)) 690 maxBalance = new BigDecimal(mbOverride.getOverrideValue()); 691 assertNotNull("eligible accrual category has no balance limit",maxBalance); 692 assertTrue("accrual category not eligible for payout",row.getAccruedBalance().compareTo(maxBalance) > 0); 693 } 694 } 695 696 @Test 697 public void testgetEligiblePayoutsOnDemandForTimesheetCaseTwo() throws Exception { 698 //Timesheet includes the leave calendar end period, but does not include the leave plan's start date. 699 TkServiceLocator.getAccrualService().runAccrual(TS_USER_ID,TK_FROM,TK_TO,true,TS_USER_ID); 700 endDecTSD = TkServiceLocator.getTimesheetService().getTimesheetDocument(TSD_END_DEC_PERIOD_ID); 701 endDecTSDEntry = endDecTSD.getCalendarEntry(); 702 703 704 Map<String, ArrayList<String>> eligiblePayouts = TkServiceLocator.getLeavePayoutService().getEligiblePayouts(endDecTSDEntry, TS_USER_ID); 705 //Assert correct number of payout eligible for frequency 706 assertEquals(2, eligiblePayouts.get(LMConstants.MAX_BAL_ACTION_FREQ.ON_DEMAND).size()); 707 708 //Assert that the accrual categories returned by BT service are in fact over their balance limit, 709 //according to their rules. - does not consider FTE. 710 List<AccrualCategoryRule> rules = new ArrayList<AccrualCategoryRule>(); 711 for(String eligiblePayout : eligiblePayouts.get(LMConstants.MAX_BAL_ACTION_FREQ.ON_DEMAND)) 712 rules.add(TkServiceLocator.getAccrualCategoryRuleService().getAccrualCategoryRule(eligiblePayout)); 713 714 LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(TS_USER_ID,endDecTSDEntry); 715 for(AccrualCategoryRule aRule : rules) { 716 LeaveSummaryRow row = summary.getLeaveSummaryRowForAccrualCategory(aRule.getLmAccrualCategoryId()); 717 assertNotNull("eligible accrual category has no balance limit",ObjectUtils.isNotNull(aRule.getMaxBalance())); 718 assertTrue("accrual category not eligible for payout",row.getAccruedBalance().compareTo(aRule.getMaxBalance()) > 0); 719 } 720 } 721 722 @Test 723 public void testgetEligiblePayoutsYearEndForTimesheetCaseThree() throws Exception { 724 //Timesheet includes the leave calendar end period, which is the leave plan's roll-over date. 725 TkServiceLocator.getAccrualService().runAccrual(TS_USER_ID,TK_FROM,TK_TO,true,TS_USER_ID); 726 endJanTSD = TkServiceLocator.getTimesheetService().getTimesheetDocument(TSD_END_JAN_PERIOD_ID); 727 endJanTSDEntry = endJanTSD.getCalendarEntry(); 728 729 Map<String, ArrayList<String>> eligiblePayouts = TkServiceLocator.getLeavePayoutService().getEligiblePayouts(endJanTSDEntry, TS_USER_ID); 730 731 //Assert correct number of payout eligible for frequency 732 assertEquals(3, eligiblePayouts.get(LMConstants.MAX_BAL_ACTION_FREQ.YEAR_END).size()); 733 734 //Assert that the accrual categories returned by BT service are in fact over their balance limit, 735 //according to their rules. - does not consider FTE. 736 List<AccrualCategoryRule> rules = new ArrayList<AccrualCategoryRule>(); 737 for(String eligiblePayout : eligiblePayouts.get(LMConstants.MAX_BAL_ACTION_FREQ.YEAR_END)) 738 rules.add(TkServiceLocator.getAccrualCategoryRuleService().getAccrualCategoryRule(eligiblePayout)); 739 740 LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(TS_USER_ID,endJanTSDEntry); 741 for(AccrualCategoryRule aRule : rules) { 742 LeaveSummaryRow row = summary.getLeaveSummaryRowForAccrualCategory(aRule.getLmAccrualCategoryId()); 743 BigDecimal maxBalance = aRule.getMaxBalance(); 744 EmployeeOverride mbOverride = TkServiceLocator.getEmployeeOverrideService().getEmployeeOverride(TS_USER_ID, 745 "testLP", 746 row.getAccrualCategory(), 747 "MB", 748 janEntry.getBeginPeriodDate()); 749 EmployeeOverride macOverride = TkServiceLocator.getEmployeeOverrideService().getEmployeeOverride(TS_USER_ID, 750 "testLP", 751 row.getAccrualCategory(), 752 "MAC", 753 janEntry.getBeginPeriodDate()); 754 if(ObjectUtils.isNotNull(mbOverride) && ObjectUtils.isNotNull(macOverride)) 755 maxBalance = new BigDecimal(Math.min(mbOverride.getOverrideValue(), macOverride.getOverrideValue())); 756 else { 757 if(ObjectUtils.isNotNull(macOverride)) 758 maxBalance = new BigDecimal(macOverride.getOverrideValue()); 759 if(ObjectUtils.isNotNull(mbOverride)) 760 maxBalance = new BigDecimal(mbOverride.getOverrideValue()); 761 } 762 assertNotNull("eligible accrual category has no balance limit",ObjectUtils.isNotNull(maxBalance)); 763 assertTrue("accrual category " + aRule.getLmAccrualCategoryId() + " not eligible for payout",row.getAccruedBalance().compareTo(maxBalance) > 0); 764 } 765 } 766 }