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.balancetransfer.service;
017
018 import static org.junit.Assert.*;
019
020 import java.math.BigDecimal;
021 import java.util.ArrayList;
022 import java.util.Date;
023 import java.util.List;
024 import java.util.Map;
025 import java.util.Map.Entry;
026
027 import org.apache.commons.lang.time.DateUtils;
028 import org.junit.After;
029 import org.junit.Before;
030 import org.junit.Test;
031 import org.kuali.hr.lm.LMConstants;
032 import org.kuali.hr.lm.accrual.AccrualCategoryRule;
033 import org.kuali.hr.lm.balancetransfer.BalanceTransfer;
034 import org.kuali.hr.lm.employeeoverride.EmployeeOverride;
035 import org.kuali.hr.lm.leaveSummary.LeaveSummary;
036 import org.kuali.hr.lm.leaveSummary.LeaveSummaryRow;
037 import org.kuali.hr.lm.leaveblock.LeaveBlock;
038 import org.kuali.hr.lm.leavecalendar.LeaveCalendarDocument;
039 import org.kuali.hr.test.KPMETestCase;
040 import org.kuali.hr.time.calendar.CalendarEntries;
041 import org.kuali.hr.time.service.base.TkServiceLocator;
042 import org.kuali.hr.time.timesheet.TimesheetDocument;
043 import org.kuali.hr.time.util.TKUtils;
044 import org.kuali.rice.krad.util.ObjectUtils;
045
046 public class BalanceTransferServiceTest extends KPMETestCase {
047
048 /**
049 * Leave Calendar Document Test data
050 */
051 private final String USER_ID = "testUser1";
052
053 private LeaveCalendarDocument janLCD;
054 private CalendarEntries janEntry;
055 private LeaveCalendarDocument decLCD;
056 private CalendarEntries decEntry;
057
058 private Date janStart;
059 private Date janEnd;
060 private Date decStart;
061 private Date decEnd;
062
063 private final String JAN_ID = "5001";
064 private final String DEC_ID = "5000";
065
066 /**
067 * Timesheet Document Test Data;
068 */
069
070 private final String TS_USER_ID = "testUser2";
071
072 private TimesheetDocument endJanTSD;
073 private CalendarEntries endJanTSDEntry;
074 private TimesheetDocument midJanTSD;
075 private CalendarEntries midJanTSDEntry;
076 private TimesheetDocument endDecTSD;
077 private CalendarEntries endDecTSDEntry;
078 private TimesheetDocument midDecTSD;
079 private CalendarEntries midDecTSDEntry;
080
081 private Date midJanStart;
082 private Date midJanEnd;
083 private Date endDecStart;
084 private Date endDecEnd;
085 private Date midDecStart;
086 private Date midDecEnd;
087
088 private final String TSD_MID_DEC_PERIOD_ID = "5000";
089 private final String TSD_END_DEC_PERIOD_ID = "5001";
090 private final String TSD_MID_JAN_PERIOD_ID = "5002";
091 private final String TSD_END_JAN_PERIOD_ID = "5003";
092
093 /**
094 * Common data
095 */
096
097 private final String OD_XFER = "5000";
098 private final String YE_XFER = "5001";
099 private final String LA_XFER = "5002";
100 private final String OD_XFER_MAC = "5003";
101 private final String YE_XFER_MAC = "5004";
102 private final String LA_XFER_MAC = "5005";
103 private final String OD_LOSE = "5006";
104 private final String YE_LOSE = "5007";
105 private final String LA_LOSE = "5008";
106 private final String OD_LOSE_MAC = "5009";
107 private final String YE_LOSE_MAC = "5010";
108 private final String LA_LOSE_MAC = "5011";
109 private final String YE_XFER_EO = "5012";
110 private final java.sql.Date LM_FROM = TKUtils.formatDateString("11/01/2012");
111 private final java.sql.Date LM_TO = TKUtils.formatDateString("02/01/2013");
112 private final java.sql.Date TK_FROM = TKUtils.formatDateString("11/01/2011");
113 private final java.sql.Date TK_TO = TKUtils.formatDateString("02/01/2012");
114
115 @Before
116 public void setUp() throws Exception {
117 super.setUp();
118 TkServiceLocator.getAccrualService().runAccrual(USER_ID,LM_FROM,LM_TO,true,USER_ID);
119 janLCD = TkServiceLocator.getLeaveCalendarService().getLeaveCalendarDocument(JAN_ID);
120 janEntry = janLCD.getCalendarEntry();
121 janStart = janEntry.getBeginPeriodDate();
122 janEnd = janEntry.getEndPeriodDate();
123 decLCD = TkServiceLocator.getLeaveCalendarService().getLeaveCalendarDocument(DEC_ID);
124 decEntry = decLCD.getCalendarEntry();
125 decStart = decEntry.getBeginPeriodDate();
126 decEnd = decEntry.getEndPeriodDate();
127 }
128
129 @After
130 public void tearDown() throws Exception {
131 super.tearDown();
132 }
133
134 /*****************************
135 * Use-case specific testing *
136 ****************************/
137
138 //
139 // ACTION_AT_MAX_BALANCE = TRANSFER
140 //
141
142 @Test
143 public void 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 }