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 import java.util.Set;
027
028 import org.apache.commons.lang.time.DateUtils;
029 import org.junit.After;
030 import org.junit.Before;
031 import org.junit.Test;
032 import org.kuali.hr.lm.LMConstants;
033 import org.kuali.hr.lm.accrual.AccrualCategoryRule;
034 import org.kuali.hr.lm.leavepayout.LeavePayout;
035 import org.kuali.hr.lm.employeeoverride.EmployeeOverride;
036 import org.kuali.hr.lm.leaveSummary.LeaveSummary;
037 import org.kuali.hr.lm.leaveSummary.LeaveSummaryRow;
038 import org.kuali.hr.lm.leaveblock.LeaveBlock;
039 import org.kuali.hr.lm.leavecalendar.LeaveCalendarDocument;
040 import org.kuali.hr.test.KPMETestCase;
041 import org.kuali.hr.time.calendar.CalendarEntries;
042 import org.kuali.hr.time.service.base.TkServiceLocator;
043 import org.kuali.hr.time.timesheet.TimesheetDocument;
044 import org.kuali.hr.time.util.TKUtils;
045 import org.kuali.rice.krad.util.ObjectUtils;
046
047 public class LeavePayoutServiceTest extends KPMETestCase {
048
049 /**
050 * Leave Calendar Document Test data
051 */
052 private final String USER_ID = "testUser1";
053
054 private LeaveCalendarDocument janLCD;
055 private CalendarEntries janEntry;
056 private LeaveCalendarDocument decLCD;
057 private CalendarEntries decEntry;
058
059 private Date janStart;
060 private Date janEnd;
061 private Date decStart;
062 private Date decEnd;
063
064 private final String JAN_ID = "5001";
065 private final String DEC_ID = "5000";
066
067 /**
068 * Timesheet Document Test Data;
069 */
070
071 private final String TS_USER_ID = "testUser2";
072
073 private TimesheetDocument endJanTSD;
074 private CalendarEntries endJanTSDEntry;
075 private TimesheetDocument midJanTSD;
076 private CalendarEntries midJanTSDEntry;
077 private TimesheetDocument endDecTSD;
078 private CalendarEntries endDecTSDEntry;
079 private TimesheetDocument midDecTSD;
080 private CalendarEntries midDecTSDEntry;
081
082 private Date midJanStart;
083 private Date midJanEnd;
084 private Date endDecStart;
085 private Date endDecEnd;
086 private Date midDecStart;
087 private Date midDecEnd;
088
089 private final String TSD_MID_DEC_PERIOD_ID = "5000";
090 private final String TSD_END_DEC_PERIOD_ID = "5001";
091 private final String TSD_MID_JAN_PERIOD_ID = "5002";
092 private final String TSD_END_JAN_PERIOD_ID = "5003";
093
094 /**
095 * Common data
096 */
097
098 private final String OD_XFER = "5000";
099 private final String YE_XFER = "5001";
100 private final String LA_XFER = "5002";
101 private final String OD_XFER_MAC = "5003";
102 private final String YE_XFER_MAC = "5004";
103 private final String LA_XFER_MAC = "5005";
104 private final String OD_LOSE = "5006";
105 private final String YE_LOSE = "5007";
106 private final String LA_LOSE = "5008";
107 private final String OD_LOSE_MAC = "5009";
108 private final String YE_LOSE_MAC = "5010";
109 private final String LA_LOSE_MAC = "5011";
110 private final String YE_XFER_EO = "5012";
111 private final java.sql.Date LM_FROM = TKUtils.formatDateString("11/01/2012");
112 private final java.sql.Date LM_TO = TKUtils.formatDateString("02/01/2013");
113 private final java.sql.Date TK_FROM = TKUtils.formatDateString("11/01/2011");
114 private final java.sql.Date TK_TO = TKUtils.formatDateString("02/01/2012");
115
116 @Before
117 public void setUp() throws Exception {
118 super.setUp();
119 TkServiceLocator.getAccrualService().runAccrual(USER_ID,LM_FROM,LM_TO,true,USER_ID);
120 janLCD = TkServiceLocator.getLeaveCalendarService().getLeaveCalendarDocument(JAN_ID);
121 janEntry = janLCD.getCalendarEntry();
122 janStart = janEntry.getBeginPeriodDate();
123 janEnd = janEntry.getEndPeriodDate();
124 decLCD = TkServiceLocator.getLeaveCalendarService().getLeaveCalendarDocument(DEC_ID);
125 decEntry = decLCD.getCalendarEntry();
126 decStart = decEntry.getBeginPeriodDate();
127 decEnd = decEntry.getEndPeriodDate();
128 }
129
130 @After
131 public void tearDown() throws Exception {
132 super.tearDown();
133 }
134
135 /*****************************
136 * Use-case specific testing *
137 ****************************/
138
139 //
140 // ACTION_AT_MAX_BALANCE = TRANSFER
141 //
142
143 @Test
144 public void testInitializePayoutNullAccrualRule() throws Exception {
145 LeavePayout lp = new LeavePayout();
146
147 java.sql.Date effectiveDate = new java.sql.Date(DateUtils.addDays(decStart,3).getTime());
148 lp = TkServiceLocator.getLeavePayoutService().initializePayout(USER_ID, null, BigDecimal.ZERO, effectiveDate);
149 assertNull(lp);
150 }
151
152 @Test
153 public void testInitializePayoutNullLeaveSummary() throws Exception {
154 LeavePayout lp = new LeavePayout();
155
156 lp = TkServiceLocator.getLeavePayoutService().initializePayout(USER_ID, OD_XFER, null, TKUtils.getCurrentDate());
157 assertNull(lp);
158 }
159
160 @Test
161 public void testInitializePayoutNullAccrualRuleNullLeaveSummary() {
162 LeavePayout lp = new LeavePayout();
163 lp = TkServiceLocator.getLeavePayoutService().initializePayout(USER_ID, null, null, TKUtils.getCurrentDate());
164 assertNull(lp);
165 }
166
167 @Test
168 public void testInitializePayoutOnDemand() throws Exception {
169 LeavePayout lp = new LeavePayout();
170 LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(USER_ID, decEntry);
171 LeaveSummaryRow aRow = summary.getLeaveSummaryRowForAccrualCategory(OD_XFER);
172 java.sql.Date effectiveDate = new java.sql.Date(DateUtils.addDays(decStart,3).getTime());
173 lp = TkServiceLocator.getLeavePayoutService().initializePayout(USER_ID, OD_XFER, aRow.getAccruedBalance(), effectiveDate);
174 assertEquals("payoutOnDemand payout amount", (new BigDecimal(1)).longValue(), lp.getPayoutAmount().longValue());
175 assertEquals("payoutOnDemand forfeited amount",(new BigDecimal(0)).longValue(), lp.getForfeitedAmount().longValue());
176 ////assertEquals("payoutOnDemand amount payoutred", (new BigDecimal(0.5)).longValue(), lp.getAmountPayoutred().longValue());
177 }
178
179 @Test
180 public void testInitializePayoutOnDemandWithForfeiture() throws Exception {
181 LeavePayout lp = new LeavePayout();
182 LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(USER_ID, janEntry);
183 LeaveSummaryRow aRow = summary.getLeaveSummaryRowForAccrualCategory(OD_XFER);
184 java.sql.Date effectiveDate = new java.sql.Date(DateUtils.addDays(janStart,3).getTime());
185 lp = TkServiceLocator.getLeavePayoutService().initializePayout(USER_ID, OD_XFER, aRow.getAccruedBalance(), effectiveDate);
186 assertEquals("payoutOnDemand payout amount", (new BigDecimal(10)).longValue(), lp.getPayoutAmount().longValue());
187 assertEquals("payoutOnDemand forfeited amount", (new BigDecimal(7)).longValue(), lp.getForfeitedAmount().longValue());
188 //assertEquals("payoutOnDemand amount payoutred", (new BigDecimal(5)).longValue(), lp.getAmountPayoutred().longValue());
189 }
190
191 @Test
192 public void testInitializePayoutOnYearEnd() throws Exception {
193 LeavePayout lp = new LeavePayout();
194 TkServiceLocator.getLeaveBlockService().deleteLeaveBlocksForDocumentId(DEC_ID);
195 LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(USER_ID, janEntry);
196 LeaveSummaryRow aRow = summary.getLeaveSummaryRowForAccrualCategory(YE_XFER);
197 java.sql.Date effectiveDate = new java.sql.Date(DateUtils.addDays(janStart,3).getTime());
198 lp = TkServiceLocator.getLeavePayoutService().initializePayout(USER_ID, YE_XFER, aRow.getAccruedBalance(), effectiveDate);
199 assertEquals("payoutOnDemand payout amount", (new BigDecimal(1)).longValue(), lp.getPayoutAmount().longValue());
200 assertEquals("payoutOnDemand forfeited amount",(new BigDecimal(0)).longValue(), lp.getForfeitedAmount().longValue());
201 //assertEquals("payoutOnDemand amount payoutred", (new BigDecimal(0.5)).longValue(), lp.getAmountPayoutred().longValue());
202 }
203
204 @Test
205 public void testInitializePayoutOnYearEndWithForfeiture() throws Exception {
206 LeavePayout lp = new LeavePayout();
207 LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(USER_ID, janEntry);
208 LeaveSummaryRow aRow = summary.getLeaveSummaryRowForAccrualCategory(YE_XFER);
209 java.sql.Date effectiveDate = new java.sql.Date(DateUtils.addDays(janStart,3).getTime());
210 lp = TkServiceLocator.getLeavePayoutService().initializePayout(USER_ID, YE_XFER, aRow.getAccruedBalance(), effectiveDate);
211 assertEquals("payoutOnDemand payout amount", (new BigDecimal(10)).longValue(), lp.getPayoutAmount().longValue());
212 assertEquals("payoutOnDemand forfeited amount", (new BigDecimal(7)).longValue(), lp.getForfeitedAmount().longValue());
213 //assertEquals("payoutOnDemand amount payoutred", (new BigDecimal(5)).longValue(), lp.getAmountPayoutred().longValue());
214 }
215
216 @Test
217 public void testInitializePayoutOnLeaveApprove() throws Exception {
218 LeavePayout lp = new LeavePayout();
219 LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(USER_ID, decEntry);
220 LeaveSummaryRow aRow = summary.getLeaveSummaryRowForAccrualCategory(LA_XFER);
221 java.sql.Date effectiveDate = new java.sql.Date(DateUtils.addDays(decStart,3).getTime());
222 lp = TkServiceLocator.getLeavePayoutService().initializePayout(USER_ID, LA_XFER, aRow.getAccruedBalance(), effectiveDate);
223 assertEquals("payoutOnDemand payout amount", (new BigDecimal(1)).longValue(), lp.getPayoutAmount().longValue());
224 assertEquals("payoutOnDemand forfeited amount",(new BigDecimal(0)).longValue(), lp.getForfeitedAmount().longValue());
225 //assertEquals("payoutOnDemand amount payoutred", (new BigDecimal(0.5)).longValue(), lp.getAmountPayoutred().longValue());
226 }
227
228 @Test
229 public void testInitializePayoutOnLeaveApproveWithForfeiture() throws Exception {
230 LeavePayout lp = new LeavePayout();
231 LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(USER_ID, janEntry);
232 LeaveSummaryRow aRow = summary.getLeaveSummaryRowForAccrualCategory(LA_XFER);
233 java.sql.Date effectiveDate = new java.sql.Date(DateUtils.addDays(janStart,3).getTime());
234 lp = TkServiceLocator.getLeavePayoutService().initializePayout(USER_ID, LA_XFER, aRow.getAccruedBalance(), effectiveDate);
235 assertEquals("payoutOnDemand payout amount", (new BigDecimal(10)).longValue(), lp.getPayoutAmount().longValue());
236 assertEquals("payoutOnDemand forfeited amount", (new BigDecimal(7)).longValue(), lp.getForfeitedAmount().longValue());
237 //assertEquals("payoutOnDemand amount payoutred", (new BigDecimal(5)).longValue(), lp.getAmountPayoutred().longValue());
238 }
239
240 @Test
241 public void testInitializePayoutOnDemandMaxCarryOver() throws Exception {
242 //N/A - Max Carry Over on Year End payouts.
243 LeavePayout lp = new LeavePayout();
244 LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(USER_ID, decEntry);
245 LeaveSummaryRow aRow = summary.getLeaveSummaryRowForAccrualCategory(OD_XFER_MAC);
246 java.sql.Date effectiveDate = new java.sql.Date(DateUtils.addDays(decStart,3).getTime());
247 lp = TkServiceLocator.getLeavePayoutService().initializePayout(USER_ID, OD_XFER_MAC, aRow.getAccruedBalance(), effectiveDate);
248 assertEquals("payoutOnDemand payout amount", (new BigDecimal(1)).longValue(), lp.getPayoutAmount().longValue());
249 assertEquals("payoutOnDemand forfeited amount",(new BigDecimal(0)).longValue(), lp.getForfeitedAmount().longValue());
250 //assertEquals("payoutOnDemand amount payoutred", (new BigDecimal(0.5)).longValue(), lp.getAmountPayoutred().longValue());
251 }
252
253 @Test
254 public void testInitializePayoutOnYearEndMaxCarryOver() throws Exception {
255 /**
256 * decEntry is not the last calendar entry in the leave plan. Want to check amounts for this action & action frequency
257 * without exceeding the payout limit.
258 *
259 * max payout amount = 10
260 * leave balance = 16
261 * max balance = 15
262 * max carry over = 10
263 *
264 * all excess should be payoutrable. 1 unit of time for excess over max balance, 5 units of time for
265 * excess over max carry over.
266 *
267 */
268 LeavePayout lp = new LeavePayout();
269 LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(USER_ID, decEntry);
270 LeaveSummaryRow aRow = summary.getLeaveSummaryRowForAccrualCategory(YE_XFER_MAC);
271 java.sql.Date effectiveDate = new java.sql.Date(DateUtils.addDays(decStart,3).getTime());
272 lp = TkServiceLocator.getLeavePayoutService().initializePayout(USER_ID, YE_XFER_MAC, aRow.getAccruedBalance(), effectiveDate);
273 assertEquals("payoutOnDemand payout amount", (new BigDecimal(6)).longValue(), lp.getPayoutAmount().longValue());
274 assertEquals("payoutOnDemand forfeited amount", (new BigDecimal(0)).longValue(), lp.getForfeitedAmount().longValue());
275 //assertEquals("payoutOnDemand amount payoutred", (new BigDecimal(3)).longValue(), lp.getAmountPayoutred().longValue());
276 }
277
278 /* @Test
279 public void testInitializePayoutUnderMaxBalanceOnYearEndMaxCarryOver() throws Exception {
280 //Create a leave block that will bring the available balance for january down to 14.
281 //this balance would be under the max available balance (15), but over the max annual carry over amount.
282 //i.o.w., this payout would not due to max balance limit, but max annual carry over.
283 //could also simply change the accrual amount.
284 LeaveBlock usage = new LeaveBlock();
285 usage.setAccrualCategory(YE_XFER_MAC);
286 usage.setLeaveDate(new java.sql.Date(DateUtils.addDays(janStart,5).getTime()));
287 usage.setLeaveAmount(new BigDecimal(-18));
288 usage.setPrincipalId(USER_ID);
289 usage.setAccrualGenerated(false);
290 usage.setRequestStatus(LMConstants.REQUEST_STATUS.APPROVED);
291 usage.setDocumentId(janLCD.getDocumentId());
292 usage.setLmLeaveBlockId("99999");
293 usage.setEarnCode("EC5");
294 usage.setBlockId(0L);
295 usage.setLeaveBlockType(LMConstants.LEAVE_BLOCK_TYPE.LEAVE_CALENDAR);
296 List<LeaveBlock> leaveBlocks = new ArrayList<LeaveBlock>();
297 leaveBlocks.add(usage);
298 TkServiceLocator.getLeaveBlockService().saveLeaveBlocks(leaveBlocks);
299
300 LeavePayout lp = new LeavePayout();
301 janLCD = TkServiceLocator.getLeaveCalendarService().getLeaveCalendarDocument(JAN_ID);
302 LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(USER_ID, janLCD.getCalendarEntry());
303 java.sql.Date effectiveDate = new java.sql.Date(DateUtils.addDays(janStart,3).getTime());
304 lp = TkServiceLocator.getLeavePayoutService().initializePayout(USER_ID, YE_XFER_MAC, aRow.getAccruedBalance(), effectiveDate);
305 assertEquals("payoutOnDemand payout amount", (new BigDecimal(4)).longValue(), lp.getPayoutAmount().longValue());
306 assertEquals("payoutOnDemand forfeited amount", (new BigDecimal(0)).longValue(), lp.getForfeitedAmount().longValue());
307 //assertEquals("payoutOnDemand amount payoutred", (new BigDecimal(2)).longValue(), lp.getAmountPayoutred().longValue());
308 }*/
309
310 @Test
311 public void testInitializePayoutOnYearEndMaxCarryOverWithForfeiture() throws Exception {
312 //max bal limit reached and max annual carry over triggererd.
313 LeavePayout lp = new LeavePayout();
314 LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(USER_ID, janEntry);
315 LeaveSummaryRow aRow = summary.getLeaveSummaryRowForAccrualCategory(YE_XFER_MAC);
316 java.sql.Date effectiveDate = new java.sql.Date(DateUtils.addDays(janStart,3).getTime());
317 lp = TkServiceLocator.getLeavePayoutService().initializePayout(USER_ID, YE_XFER_MAC, aRow.getAccruedBalance(), effectiveDate);
318 assertEquals("payoutOnDemand payout amount", (new BigDecimal(10)).longValue(), lp.getPayoutAmount().longValue());
319 assertEquals("payoutOnDemand forfeited amount", (new BigDecimal(12)).longValue(), lp.getForfeitedAmount().longValue());
320 //assertEquals("payoutOnDemand amount payoutred", (new BigDecimal(5)).longValue(), lp.getAmountPayoutred().longValue());
321 }
322
323 @Test
324 public void testInitializePayoutOnLeaveApproveMaxCarryOver() throws Exception {
325 LeavePayout lp = new LeavePayout();
326 LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(USER_ID, decEntry);
327 LeaveSummaryRow aRow = summary.getLeaveSummaryRowForAccrualCategory(LA_XFER_MAC);
328 java.sql.Date effectiveDate = new java.sql.Date(DateUtils.addDays(decStart,3).getTime());
329 lp = TkServiceLocator.getLeavePayoutService().initializePayout(USER_ID, LA_XFER_MAC, aRow.getAccruedBalance(), effectiveDate);
330 assertEquals("payoutOnDemand payout amount", (new BigDecimal(1)).longValue(), lp.getPayoutAmount().longValue());
331 assertEquals("payoutOnDemand forfeited amount",(new BigDecimal(0)).longValue(), lp.getForfeitedAmount().longValue());
332 //assertEquals("payoutOnDemand amount payoutred", (new BigDecimal(0.5)).longValue(), lp.getAmountPayoutred().longValue());
333 }
334
335 @Test
336 public void testInitializePayoutWithOverrides() throws Exception {
337 LeavePayout lp = new LeavePayout();
338 LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(USER_ID, janEntry);
339 LeaveSummaryRow aRow = summary.getLeaveSummaryRowForAccrualCategory(YE_XFER_EO);
340 java.sql.Date effectiveDate = new java.sql.Date(DateUtils.addDays(janStart,3).getTime());
341 lp = TkServiceLocator.getLeavePayoutService().initializePayout(USER_ID, YE_XFER_EO, aRow.getAccruedBalance(), effectiveDate);
342 assertEquals("payoutOnDemand payout amount", (new BigDecimal(7)).longValue(), lp.getPayoutAmount().longValue());
343 assertEquals("payoutOnDemand forfeited amount",(new BigDecimal(20)).longValue(), lp.getForfeitedAmount().longValue());
344 // max balance payout conversion factor is undefined for YE_XFER_EO
345 //assertEquals("payoutOnDemand amount payoutred", (new BigDecimal(7)).longValue(), lp.getAmountPayoutred().longValue());
346 }
347 /**
348 * End Use-case testing
349 */
350
351 @Test
352 public void testPayoutNullLeavePayout() {
353 LeavePayout LeavePayout = null;
354 try {
355 LeavePayout = TkServiceLocator.getLeavePayoutService().payout(LeavePayout);
356 } catch (RuntimeException re) {
357 assertTrue(re.getMessage().contains("did not supply a valid LeavePayout object"));
358 }
359 }
360
361 @Test
362 public void testPayoutWithZeroPayoutAmount() throws Exception {
363 LeavePayout lp = new LeavePayout();
364 LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(USER_ID, janEntry);
365 LeaveSummaryRow aRow = summary.getLeaveSummaryRowForAccrualCategory(YE_LOSE);
366 java.sql.Date effectiveDate = new java.sql.Date(DateUtils.addDays(janStart,3).getTime());
367 //lp = TkServiceLocator.getLeavePayoutService().initializePayout(USER_ID, YE_LOSE, aRow.getAccruedBalance(), effectiveDate);
368 lp.setPayoutAmount(BigDecimal.ZERO);
369 lp = TkServiceLocator.getLeavePayoutService().payout(lp);
370 LeaveBlock forfeitedLeaveBlock = TkServiceLocator.getLeaveBlockService().getLeaveBlock(lp.getForfeitedLeaveBlockId());
371 LeaveBlock payoutLeaveBlock = TkServiceLocator.getLeaveBlockService().getLeaveBlock(lp.getPayoutLeaveBlockId());
372 LeaveBlock payoutFromLeaveBlock = TkServiceLocator.getLeaveBlockService().getLeaveBlock(lp.getPayoutFromLeaveBlockId());
373 assertTrue("forfeited leave block should not exist", ObjectUtils.isNull(forfeitedLeaveBlock));
374 assertTrue("accrued leave block should not exist",ObjectUtils.isNull(payoutLeaveBlock));
375 assertTrue("debited leave block should not exist",ObjectUtils.isNull(payoutFromLeaveBlock));
376 }
377
378 @Test
379 public void testPayoutWithZeroForfeiture() throws Exception {
380 LeavePayout lp = new LeavePayout();
381 LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(USER_ID, decEntry);
382 LeaveSummaryRow aRow = summary.getLeaveSummaryRowForAccrualCategory(OD_XFER);
383 java.sql.Date effectiveDate = new java.sql.Date(DateUtils.addDays(decStart,3).getTime());
384 lp = TkServiceLocator.getLeavePayoutService().initializePayout(USER_ID, OD_XFER, aRow.getAccruedBalance(), effectiveDate);
385 lp = TkServiceLocator.getLeavePayoutService().payout(lp);
386 LeaveBlock forfeitedLeaveBlock = TkServiceLocator.getLeaveBlockService().getLeaveBlock(lp.getForfeitedLeaveBlockId());
387 LeaveBlock payoutLeaveBlock = TkServiceLocator.getLeaveBlockService().getLeaveBlock(lp.getPayoutLeaveBlockId());
388 LeaveBlock payoutFromLeaveBlock = TkServiceLocator.getLeaveBlockService().getLeaveBlock(lp.getPayoutFromLeaveBlockId());
389 assertEquals("accrued leave block leave amount incorrect", (new BigDecimal(1)).longValue(), payoutLeaveBlock.getLeaveAmount().longValue());
390 assertTrue("forfeited leave block should not exist",ObjectUtils.isNull(forfeitedLeaveBlock));
391 assertEquals("payouted leave block leave amount incorrect", (new BigDecimal(-1)).longValue(), payoutFromLeaveBlock.getLeaveAmount().longValue());
392 }
393
394 @Test
395 public void testPayoutWithThreeLeaveBlocks() throws Exception {
396 LeavePayout lp = new LeavePayout();
397 LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(USER_ID, janEntry);
398 LeaveSummaryRow aRow = summary.getLeaveSummaryRowForAccrualCategory(YE_XFER);
399 java.sql.Date effectiveDate = new java.sql.Date(DateUtils.addDays(janStart,3).getTime());
400 lp = TkServiceLocator.getLeavePayoutService().initializePayout(USER_ID, YE_XFER, aRow.getAccruedBalance(), effectiveDate);
401 lp = TkServiceLocator.getLeavePayoutService().payout(lp);
402 LeaveBlock forfeitedLeaveBlock = TkServiceLocator.getLeaveBlockService().getLeaveBlock(lp.getForfeitedLeaveBlockId());
403 LeaveBlock payoutLeaveBlock = TkServiceLocator.getLeaveBlockService().getLeaveBlock(lp.getPayoutLeaveBlockId());
404 LeaveBlock payoutFromLeaveBlock = TkServiceLocator.getLeaveBlockService().getLeaveBlock(lp.getPayoutFromLeaveBlockId());
405 assertEquals("forfeited leave block leave amount incorrect", (new BigDecimal(-7)).longValue(), forfeitedLeaveBlock.getLeaveAmount().longValue());
406 assertEquals((new BigDecimal(10)).longValue(), payoutLeaveBlock.getLeaveAmount().longValue());
407 assertEquals((new BigDecimal(-10)).longValue(), payoutFromLeaveBlock.getLeaveAmount().longValue());
408 }
409
410 //TODO: write tests for adjusted max balance cases - i.e. FTE < 1, employee override's w/ type MAX_BALANCE
411
412 @Test
413 public void testSubmitToWorkflow() {
414 assertNull(null);
415 }
416
417 }