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.balancetransfer.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  
27  import org.apache.commons.lang.time.DateUtils;
28  import org.junit.After;
29  import org.junit.Before;
30  import org.junit.Test;
31  import org.kuali.hr.lm.LMConstants;
32  import org.kuali.hr.lm.accrual.AccrualCategoryRule;
33  import org.kuali.hr.lm.balancetransfer.BalanceTransfer;
34  import org.kuali.hr.lm.employeeoverride.EmployeeOverride;
35  import org.kuali.hr.lm.leaveSummary.LeaveSummary;
36  import org.kuali.hr.lm.leaveSummary.LeaveSummaryRow;
37  import org.kuali.hr.lm.leaveblock.LeaveBlock;
38  import org.kuali.hr.lm.leavecalendar.LeaveCalendarDocument;
39  import org.kuali.hr.test.KPMETestCase;
40  import org.kuali.hr.time.calendar.CalendarEntries;
41  import org.kuali.hr.time.service.base.TkServiceLocator;
42  import org.kuali.hr.time.timesheet.TimesheetDocument;
43  import org.kuali.hr.time.util.TKUtils;
44  import org.kuali.rice.krad.util.ObjectUtils;
45  
46  public class BalanceTransferServiceTest extends KPMETestCase {
47  
48  	/**
49  	 * Leave Calendar Document Test data
50  	 */
51  	private final String USER_ID = "testUser1";
52  	
53  	private LeaveCalendarDocument janLCD;
54  	private CalendarEntries janEntry;
55  	private LeaveCalendarDocument decLCD;
56  	private CalendarEntries decEntry;
57  	
58  	private Date janStart;
59  	private Date janEnd;
60  	private Date decStart;
61  	private Date decEnd;
62  	
63  	private final String JAN_ID = "5001";
64  	private final String DEC_ID = "5000";
65  	
66  	/**
67  	 * Timesheet Document Test Data;
68  	 */
69  	
70  	private final String TS_USER_ID = "testUser2";	
71  	
72  	private TimesheetDocument endJanTSD;
73  	private CalendarEntries endJanTSDEntry;
74  	private TimesheetDocument midJanTSD;
75  	private CalendarEntries midJanTSDEntry;
76  	private TimesheetDocument endDecTSD;
77  	private CalendarEntries endDecTSDEntry;
78  	private TimesheetDocument midDecTSD;
79  	private CalendarEntries midDecTSDEntry;
80  	
81  	private Date midJanStart;
82  	private Date midJanEnd;
83  	private Date endDecStart;
84  	private Date endDecEnd;
85  	private Date midDecStart;
86  	private Date midDecEnd;
87  	
88  	private final String TSD_MID_DEC_PERIOD_ID = "5000";
89  	private final String TSD_END_DEC_PERIOD_ID = "5001";
90  	private final String TSD_MID_JAN_PERIOD_ID = "5002";
91  	private final String TSD_END_JAN_PERIOD_ID = "5003";
92  
93  	/**
94  	 *  Common data
95  	 */
96  	
97  	private final String OD_XFER = "5000";
98  	private final String YE_XFER = "5001";
99  	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 testInitializeTransferNullAccrualRule() throws Exception {
144 		BalanceTransfer bt = new BalanceTransfer();
145 
146 		java.sql.Date effectiveDate = new java.sql.Date(DateUtils.addDays(decStart,3).getTime());
147 		bt = TkServiceLocator.getBalanceTransferService().initializeTransfer(USER_ID, null, BigDecimal.ZERO, effectiveDate);
148 		assertNull(bt);
149 	}
150 	
151 	@Test
152 	public void testInitializeTransferNullLeaveSummary() throws Exception {
153 		BalanceTransfer bt = new BalanceTransfer();
154 
155 		bt = TkServiceLocator.getBalanceTransferService().initializeTransfer(USER_ID, OD_XFER, null, TKUtils.getCurrentDate());
156 		assertNull(bt);
157 	}
158 	
159 	@Test
160 	public void testInitializeTransferNullAccrualRuleNullLeaveSummary() {
161 		BalanceTransfer bt = new BalanceTransfer();
162 		bt = TkServiceLocator.getBalanceTransferService().initializeTransfer(USER_ID, null, null, TKUtils.getCurrentDate());
163 		assertNull(bt);
164 	}
165 	
166 	@Test
167 	public void testInitializeTransferOnDemand() throws Exception {
168 		BalanceTransfer bt = new BalanceTransfer();
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 		bt = TkServiceLocator.getBalanceTransferService().initializeTransfer(USER_ID, OD_XFER, aRow.getAccruedBalance(), effectiveDate);
173 		assertEquals("transferOnDemand transfer amount", (new BigDecimal(1)).longValue(), bt.getTransferAmount().longValue());
174 		assertEquals("transferOnDemand forfeited amount",(new BigDecimal(0)).longValue(), bt.getForfeitedAmount().longValue());
175 		assertEquals("transferOnDemand amount transferred", (new BigDecimal(0.5)).longValue(), bt.getAmountTransferred().longValue());
176 	}
177 	
178 	@Test
179 	public void testInitializeTransferOnDemandWithForfeiture() throws Exception {
180 		BalanceTransfer bt = new BalanceTransfer();
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 		bt = TkServiceLocator.getBalanceTransferService().initializeTransfer(USER_ID, OD_XFER, aRow.getAccruedBalance(), effectiveDate);
185 		assertEquals("transferOnDemand transfer amount", (new BigDecimal(10)).longValue(), bt.getTransferAmount().longValue());
186 		assertEquals("transferOnDemand forfeited amount", (new BigDecimal(7)).longValue(), bt.getForfeitedAmount().longValue());
187 		assertEquals("transferOnDemand amount transferred", (new BigDecimal(5)).longValue(), bt.getAmountTransferred().longValue());
188 	}
189 	
190 	@Test
191 	public void testInitializeTransferOnYearEnd() throws Exception {
192 		BalanceTransfer bt = new BalanceTransfer();
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 		bt = TkServiceLocator.getBalanceTransferService().initializeTransfer(USER_ID, YE_XFER, aRow.getAccruedBalance(), effectiveDate);
198 		assertEquals("transferOnDemand transfer amount", (new BigDecimal(1)).longValue(), bt.getTransferAmount().longValue());
199 		assertEquals("transferOnDemand forfeited amount",(new BigDecimal(0)).longValue(), bt.getForfeitedAmount().longValue());
200 		assertEquals("transferOnDemand amount transferred", (new BigDecimal(0.5)).longValue(), bt.getAmountTransferred().longValue());
201 	}
202 	
203 	@Test
204 	public void testInitializeTransferOnYearEndWithForfeiture() throws Exception {
205 		BalanceTransfer bt = new BalanceTransfer();
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 		bt = TkServiceLocator.getBalanceTransferService().initializeTransfer(USER_ID, YE_XFER, aRow.getAccruedBalance(), effectiveDate);
210 		assertEquals("transferOnDemand transfer amount", (new BigDecimal(10)).longValue(), bt.getTransferAmount().longValue());
211 		assertEquals("transferOnDemand forfeited amount", (new BigDecimal(7)).longValue(), bt.getForfeitedAmount().longValue());
212 		assertEquals("transferOnDemand amount transferred", (new BigDecimal(5)).longValue(), bt.getAmountTransferred().longValue());
213 	}
214 	
215 	@Test
216 	public void testInitializeTransferOnLeaveApprove() throws Exception {
217 		BalanceTransfer bt = new BalanceTransfer();
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 		bt = TkServiceLocator.getBalanceTransferService().initializeTransfer(USER_ID, LA_XFER, aRow.getAccruedBalance(), effectiveDate);
222 		assertEquals("transferOnDemand transfer amount", (new BigDecimal(1)).longValue(), bt.getTransferAmount().longValue());
223 		assertEquals("transferOnDemand forfeited amount",(new BigDecimal(0)).longValue(), bt.getForfeitedAmount().longValue());
224 		assertEquals("transferOnDemand amount transferred", (new BigDecimal(0.5)).longValue(), bt.getAmountTransferred().longValue());
225 	}
226 	
227 	@Test
228 	public void testInitializeTransferOnLeaveApproveWithForfeiture() throws Exception {
229 		BalanceTransfer bt = new BalanceTransfer();
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 		bt = TkServiceLocator.getBalanceTransferService().initializeTransfer(USER_ID, LA_XFER, aRow.getAccruedBalance(), effectiveDate);
234 		assertEquals("transferOnDemand transfer amount", (new BigDecimal(10)).longValue(), bt.getTransferAmount().longValue());
235 		assertEquals("transferOnDemand forfeited amount", (new BigDecimal(7)).longValue(), bt.getForfeitedAmount().longValue());
236 		assertEquals("transferOnDemand amount transferred", (new BigDecimal(5)).longValue(), bt.getAmountTransferred().longValue());
237 	}
238 	
239 	@Test
240 	public void testInitializeTransferOnDemandMaxCarryOver() throws Exception {
241 		//N/A - Max Carry Over on Year End transfers.
242 		BalanceTransfer bt = new BalanceTransfer();
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 		bt = TkServiceLocator.getBalanceTransferService().initializeTransfer(USER_ID, OD_XFER_MAC, aRow.getAccruedBalance(), effectiveDate);
247 		assertEquals("transferOnDemand transfer amount", (new BigDecimal(1)).longValue(), bt.getTransferAmount().longValue());
248 		assertEquals("transferOnDemand forfeited amount",(new BigDecimal(0)).longValue(), bt.getForfeitedAmount().longValue());
249 		assertEquals("transferOnDemand amount transferred", (new BigDecimal(0.5)).longValue(), bt.getAmountTransferred().longValue());
250 	}
251 	
252 	@Test
253 	public void testInitializeTransferOnYearEndMaxCarryOver() 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 transfer limit.
257 		 * 
258 		 * max transfer amount = 10
259 		 * leave balance = 16
260 		 * max balance = 15
261 		 * max carry over = 10
262 		 * 
263 		 * all excess should be transferrable. 1 unit of time for excess over max balance, 5 units of time for
264 		 * excess over max carry over.
265 		 * 
266 		 */
267 		BalanceTransfer bt = new BalanceTransfer();
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 		bt = TkServiceLocator.getBalanceTransferService().initializeTransfer(USER_ID, YE_XFER_MAC, aRow.getAccruedBalance(), effectiveDate);
272 		assertEquals("transferOnDemand transfer amount", (new BigDecimal(6)).longValue(), bt.getTransferAmount().longValue());
273 		assertEquals("transferOnDemand forfeited amount", (new BigDecimal(0)).longValue(), bt.getForfeitedAmount().longValue());
274 		assertEquals("transferOnDemand amount transferred", (new BigDecimal(3)).longValue(), bt.getAmountTransferred().longValue());
275 	}
276 	
277 /*	@Test
278 	public void testInitializeTransferUnderMaxBalanceOnYearEndMaxCarryOver() 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 transfer 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 		BalanceTransfer bt = new BalanceTransfer();
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 		bt = TkServiceLocator.getBalanceTransferService().initializeTransfer(USER_ID, YE_XFER_MAC, aRow.getAccruedBalance(), effectiveDate);
304 		assertEquals("transferOnDemand transfer amount", (new BigDecimal(4)).longValue(), bt.getTransferAmount().longValue());
305 		assertEquals("transferOnDemand forfeited amount", (new BigDecimal(0)).longValue(), bt.getForfeitedAmount().longValue());
306 		assertEquals("transferOnDemand amount transferred", (new BigDecimal(2)).longValue(), bt.getAmountTransferred().longValue());
307 	}*/
308 	
309 	@Test
310 	public void testInitializeTransferOnYearEndMaxCarryOverWithForfeiture() throws Exception {
311 		//max bal limit reached and max annual carry over triggererd.
312 		BalanceTransfer bt = new BalanceTransfer();
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 		bt = TkServiceLocator.getBalanceTransferService().initializeTransfer(USER_ID, YE_XFER_MAC, aRow.getAccruedBalance(), effectiveDate);
317 		assertEquals("transferOnDemand transfer amount", (new BigDecimal(10)).longValue(), bt.getTransferAmount().longValue());
318 		assertEquals("transferOnDemand forfeited amount", (new BigDecimal(12)).longValue(), bt.getForfeitedAmount().longValue());
319 		assertEquals("transferOnDemand amount transferred", (new BigDecimal(5)).longValue(), bt.getAmountTransferred().longValue());
320 	}
321 	
322 	@Test
323 	public void testInitializeTransferOnLeaveApproveMaxCarryOver() throws Exception {
324 		BalanceTransfer bt = new BalanceTransfer();
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 		bt = TkServiceLocator.getBalanceTransferService().initializeTransfer(USER_ID, LA_XFER_MAC, aRow.getAccruedBalance(), effectiveDate);
329 		assertEquals("transferOnDemand transfer amount", (new BigDecimal(1)).longValue(), bt.getTransferAmount().longValue());
330 		assertEquals("transferOnDemand forfeited amount",(new BigDecimal(0)).longValue(), bt.getForfeitedAmount().longValue());
331 		assertEquals("transferOnDemand amount transferred", (new BigDecimal(0.5)).longValue(), bt.getAmountTransferred().longValue());
332 	}
333 	
334 	//
335 	// ACTION_AT_MAX_BALANCE = LOSE
336 	//
337 	@Test
338 	public void testInitializeLoseOnDemand() throws Exception {
339 		BalanceTransfer bt = new BalanceTransfer();
340 		LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(USER_ID, decEntry);
341 		LeaveSummaryRow aRow = summary.getLeaveSummaryRowForAccrualCategory(OD_LOSE);
342 		java.sql.Date effectiveDate = new java.sql.Date(DateUtils.addDays(decStart,3).getTime());
343 		bt = TkServiceLocator.getBalanceTransferService().initializeTransfer(USER_ID, OD_LOSE, aRow.getAccruedBalance(), effectiveDate);
344 		assertEquals("transferOnDemand transfer amount", (new BigDecimal(0)).longValue(), bt.getTransferAmount().longValue());
345 		assertEquals("transferOnDemand forfeited amount",(new BigDecimal(1)).longValue(), bt.getForfeitedAmount().longValue());
346 		assertEquals("transferOnDemand amount transferred", (new BigDecimal(0)).longValue(), bt.getAmountTransferred().longValue());
347 	}
348 	
349 	@Test
350 	public void testInitializeLoseOnYearEnd() throws Exception {
351 		BalanceTransfer bt = new BalanceTransfer();
352 		LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(USER_ID, janEntry);
353 		LeaveSummaryRow aRow = summary.getLeaveSummaryRowForAccrualCategory(YE_LOSE);
354 		java.sql.Date effectiveDate = new java.sql.Date(DateUtils.addDays(janStart,3).getTime());
355 		bt = TkServiceLocator.getBalanceTransferService().initializeTransfer(USER_ID, YE_LOSE, aRow.getAccruedBalance(), effectiveDate);
356 		assertEquals("transferOnDemand transfer amount", (new BigDecimal(0)).longValue(), bt.getTransferAmount().longValue());
357 		assertEquals("transferOnDemand forfeited amount",(new BigDecimal(17)).longValue(), bt.getForfeitedAmount().longValue());
358 		assertEquals("transferOnDemand amount transferred", (new BigDecimal(0)).longValue(), bt.getAmountTransferred().longValue());
359 	}
360 	
361 	@Test
362 	public void testInitializeLoseOnLeaveApprove() throws Exception {
363 		BalanceTransfer bt = new BalanceTransfer();
364 		LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(USER_ID, janEntry);
365 		LeaveSummaryRow aRow = summary.getLeaveSummaryRowForAccrualCategory(LA_LOSE);
366 		java.sql.Date effectiveDate = new java.sql.Date(DateUtils.addDays(janStart,3).getTime());
367 		bt = TkServiceLocator.getBalanceTransferService().initializeTransfer(USER_ID, LA_LOSE, aRow.getAccruedBalance(), effectiveDate);
368 		assertEquals("transferOnDemand transfer amount", (new BigDecimal(0)).longValue(), bt.getTransferAmount().longValue());
369 		assertEquals("transferOnDemand forfeited amount",(new BigDecimal(17)).longValue(), bt.getForfeitedAmount().longValue());
370 		assertEquals("transferOnDemand amount transferred", (new BigDecimal(0)).longValue(), bt.getAmountTransferred().longValue());
371 	}
372 	
373 	@Test
374 	public void testInitializeLoseOnDemandMaxCarryOver() throws Exception {
375 		BalanceTransfer bt = new BalanceTransfer();
376 		LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(USER_ID, janEntry);
377 		LeaveSummaryRow aRow = summary.getLeaveSummaryRowForAccrualCategory(OD_LOSE_MAC);
378 		java.sql.Date effectiveDate = new java.sql.Date(DateUtils.addDays(janStart,3).getTime());
379 		bt = TkServiceLocator.getBalanceTransferService().initializeTransfer(USER_ID, OD_LOSE_MAC, aRow.getAccruedBalance(), effectiveDate);
380 		assertEquals("transferOnDemand transfer amount", (new BigDecimal(0)).longValue(), bt.getTransferAmount().longValue());
381 		assertEquals("transferOnDemand forfeited amount",(new BigDecimal(17)).longValue(), bt.getForfeitedAmount().longValue());
382 		assertEquals("transferOnDemand amount transferred", (new BigDecimal(0)).longValue(), bt.getAmountTransferred().longValue());
383 	}
384 	
385 	@Test
386 	public void testInitializeLoseOnYearEndMaxCarryOver() throws Exception {
387 		BalanceTransfer bt = new BalanceTransfer();
388 		LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(USER_ID, janEntry);
389 		LeaveSummaryRow aRow = summary.getLeaveSummaryRowForAccrualCategory(YE_LOSE_MAC);
390 		java.sql.Date effectiveDate = new java.sql.Date(DateUtils.addDays(janStart,3).getTime());
391 		bt = TkServiceLocator.getBalanceTransferService().initializeTransfer(USER_ID, YE_LOSE_MAC, aRow.getAccruedBalance(), effectiveDate);
392 		assertEquals("transferOnDemand transfer amount", (new BigDecimal(0)).longValue(), bt.getTransferAmount().longValue());
393 		assertEquals("transferOnDemand forfeited amount",(new BigDecimal(22)).longValue(), bt.getForfeitedAmount().longValue());
394 		assertEquals("transferOnDemand amount transferred", (new BigDecimal(0)).longValue(), bt.getAmountTransferred().longValue());
395 	}
396 	
397 	@Test
398 	public void testInitializeLoseOnLeaveApproveMaxCarryOver() throws Exception {
399 		BalanceTransfer bt = new BalanceTransfer();
400 		LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(USER_ID, janEntry);
401 		LeaveSummaryRow aRow = summary.getLeaveSummaryRowForAccrualCategory(LA_LOSE_MAC);
402 		java.sql.Date effectiveDate = new java.sql.Date(DateUtils.addDays(janStart,3).getTime());
403 		bt = TkServiceLocator.getBalanceTransferService().initializeTransfer(USER_ID, LA_LOSE_MAC, aRow.getAccruedBalance(), effectiveDate);
404 		assertEquals("transferOnDemand transfer amount", (new BigDecimal(0)).longValue(), bt.getTransferAmount().longValue());
405 		assertEquals("transferOnDemand forfeited amount",(new BigDecimal(17)).longValue(), bt.getForfeitedAmount().longValue());
406 		assertEquals("transferOnDemand amount transferred", (new BigDecimal(0)).longValue(), bt.getAmountTransferred().longValue());
407 	}
408 	
409 	@Test
410 	public void testInitializeTransferWithOverrides() throws Exception {
411 		BalanceTransfer bt = new BalanceTransfer();
412 		LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(USER_ID, janEntry);
413 		LeaveSummaryRow aRow = summary.getLeaveSummaryRowForAccrualCategory(YE_XFER_EO);
414 		java.sql.Date effectiveDate = new java.sql.Date(DateUtils.addDays(janStart,3).getTime());
415 		bt = TkServiceLocator.getBalanceTransferService().initializeTransfer(USER_ID, YE_XFER_EO, aRow.getAccruedBalance(), effectiveDate);
416 		assertEquals("transferOnDemand transfer amount", (new BigDecimal(7)).longValue(), bt.getTransferAmount().longValue());
417 		assertEquals("transferOnDemand forfeited amount",(new BigDecimal(20)).longValue(), bt.getForfeitedAmount().longValue());
418 		// max balance transfer conversion factor is undefined for YE_XFER_EO
419 		assertEquals("transferOnDemand amount transferred", (new BigDecimal(7)).longValue(), bt.getAmountTransferred().longValue());
420 	}
421 	/**
422 	 * End Use-case testing
423 	 */
424 	
425 	@Test
426 	public void testTransferNullBalanceTransfer() {
427 		BalanceTransfer balanceTransfer = null;
428 		try {
429 			balanceTransfer = TkServiceLocator.getBalanceTransferService().transfer(balanceTransfer);
430 		} catch (RuntimeException re) {
431 			assertTrue(re.getMessage().contains("did not supply a valid BalanceTransfer object"));
432 		}
433 	}
434 	
435 	@Test
436 	public void testTransferWithZeroTransferAmount() throws Exception {
437 		BalanceTransfer bt = new BalanceTransfer();
438 		LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(USER_ID, janEntry);
439 		LeaveSummaryRow aRow = summary.getLeaveSummaryRowForAccrualCategory(YE_LOSE);
440 		java.sql.Date effectiveDate = new java.sql.Date(DateUtils.addDays(janStart,3).getTime());
441 		bt = TkServiceLocator.getBalanceTransferService().initializeTransfer(USER_ID, YE_LOSE, aRow.getAccruedBalance(), effectiveDate);
442 		bt = TkServiceLocator.getBalanceTransferService().transfer(bt);
443 		LeaveBlock forfeitedLeaveBlock = TkServiceLocator.getLeaveBlockService().getLeaveBlock(bt.getForfeitedLeaveBlockId());
444 		LeaveBlock accruedLeaveBlock = TkServiceLocator.getLeaveBlockService().getLeaveBlock(bt.getAccruedLeaveBlockId());
445 		LeaveBlock debitedLeaveBlock = TkServiceLocator.getLeaveBlockService().getLeaveBlock(bt.getDebitedLeaveBlockId());
446 		assertEquals("forfeited leave block leave amount incorrect", (new BigDecimal(-17)).longValue(), forfeitedLeaveBlock.getLeaveAmount().longValue());
447 		assertTrue("accrued leave block should not exist",ObjectUtils.isNull(accruedLeaveBlock));
448 		assertTrue("debited leave block should not exist",ObjectUtils.isNull(debitedLeaveBlock));
449 	}
450 	
451 	@Test
452 	public void testTransferWithNoAmountTransferred() throws Exception {
453 		BalanceTransfer bt = new BalanceTransfer();
454 		LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(USER_ID, janEntry);
455 		LeaveSummaryRow aRow = summary.getLeaveSummaryRowForAccrualCategory(YE_LOSE);
456 		java.sql.Date effectiveDate = new java.sql.Date(DateUtils.addDays(janStart,3).getTime());
457 		bt = TkServiceLocator.getBalanceTransferService().initializeTransfer(USER_ID, YE_LOSE, aRow.getAccruedBalance(), effectiveDate);
458 		bt.setAmountTransferred(null);
459 		bt = TkServiceLocator.getBalanceTransferService().transfer(bt);
460 		LeaveBlock forfeitedLeaveBlock = TkServiceLocator.getLeaveBlockService().getLeaveBlock(bt.getForfeitedLeaveBlockId());
461 		LeaveBlock accruedLeaveBlock = TkServiceLocator.getLeaveBlockService().getLeaveBlock(bt.getAccruedLeaveBlockId());
462 		LeaveBlock debitedLeaveBlock = TkServiceLocator.getLeaveBlockService().getLeaveBlock(bt.getDebitedLeaveBlockId());
463 		assertEquals("forfeited leave block leave amount incorrect",(new BigDecimal(-17)).longValue(), forfeitedLeaveBlock.getLeaveAmount().longValue());
464 		assertTrue("accrued leave block should not exist",ObjectUtils.isNull(accruedLeaveBlock));
465 		assertTrue("debited leave block should not exist",ObjectUtils.isNull(debitedLeaveBlock));	
466 	}
467 	
468 	@Test
469 	public void testTransferWithZeroForfeiture() throws Exception {
470 		BalanceTransfer bt = new BalanceTransfer();
471 		LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(USER_ID, decEntry);
472 		LeaveSummaryRow aRow = summary.getLeaveSummaryRowForAccrualCategory(OD_XFER);
473 		java.sql.Date effectiveDate = new java.sql.Date(DateUtils.addDays(decStart,3).getTime());
474 		bt = TkServiceLocator.getBalanceTransferService().initializeTransfer(USER_ID, OD_XFER, aRow.getAccruedBalance(), effectiveDate);
475 		bt = TkServiceLocator.getBalanceTransferService().transfer(bt);
476 		LeaveBlock forfeitedLeaveBlock = TkServiceLocator.getLeaveBlockService().getLeaveBlock(bt.getForfeitedLeaveBlockId());
477 		LeaveBlock accruedLeaveBlock = TkServiceLocator.getLeaveBlockService().getLeaveBlock(bt.getAccruedLeaveBlockId());
478 		LeaveBlock debitedLeaveBlock = TkServiceLocator.getLeaveBlockService().getLeaveBlock(bt.getDebitedLeaveBlockId());
479 		assertEquals("accrued leave block leave amount incorrect", (new BigDecimal(0.5)).longValue(), accruedLeaveBlock.getLeaveAmount().longValue());
480 		assertTrue("forfeited leave block should not exist",ObjectUtils.isNull(forfeitedLeaveBlock));
481 		assertEquals("transfered leave block leave amount incorrect", (new BigDecimal(-1)).longValue(), debitedLeaveBlock.getLeaveAmount().longValue());
482 	}
483 	
484 	@Test
485 	public void testTransferWithThreeLeaveBlocks() throws Exception {
486 		BalanceTransfer bt = new BalanceTransfer();
487 		LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(USER_ID, janEntry);
488 		LeaveSummaryRow aRow = summary.getLeaveSummaryRowForAccrualCategory(YE_XFER);
489 		java.sql.Date effectiveDate = new java.sql.Date(DateUtils.addDays(janStart,3).getTime());
490 		bt = TkServiceLocator.getBalanceTransferService().initializeTransfer(USER_ID, YE_XFER, aRow.getAccruedBalance(), effectiveDate);
491 		bt = TkServiceLocator.getBalanceTransferService().transfer(bt);
492 		LeaveBlock forfeitedLeaveBlock = TkServiceLocator.getLeaveBlockService().getLeaveBlock(bt.getForfeitedLeaveBlockId());
493 		LeaveBlock accruedLeaveBlock = TkServiceLocator.getLeaveBlockService().getLeaveBlock(bt.getAccruedLeaveBlockId());
494 		LeaveBlock debitedLeaveBlock = TkServiceLocator.getLeaveBlockService().getLeaveBlock(bt.getDebitedLeaveBlockId());
495 		assertEquals("forfeited leave block leave amount incorrect", (new BigDecimal(-7)).longValue(), forfeitedLeaveBlock.getLeaveAmount().longValue());
496 		assertEquals((new BigDecimal(5)).longValue(), accruedLeaveBlock.getLeaveAmount().longValue());
497 		assertEquals((new BigDecimal(-10)).longValue(), debitedLeaveBlock.getLeaveAmount().longValue());
498 	}
499 	
500 	//TODO: write tests for adjusted max balance cases - i.e. FTE < 1, employee override's w/ type MAX_BALANCE
501 	
502 	@Test
503 	public void testGetEligibleTransfersLeaveApprove() throws Exception {
504 		Map<String, ArrayList<String>> eligibleTransfers = TkServiceLocator.getBalanceTransferService().getEligibleTransfers(janEntry, USER_ID);
505 		assertEquals(4, eligibleTransfers.get(LMConstants.MAX_BAL_ACTION_FREQ.LEAVE_APPROVE).size());
506 		assertEquals(5, eligibleTransfers.get(LMConstants.MAX_BAL_ACTION_FREQ.YEAR_END).size());
507 		assertEquals(4, eligibleTransfers.get(LMConstants.MAX_BAL_ACTION_FREQ.ON_DEMAND).size());		List<AccrualCategoryRule> rules = new ArrayList<AccrualCategoryRule>();
508 		for(String eligibleTransfer : eligibleTransfers.get(LMConstants.MAX_BAL_ACTION_FREQ.LEAVE_APPROVE))
509 			rules.add(TkServiceLocator.getAccrualCategoryRuleService().getAccrualCategoryRule(eligibleTransfer));
510 			
511 		LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(USER_ID, janEntry);
512 		for(AccrualCategoryRule aRule : rules) {
513 			LeaveSummaryRow row = summary.getLeaveSummaryRowForAccrualCategory(aRule.getLmAccrualCategoryId());
514 			assertNotNull("eligible accrual category has no balance limit",ObjectUtils.isNotNull(aRule.getMaxBalance()));
515 			assertTrue("accrual category not eligible for transfer",row.getAccruedBalance().compareTo(aRule.getMaxBalance()) > 0);
516 		}
517 	}
518 	
519 	@Test
520 	public void testGetEligibleTransfersYearEnd() throws Exception {
521 		Map<String, ArrayList<String>> eligibleTransfers = TkServiceLocator.getBalanceTransferService().getEligibleTransfers(janEntry, USER_ID);
522 		assertEquals(4, eligibleTransfers.get(LMConstants.MAX_BAL_ACTION_FREQ.LEAVE_APPROVE).size());
523 		assertEquals(5, eligibleTransfers.get(LMConstants.MAX_BAL_ACTION_FREQ.YEAR_END).size());
524 		assertEquals(4, eligibleTransfers.get(LMConstants.MAX_BAL_ACTION_FREQ.ON_DEMAND).size());
525 		List<AccrualCategoryRule> rules = new ArrayList<AccrualCategoryRule>();
526 		for(String eligibleTransfer : eligibleTransfers.get(LMConstants.MAX_BAL_ACTION_FREQ.YEAR_END))
527 			rules.add(TkServiceLocator.getAccrualCategoryRuleService().getAccrualCategoryRule(eligibleTransfer));
528 		
529 		// Set should contain an accrual category whose rule's max balance is trumped by an employee override.
530 		// Comparing accrued balance to a rule's defined max balance is insufficient for testing
531 		// whether or not an accrual category is indeed over it's balance limit. Same can be said for FTE-proration.
532 		LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(USER_ID, janEntry);
533 		for(AccrualCategoryRule aRule : rules) {
534 			LeaveSummaryRow row = summary.getLeaveSummaryRowForAccrualCategory(aRule.getLmAccrualCategoryId());
535 			BigDecimal maxBalance = aRule.getMaxBalance();
536 			EmployeeOverride mbOverride = TkServiceLocator.getEmployeeOverrideService().getEmployeeOverride(USER_ID,
537 					"testLP",
538 					row.getAccrualCategory(),
539 					"MB",
540 					janEntry.getBeginPeriodDate());
541 			if(ObjectUtils.isNotNull(mbOverride))
542 				maxBalance = new BigDecimal(mbOverride.getOverrideValue());
543 			assertNotNull("eligible accrual category has no balance limit",maxBalance);
544 			assertTrue("accrual category not eligible for transfer",row.getAccruedBalance().compareTo(maxBalance) > 0);
545 		}
546 	}
547 	
548 	@Test
549 	public void testGetEligibleTransfersOnDemand() throws Exception {
550 		Map<String, ArrayList<String>> eligibleTransfers = TkServiceLocator.getBalanceTransferService().getEligibleTransfers(janEntry, USER_ID);
551 		assertEquals(4, eligibleTransfers.get(LMConstants.MAX_BAL_ACTION_FREQ.LEAVE_APPROVE).size());
552 		assertEquals(5, eligibleTransfers.get(LMConstants.MAX_BAL_ACTION_FREQ.YEAR_END).size());
553 		assertEquals(4, eligibleTransfers.get(LMConstants.MAX_BAL_ACTION_FREQ.ON_DEMAND).size());
554 		List<AccrualCategoryRule> rules = new ArrayList<AccrualCategoryRule>();
555 		for(String eligibleTransfer : eligibleTransfers.get(LMConstants.MAX_BAL_ACTION_FREQ.ON_DEMAND))
556 			rules.add(TkServiceLocator.getAccrualCategoryRuleService().getAccrualCategoryRule(eligibleTransfer));
557 
558 		LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(USER_ID, janEntry);
559 		for(AccrualCategoryRule aRule : rules) {
560 			LeaveSummaryRow row = summary.getLeaveSummaryRowForAccrualCategory(aRule.getLmAccrualCategoryId());
561 			assertNotNull("eligible accrual category has no balance limit",ObjectUtils.isNotNull(aRule.getMaxBalance()));
562 			assertTrue("accrual category not eligible for transfer",row.getAccruedBalance().compareTo(aRule.getMaxBalance()) > 0);
563 		}
564 	}
565 	
566 	@Test
567 	public void testGetEligibleTransfersOnYearEndCaseOne() throws Exception {
568 		//calendar entry is not the last calendar entry of the leave plan's calendar year.
569 		Map<String, ArrayList<String>> eligibleTransfers = TkServiceLocator.getBalanceTransferService().getEligibleTransfers(decEntry, USER_ID);
570 		assertEquals(4, eligibleTransfers.get(LMConstants.MAX_BAL_ACTION_FREQ.LEAVE_APPROVE).size());
571 		assertEquals(0, eligibleTransfers.get(LMConstants.MAX_BAL_ACTION_FREQ.YEAR_END).size());
572 		assertEquals(4, eligibleTransfers.get(LMConstants.MAX_BAL_ACTION_FREQ.ON_DEMAND).size());
573 		List<AccrualCategoryRule> rules = new ArrayList<AccrualCategoryRule>();
574 		for(String eligibleTransfer : eligibleTransfers.get(LMConstants.MAX_BAL_ACTION_FREQ.YEAR_END))
575 			rules.add(TkServiceLocator.getAccrualCategoryRuleService().getAccrualCategoryRule(eligibleTransfer));
576 
577 		LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(USER_ID, decEntry);
578 		for(AccrualCategoryRule aRule : rules) {
579 			LeaveSummaryRow row = summary.getLeaveSummaryRowForAccrualCategory(aRule.getLmAccrualCategoryId());
580 			assertNotNull("eligible accrual category has no balance limit",ObjectUtils.isNotNull(aRule.getMaxBalance()));
581 			assertTrue("accrual category not eligible for transfer",row.getAccruedBalance().compareTo(aRule.getMaxBalance()) > 0);
582 		}
583 	}
584 	
585 	@Test
586 	public void testGetEligibleTransfersOnYearEndCaseTwo() throws Exception {
587 		//calendar entry is the last calendar entry of the leave plan's calendar year.
588 		Map<String, ArrayList<String>> eligibleTransfers = TkServiceLocator.getBalanceTransferService().getEligibleTransfers(janEntry, USER_ID);
589 		assertEquals(4, eligibleTransfers.get(LMConstants.MAX_BAL_ACTION_FREQ.LEAVE_APPROVE).size());
590 		assertEquals(5, eligibleTransfers.get(LMConstants.MAX_BAL_ACTION_FREQ.YEAR_END).size());
591 		assertEquals(4, eligibleTransfers.get(LMConstants.MAX_BAL_ACTION_FREQ.ON_DEMAND).size());
592 		List<AccrualCategoryRule> rules = new ArrayList<AccrualCategoryRule>();
593 		for(String eligibleTransfer : eligibleTransfers.get(LMConstants.MAX_BAL_ACTION_FREQ.YEAR_END))
594 			rules.add(TkServiceLocator.getAccrualCategoryRuleService().getAccrualCategoryRule(eligibleTransfer));
595 
596 		LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(USER_ID, janEntry);
597 		for(AccrualCategoryRule aRule : rules) {
598 			LeaveSummaryRow row = summary.getLeaveSummaryRowForAccrualCategory(aRule.getLmAccrualCategoryId());
599 			BigDecimal maxBalance = aRule.getMaxBalance();
600 			EmployeeOverride mbOverride = TkServiceLocator.getEmployeeOverrideService().getEmployeeOverride(USER_ID,
601 					"testLP",
602 					row.getAccrualCategory(),
603 					"MB",
604 					janEntry.getBeginPeriodDate());
605 			EmployeeOverride macOverride = TkServiceLocator.getEmployeeOverrideService().getEmployeeOverride(USER_ID,
606 					"testLP",
607 					row.getAccrualCategory(),
608 					"MAC",
609 					janEntry.getBeginPeriodDate());
610 			if(ObjectUtils.isNotNull(mbOverride) && ObjectUtils.isNotNull(macOverride))
611 				maxBalance = new BigDecimal(Math.min(mbOverride.getOverrideValue(), macOverride.getOverrideValue()));
612 			else {
613 				if(ObjectUtils.isNotNull(macOverride))
614 					maxBalance = new BigDecimal(macOverride.getOverrideValue());
615 				if(ObjectUtils.isNotNull(mbOverride))
616 					maxBalance = new BigDecimal(mbOverride.getOverrideValue());
617 			}
618 			assertNotNull("eligible accrual category has no balance limit",ObjectUtils.isNotNull(maxBalance));
619 			assertTrue("accrual category not eligible for transfer",row.getAccruedBalance().compareTo(maxBalance) > 0);
620 		}
621 	}
622 	
623 	@Test
624 	public void testSubmitToWorkflow() {
625 		assertNull(null);
626 	}
627 	
628 	/**
629 	 * 
630 	 * TIMESHEET ELIGIBLE TESTS
631 	 * 
632 	 */
633 	
634 	@Test
635 	public void testGetEligibleTransfersLeaveApproveForTimesheetCaseOne() throws Exception {
636 		//Timesheet does not contain the leave calendar end period
637 		TkServiceLocator.getAccrualService().runAccrual(TS_USER_ID,TK_FROM,TK_TO,true,TS_USER_ID);
638 		midDecTSD = TkServiceLocator.getTimesheetService().getTimesheetDocument(TSD_MID_DEC_PERIOD_ID);
639 		midDecTSDEntry = midDecTSD.getCalendarEntry();
640 
641 		Map<String, ArrayList<String>> eligibleTransfers = TkServiceLocator.getBalanceTransferService().getEligibleTransfers(midDecTSDEntry, TS_USER_ID);
642 		//Assert correct number of transfer eligible for frequency
643 		assertEquals(4, eligibleTransfers.get(LMConstants.MAX_BAL_ACTION_FREQ.LEAVE_APPROVE).size());
644 
645 		//Assert that the accrual categories returned by BT service are in fact over their balance limit,
646 		//according to their rules. - does not consider FTE.
647 		List<AccrualCategoryRule> rules = new ArrayList<AccrualCategoryRule>();
648 		for(String eligibleTransfer : eligibleTransfers.get(LMConstants.MAX_BAL_ACTION_FREQ.LEAVE_APPROVE))
649 			rules.add(TkServiceLocator.getAccrualCategoryRuleService().getAccrualCategoryRule(eligibleTransfer));
650 
651 		LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(TS_USER_ID, midDecTSDEntry);
652 		for(AccrualCategoryRule aRule : rules) {
653 			LeaveSummaryRow row = summary.getLeaveSummaryRowForAccrualCategory(aRule.getLmAccrualCategoryId());
654 			assertNotNull("eligible accrual category has no balance limit",ObjectUtils.isNotNull(aRule.getMaxBalance()));
655 			assertTrue("accrual category not eligible for transfer",row.getAccruedBalance().compareTo(aRule.getMaxBalance()) > 0);
656 		}
657 	}
658 	
659 	@Test
660 	public void testGetEligibleTransfersYearEndForTimesheetCaseOne() throws Exception {
661 		//Timesheet does not include the leave calendar end period
662 		TkServiceLocator.getAccrualService().runAccrual(TS_USER_ID,TK_FROM,TK_TO,true,TS_USER_ID);
663 		midDecTSD = TkServiceLocator.getTimesheetService().getTimesheetDocument(TSD_MID_DEC_PERIOD_ID);
664 		midDecTSDEntry = midDecTSD.getCalendarEntry();
665 
666 		Map<String, ArrayList<String>> eligibleTransfers = TkServiceLocator.getBalanceTransferService().getEligibleTransfers(midDecTSDEntry, TS_USER_ID);
667 		//Assert correct number of transfer eligible for frequency
668 		assertEquals(0, eligibleTransfers.get(LMConstants.MAX_BAL_ACTION_FREQ.YEAR_END).size());
669 		
670 		/**
671 		 * No eligible transfers to test balance limit.
672 		 */
673 /*		//Assert that the accrual categories returned by BT service are in fact over their balance limit,
674 		//according to their rules.
675 		List<AccrualCategoryRule> rules = new ArrayList<AccrualCategoryRule>();
676 		for(String eligibleTransfer : eligibleTransfers.get(LMConstants.MAX_BAL_ACTION_FREQ.YEAR_END))
677 			rules.add(TkServiceLocator.getAccrualCategoryRuleService().getAccrualCategoryRule(eligibleTransfer));
678 			
679 		// Set should contain an accrual category whose rule's max balance is trumped by an employee override.
680 		// Comparing accrued balance to a rule's defined max balance is insufficient for testing
681 		// whether or not an accrual category is indeed over it's balance limit. Same can be said for FTE-proration.
682 		// However, in this case, using an employee override will 
683 		LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(TS_USER_ID, midDecTSDEntry);
684 		for(AccrualCategoryRule aRule : rules) {
685 			LeaveSummaryRow row = summary.getLeaveSummaryRowForAccrualCategory(aRule.getLmAccrualCategoryId());
686 			BigDecimal maxBalance = aRule.getMaxBalance();
687 			EmployeeOverride mbOverride = TkServiceLocator.getEmployeeOverrideService().getEmployeeOverride(TS_USER_ID,
688 					"testLP",
689 					row.getAccrualCategory(),
690 					"MB",
691 					janEntry.getBeginPeriodDate());
692 			if(ObjectUtils.isNotNull(mbOverride))
693 				maxBalance = new BigDecimal(mbOverride.getOverrideValue());
694 			//Don't care about employee override existence, this is not the leave plan's roll-over period.
695 			assertNotNull("eligible accrual category has no balance limit",maxBalance);
696 			assertTrue("accrual category not eligible for transfer",row.getAccruedBalance().compareTo(maxBalance) > 0);
697 		}*/
698 	}
699 	
700 	@Test
701 	public void testGetEligibleTransfersOnDemandForTimesheetCaseOne() throws Exception {
702 		//Timesheet does not include the leave calendar end period
703 		TkServiceLocator.getAccrualService().runAccrual(TS_USER_ID,TK_FROM,TK_TO,true,TS_USER_ID);
704 		midDecTSD = TkServiceLocator.getTimesheetService().getTimesheetDocument(TSD_MID_DEC_PERIOD_ID);
705 		midDecTSDEntry = midDecTSD.getCalendarEntry();
706 
707 		Map<String, ArrayList<String>> eligibleTransfers = TkServiceLocator.getBalanceTransferService().getEligibleTransfers(midDecTSDEntry, TS_USER_ID);
708 		//Assert correct number of transfer eligible for frequency
709 		assertEquals(4, eligibleTransfers.get(LMConstants.MAX_BAL_ACTION_FREQ.ON_DEMAND).size());
710 
711 		//Assert that the accrual categories returned by BT service are in fact over their balance limit,
712 		//according to their rules. - does not consider FTE.
713 		List<AccrualCategoryRule> rules = new ArrayList<AccrualCategoryRule>();
714 		for(String eligibleTransfer : eligibleTransfers.get(LMConstants.MAX_BAL_ACTION_FREQ.ON_DEMAND))
715 			rules.add(TkServiceLocator.getAccrualCategoryRuleService().getAccrualCategoryRule(eligibleTransfer));
716 
717 		LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(TS_USER_ID, midDecTSDEntry);
718 		for(AccrualCategoryRule aRule : rules) {
719 			LeaveSummaryRow row = summary.getLeaveSummaryRowForAccrualCategory(aRule.getLmAccrualCategoryId());
720 			assertNotNull("eligible accrual category has no balance limit",ObjectUtils.isNotNull(aRule.getMaxBalance()));
721 			assertTrue("accrual category not eligible for transfer",row.getAccruedBalance().compareTo(aRule.getMaxBalance()) > 0);
722 		}
723 	}
724 	
725 	@Test
726 	public void testGetEligibleTransfersLeaveApproveForTimesheetCaseTwo() throws Exception {
727 		//Timesheet includes the leave calendar end period, but does not include the leave plan's start date.
728 		TkServiceLocator.getAccrualService().runAccrual(TS_USER_ID,TK_FROM,TK_TO,true,TS_USER_ID);
729 		endDecTSD = TkServiceLocator.getTimesheetService().getTimesheetDocument(TSD_END_DEC_PERIOD_ID);
730 		endDecTSDEntry = endDecTSD.getCalendarEntry();
731 
732 		Map<String, ArrayList<String>> eligibleTransfers = TkServiceLocator.getBalanceTransferService().getEligibleTransfers(endDecTSDEntry, TS_USER_ID);
733 		//Assert correct number of transfer eligible for frequency
734 		assertEquals(4, eligibleTransfers.get(LMConstants.MAX_BAL_ACTION_FREQ.LEAVE_APPROVE).size());
735 		
736 		//Assert that the accrual categories returned by BT service are in fact over their balance limit,
737 		//according to their rules. - does not consider FTE.
738 		List<AccrualCategoryRule> rules = new ArrayList<AccrualCategoryRule>();
739 		for(String eligibleTransfer : eligibleTransfers.get(LMConstants.MAX_BAL_ACTION_FREQ.LEAVE_APPROVE))
740 			rules.add(TkServiceLocator.getAccrualCategoryRuleService().getAccrualCategoryRule(eligibleTransfer));
741 
742 		LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(TS_USER_ID, endDecTSDEntry);
743 		for(AccrualCategoryRule aRule : rules) {
744 			LeaveSummaryRow row = summary.getLeaveSummaryRowForAccrualCategory(aRule.getLmAccrualCategoryId());
745 			assertNotNull("eligible accrual category has no balance limit",ObjectUtils.isNotNull(aRule.getMaxBalance()));
746 			assertTrue("accrual category not eligible for transfer",row.getAccruedBalance().compareTo(aRule.getMaxBalance()) > 0);
747 		}
748 	}
749 	
750 	@Test
751 	public void testGetEligibleTransfersYearEndForTimesheetCaseTwo() throws Exception {
752 		//Timesheet includes the leave calendar end period, but does not include the leave plan's start date.
753 		TkServiceLocator.getAccrualService().runAccrual(TS_USER_ID,TK_FROM,TK_TO,true,TS_USER_ID);
754 		endDecTSD = TkServiceLocator.getTimesheetService().getTimesheetDocument(TSD_END_DEC_PERIOD_ID);
755 		endDecTSDEntry = endDecTSD.getCalendarEntry();
756 
757 		Map<String, ArrayList<String>> eligibleTransfers = TkServiceLocator.getBalanceTransferService().getEligibleTransfers(endDecTSDEntry, TS_USER_ID);
758 		//Assert correct number of transfer eligible for frequency
759 		assertEquals(0, eligibleTransfers.get(LMConstants.MAX_BAL_ACTION_FREQ.YEAR_END).size());
760 		
761 		//Assert that the accrual categories returned by BT service are in fact over their balance limit,
762 		//according to their rules. - does not consider FTE.
763 		List<AccrualCategoryRule> rules = new ArrayList<AccrualCategoryRule>();
764 		for(String eligibleTransfer : eligibleTransfers.get(LMConstants.MAX_BAL_ACTION_FREQ.YEAR_END))
765 			rules.add(TkServiceLocator.getAccrualCategoryRuleService().getAccrualCategoryRule(eligibleTransfer));
766 
767 		// Set should contain an accrual category whose rule's max balance is trumped by an employee override.
768 		// Comparing accrued balance to a rule's defined max balance is insufficient for testing
769 		// whether or not an accrual category is indeed over it's balance limit. Same can be said for FTE-proration.
770 		LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(TS_USER_ID, endDecTSDEntry);
771 		for(AccrualCategoryRule aRule : rules) {
772 			LeaveSummaryRow row = summary.getLeaveSummaryRowForAccrualCategory(aRule.getLmAccrualCategoryId());
773 			BigDecimal maxBalance = aRule.getMaxBalance();
774 			EmployeeOverride mbOverride = TkServiceLocator.getEmployeeOverrideService().getEmployeeOverride(TS_USER_ID,
775 					"testLP",
776 					row.getAccrualCategory(),
777 					"MB",
778 					janEntry.getBeginPeriodDate());
779 			if(ObjectUtils.isNotNull(mbOverride))
780 				maxBalance = new BigDecimal(mbOverride.getOverrideValue());
781 			assertNotNull("eligible accrual category has no balance limit",maxBalance);
782 			assertTrue("accrual category not eligible for transfer",row.getAccruedBalance().compareTo(maxBalance) > 0);
783 		}
784 	}
785 	
786 	@Test
787 	public void testGetEligibleTransfersOnDemandForTimesheetCaseTwo() throws Exception {
788 		//Timesheet includes the leave calendar end period, but does not include the leave plan's start date.
789 		TkServiceLocator.getAccrualService().runAccrual(TS_USER_ID,TK_FROM,TK_TO,true,TS_USER_ID);
790 		endDecTSD = TkServiceLocator.getTimesheetService().getTimesheetDocument(TSD_END_DEC_PERIOD_ID);
791 		endDecTSDEntry = endDecTSD.getCalendarEntry();
792 
793 
794 		Map<String, ArrayList<String>> eligibleTransfers = TkServiceLocator.getBalanceTransferService().getEligibleTransfers(endDecTSDEntry, TS_USER_ID);
795 		//Assert correct number of transfer eligible for frequency
796 		assertEquals(4, eligibleTransfers.get(LMConstants.MAX_BAL_ACTION_FREQ.ON_DEMAND).size());
797 		
798 		//Assert that the accrual categories returned by BT service are in fact over their balance limit,
799 		//according to their rules. - does not consider FTE.
800 		List<AccrualCategoryRule> rules = new ArrayList<AccrualCategoryRule>();
801 		for(String eligibleTransfer : eligibleTransfers.get(LMConstants.MAX_BAL_ACTION_FREQ.ON_DEMAND))
802 			rules.add(TkServiceLocator.getAccrualCategoryRuleService().getAccrualCategoryRule(eligibleTransfer));
803 
804 		LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(TS_USER_ID,endDecTSDEntry);
805 		for(AccrualCategoryRule aRule : rules) {
806 			LeaveSummaryRow row = summary.getLeaveSummaryRowForAccrualCategory(aRule.getLmAccrualCategoryId());
807 			assertNotNull("eligible accrual category has no balance limit",ObjectUtils.isNotNull(aRule.getMaxBalance()));
808 			assertTrue("accrual category not eligible for transfer",row.getAccruedBalance().compareTo(aRule.getMaxBalance()) > 0);
809 		}
810 	}
811 	
812 	@Test
813 	public void testGetEligibleTransfersYearEndForTimesheetCaseThree() throws Exception {
814 		//Timesheet includes the leave calendar end period, which is the leave plan's roll-over date.
815 		TkServiceLocator.getAccrualService().runAccrual(TS_USER_ID,TK_FROM,TK_TO,true,TS_USER_ID);
816 		endJanTSD = TkServiceLocator.getTimesheetService().getTimesheetDocument(TSD_END_JAN_PERIOD_ID);
817 		endJanTSDEntry = endJanTSD.getCalendarEntry();
818 
819 		Map<String, ArrayList<String>> eligibleTransfers = TkServiceLocator.getBalanceTransferService().getEligibleTransfers(endJanTSDEntry, TS_USER_ID);
820 		//Assert correct number of transfer eligible for frequency
821 		assertEquals(3, eligibleTransfers.get(LMConstants.MAX_BAL_ACTION_FREQ.YEAR_END).size());
822 		
823 		//Assert that the accrual categories returned by BT service are in fact over their balance limit,
824 		//according to their rules. - does not consider FTE.
825 		List<AccrualCategoryRule> rules = new ArrayList<AccrualCategoryRule>();
826 		for(String eligibleTransfer : eligibleTransfers.get(LMConstants.MAX_BAL_ACTION_FREQ.YEAR_END)) {
827 			rules.add(TkServiceLocator.getAccrualCategoryRuleService().getAccrualCategoryRule(eligibleTransfer));
828         }
829 
830 		LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(TS_USER_ID,endJanTSDEntry);
831 		for(AccrualCategoryRule aRule : rules) {
832 			LeaveSummaryRow row = summary.getLeaveSummaryRowForAccrualCategory(aRule.getLmAccrualCategoryId());
833 			BigDecimal maxBalance = aRule.getMaxBalance();
834 			EmployeeOverride mbOverride = TkServiceLocator.getEmployeeOverrideService().getEmployeeOverride(TS_USER_ID,
835 					"testLP",
836 					row.getAccrualCategory(),
837 					"MB",
838 					janEntry.getBeginPeriodDate());
839 			EmployeeOverride macOverride = TkServiceLocator.getEmployeeOverrideService().getEmployeeOverride(TS_USER_ID,
840 					"testLP",
841 					row.getAccrualCategory(),
842 					"MAC",
843 					janEntry.getBeginPeriodDate());
844 			if(ObjectUtils.isNotNull(mbOverride) && ObjectUtils.isNotNull(macOverride)) {
845 				maxBalance = new BigDecimal(Math.min(mbOverride.getOverrideValue(), macOverride.getOverrideValue()));
846             } else {
847 				if(ObjectUtils.isNotNull(macOverride)) {
848 					maxBalance = new BigDecimal(macOverride.getOverrideValue());
849                 }
850 				if(ObjectUtils.isNotNull(mbOverride)) {
851 					maxBalance = new BigDecimal(mbOverride.getOverrideValue());
852                 }
853 			}
854 			assertNotNull("eligible accrual category has no balance limit",ObjectUtils.isNotNull(maxBalance));
855 			assertTrue("accrual category " + aRule.getLmAccrualCategoryId() + " not eligible for transfer",row.getAccruedBalance().compareTo(maxBalance) > 0);
856 		}
857 	}
858 }