View Javadoc

1   /**
2    * Copyright 2004-2013 The Kuali Foundation
3    *
4    * Licensed under the Educational Community License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    * http://www.opensource.org/licenses/ecl2.php
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  package org.kuali.hr.lm.leavepayout.service;
17  
18  import static org.junit.Assert.*;
19  
20  import java.math.BigDecimal;
21  import java.util.ArrayList;
22  import java.util.Date;
23  import java.util.List;
24  import java.util.Map;
25  import java.util.Map.Entry;
26  import java.util.Set;
27  
28  import org.apache.commons.lang.time.DateUtils;
29  import org.junit.After;
30  import org.junit.Before;
31  import org.junit.Test;
32  import org.kuali.hr.lm.LMConstants;
33  import org.kuali.hr.lm.accrual.AccrualCategoryRule;
34  import org.kuali.hr.lm.leavepayout.LeavePayout;
35  import org.kuali.hr.lm.employeeoverride.EmployeeOverride;
36  import org.kuali.hr.lm.leaveSummary.LeaveSummary;
37  import org.kuali.hr.lm.leaveSummary.LeaveSummaryRow;
38  import org.kuali.hr.lm.leaveblock.LeaveBlock;
39  import org.kuali.hr.lm.leavecalendar.LeaveCalendarDocument;
40  import org.kuali.hr.test.KPMETestCase;
41  import org.kuali.hr.time.calendar.CalendarEntries;
42  import org.kuali.hr.time.service.base.TkServiceLocator;
43  import org.kuali.hr.time.timesheet.TimesheetDocument;
44  import org.kuali.hr.time.util.TKUtils;
45  import org.kuali.rice.krad.util.ObjectUtils;
46  
47  public class LeavePayoutServiceTest extends KPMETestCase {
48  
49  	/**
50  	 * Leave Calendar Document Test data
51  	 */
52  	private final String USER_ID = "testUser1";
53  	
54  	private LeaveCalendarDocument janLCD;
55  	private CalendarEntries janEntry;
56  	private LeaveCalendarDocument decLCD;
57  	private CalendarEntries decEntry;
58  	
59  	private Date janStart;
60  	private Date janEnd;
61  	private Date decStart;
62  	private Date decEnd;
63  	
64  	private final String JAN_ID = "5001";
65  	private final String DEC_ID = "5000";
66  	
67  	/**
68  	 * Timesheet Document Test Data;
69  	 */
70  	
71  	private final String TS_USER_ID = "testUser2";	
72  	
73  	private TimesheetDocument endJanTSD;
74  	private CalendarEntries endJanTSDEntry;
75  	private TimesheetDocument midJanTSD;
76  	private CalendarEntries midJanTSDEntry;
77  	private TimesheetDocument endDecTSD;
78  	private CalendarEntries endDecTSDEntry;
79  	private TimesheetDocument midDecTSD;
80  	private CalendarEntries midDecTSDEntry;
81  	
82  	private Date midJanStart;
83  	private Date midJanEnd;
84  	private Date endDecStart;
85  	private Date endDecEnd;
86  	private Date midDecStart;
87  	private Date midDecEnd;
88  	
89  	private final String TSD_MID_DEC_PERIOD_ID = "5000";
90  	private final String TSD_END_DEC_PERIOD_ID = "5001";
91  	private final String TSD_MID_JAN_PERIOD_ID = "5002";
92  	private final String TSD_END_JAN_PERIOD_ID = "5003";
93  
94  	/**
95  	 *  Common data
96  	 */
97  	
98  	private final String OD_XFER = "5000";
99  	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 }