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 import java.util.Set;
027
028 import org.apache.commons.lang.time.DateUtils;
029 import org.junit.After;
030 import org.junit.Before;
031 import org.junit.Test;
032 import org.kuali.hr.lm.LMConstants;
033 import org.kuali.hr.lm.accrual.AccrualCategoryRule;
034 import org.kuali.hr.lm.balancetransfer.BalanceTransfer;
035 import org.kuali.hr.lm.employeeoverride.EmployeeOverride;
036 import org.kuali.hr.lm.leaveSummary.LeaveSummary;
037 import org.kuali.hr.lm.leaveSummary.LeaveSummaryRow;
038 import org.kuali.hr.lm.leaveblock.LeaveBlock;
039 import org.kuali.hr.lm.leavecalendar.LeaveCalendarDocument;
040 import org.kuali.hr.test.KPMETestCase;
041 import org.kuali.hr.time.calendar.CalendarEntries;
042 import org.kuali.hr.time.service.base.TkServiceLocator;
043 import org.kuali.hr.time.timesheet.TimesheetDocument;
044 import org.kuali.hr.time.util.TKUtils;
045 import org.kuali.rice.krad.util.ObjectUtils;
046
047 public class BalanceTransferServiceTest extends KPMETestCase {
048
049 /**
050 * Leave Calendar Document Test data
051 */
052 private final String USER_ID = "testUser1";
053
054 private LeaveCalendarDocument janLCD;
055 private CalendarEntries janEntry;
056 private LeaveCalendarDocument decLCD;
057 private CalendarEntries decEntry;
058
059 private Date janStart;
060 private Date janEnd;
061 private Date decStart;
062 private Date decEnd;
063
064 private final String JAN_ID = "5001";
065 private final String DEC_ID = "5000";
066
067 /**
068 * Timesheet Document Test Data;
069 */
070
071 /**
072 * Common data
073 */
074
075 private final String OD_XFER = "5000";
076 private final String YE_XFER = "5001";
077 private final String LA_XFER = "5002";
078 private final String OD_XFER_MAC = "5003";
079 private final String YE_XFER_MAC = "5004";
080 private final String LA_XFER_MAC = "5005";
081 private final String OD_LOSE = "5006";
082 private final String YE_LOSE = "5007";
083 private final String LA_LOSE = "5008";
084 private final String OD_LOSE_MAC = "5009";
085 private final String YE_LOSE_MAC = "5010";
086 private final String LA_LOSE_MAC = "5011";
087 private final String YE_XFER_EO = "5012";
088 private final java.sql.Date LM_FROM = TKUtils.formatDateString("11/01/2012");
089 private final java.sql.Date LM_TO = TKUtils.formatDateString("02/01/2013");
090
091 @Before
092 public void setUp() throws Exception {
093 super.setUp();
094 TkServiceLocator.getAccrualService().runAccrual(USER_ID,LM_FROM,LM_TO,true,USER_ID);
095 janLCD = TkServiceLocator.getLeaveCalendarService().getLeaveCalendarDocument(JAN_ID);
096 janEntry = janLCD.getCalendarEntry();
097 janStart = janEntry.getBeginPeriodDate();
098 janEnd = janEntry.getEndPeriodDate();
099 decLCD = TkServiceLocator.getLeaveCalendarService().getLeaveCalendarDocument(DEC_ID);
100 decEntry = decLCD.getCalendarEntry();
101 decStart = decEntry.getBeginPeriodDate();
102 decEnd = decEntry.getEndPeriodDate();
103 }
104
105 @After
106 public void tearDown() throws Exception {
107 super.tearDown();
108 }
109
110 /*****************************
111 * Use-case specific testing *
112 ****************************/
113
114 //
115 // ACTION_AT_MAX_BALANCE = TRANSFER
116 //
117
118 @Test
119 public void testInitializeTransferNullAccrualRule() throws Exception {
120 BalanceTransfer bt = new BalanceTransfer();
121
122 java.sql.Date effectiveDate = new java.sql.Date(DateUtils.addDays(decStart,3).getTime());
123 bt = TkServiceLocator.getBalanceTransferService().initializeTransfer(USER_ID, null, BigDecimal.ZERO, effectiveDate);
124 assertNull(bt);
125 }
126
127 @Test
128 public void testInitializeTransferNullLeaveSummary() throws Exception {
129 BalanceTransfer bt = new BalanceTransfer();
130
131 bt = TkServiceLocator.getBalanceTransferService().initializeTransfer(USER_ID, OD_XFER, null, TKUtils.getCurrentDate());
132 assertNull(bt);
133 }
134
135 @Test
136 public void testInitializeTransferNullAccrualRuleNullLeaveSummary() {
137 BalanceTransfer bt = new BalanceTransfer();
138 bt = TkServiceLocator.getBalanceTransferService().initializeTransfer(USER_ID, null, null, TKUtils.getCurrentDate());
139 assertNull(bt);
140 }
141
142 @Test
143 public void testInitializeTransferOnDemand() throws Exception {
144 BalanceTransfer bt = new BalanceTransfer();
145 LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(USER_ID, decEntry);
146 LeaveSummaryRow aRow = summary.getLeaveSummaryRowForAccrualCategory(OD_XFER);
147 java.sql.Date effectiveDate = new java.sql.Date(DateUtils.addDays(decStart,3).getTime());
148 bt = TkServiceLocator.getBalanceTransferService().initializeTransfer(USER_ID, OD_XFER, aRow.getAccruedBalance(), effectiveDate);
149 assertEquals("transferOnDemand transfer amount", (new BigDecimal(1)).longValue(), bt.getTransferAmount().longValue());
150 assertEquals("transferOnDemand forfeited amount",(new BigDecimal(0)).longValue(), bt.getForfeitedAmount().longValue());
151 assertEquals("transferOnDemand amount transferred", (new BigDecimal(0.5)).longValue(), bt.getAmountTransferred().longValue());
152 }
153
154 @Test
155 public void testInitializeTransferOnDemandWithForfeiture() throws Exception {
156 BalanceTransfer bt = new BalanceTransfer();
157 LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(USER_ID, janEntry);
158 LeaveSummaryRow aRow = summary.getLeaveSummaryRowForAccrualCategory(OD_XFER);
159 java.sql.Date effectiveDate = new java.sql.Date(DateUtils.addDays(janStart,3).getTime());
160 bt = TkServiceLocator.getBalanceTransferService().initializeTransfer(USER_ID, OD_XFER, aRow.getAccruedBalance(), effectiveDate);
161 assertEquals("transferOnDemand transfer amount", (new BigDecimal(10)).longValue(), bt.getTransferAmount().longValue());
162 assertEquals("transferOnDemand forfeited amount", (new BigDecimal(7)).longValue(), bt.getForfeitedAmount().longValue());
163 assertEquals("transferOnDemand amount transferred", (new BigDecimal(5)).longValue(), bt.getAmountTransferred().longValue());
164 }
165
166 @Test
167 public void testInitializeTransferOnYearEnd() throws Exception {
168 BalanceTransfer bt = new BalanceTransfer();
169 TkServiceLocator.getLeaveBlockService().deleteLeaveBlocksForDocumentId(DEC_ID);
170 LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(USER_ID, janEntry);
171 LeaveSummaryRow aRow = summary.getLeaveSummaryRowForAccrualCategory(YE_XFER);
172 java.sql.Date effectiveDate = new java.sql.Date(DateUtils.addDays(janStart,3).getTime());
173 bt = TkServiceLocator.getBalanceTransferService().initializeTransfer(USER_ID, YE_XFER, aRow.getAccruedBalance(), effectiveDate);
174 assertEquals("transferOnDemand transfer amount", (new BigDecimal(1)).longValue(), bt.getTransferAmount().longValue());
175 assertEquals("transferOnDemand forfeited amount",(new BigDecimal(0)).longValue(), bt.getForfeitedAmount().longValue());
176 assertEquals("transferOnDemand amount transferred", (new BigDecimal(0.5)).longValue(), bt.getAmountTransferred().longValue());
177 }
178
179 @Test
180 public void testInitializeTransferOnYearEndWithForfeiture() throws Exception {
181 BalanceTransfer bt = new BalanceTransfer();
182 LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(USER_ID, janEntry);
183 LeaveSummaryRow aRow = summary.getLeaveSummaryRowForAccrualCategory(YE_XFER);
184 java.sql.Date effectiveDate = new java.sql.Date(DateUtils.addDays(janStart,3).getTime());
185 bt = TkServiceLocator.getBalanceTransferService().initializeTransfer(USER_ID, YE_XFER, aRow.getAccruedBalance(), effectiveDate);
186 assertEquals("transferOnDemand transfer amount", (new BigDecimal(10)).longValue(), bt.getTransferAmount().longValue());
187 assertEquals("transferOnDemand forfeited amount", (new BigDecimal(7)).longValue(), bt.getForfeitedAmount().longValue());
188 assertEquals("transferOnDemand amount transferred", (new BigDecimal(5)).longValue(), bt.getAmountTransferred().longValue());
189 }
190
191 @Test
192 public void testInitializeTransferOnLeaveApprove() throws Exception {
193 BalanceTransfer bt = new BalanceTransfer();
194 LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(USER_ID, decEntry);
195 LeaveSummaryRow aRow = summary.getLeaveSummaryRowForAccrualCategory(LA_XFER);
196 java.sql.Date effectiveDate = new java.sql.Date(DateUtils.addDays(decStart,3).getTime());
197 bt = TkServiceLocator.getBalanceTransferService().initializeTransfer(USER_ID, LA_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 testInitializeTransferOnLeaveApproveWithForfeiture() throws Exception {
205 BalanceTransfer bt = new BalanceTransfer();
206 LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(USER_ID, janEntry);
207 LeaveSummaryRow aRow = summary.getLeaveSummaryRowForAccrualCategory(LA_XFER);
208 java.sql.Date effectiveDate = new java.sql.Date(DateUtils.addDays(janStart,3).getTime());
209 bt = TkServiceLocator.getBalanceTransferService().initializeTransfer(USER_ID, LA_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 testInitializeTransferOnDemandMaxCarryOver() throws Exception {
217 //N/A - Max Carry Over on Year End transfers.
218 BalanceTransfer bt = new BalanceTransfer();
219 LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(USER_ID, decEntry);
220 LeaveSummaryRow aRow = summary.getLeaveSummaryRowForAccrualCategory(OD_XFER_MAC);
221 java.sql.Date effectiveDate = new java.sql.Date(DateUtils.addDays(decStart,3).getTime());
222 bt = TkServiceLocator.getBalanceTransferService().initializeTransfer(USER_ID, OD_XFER_MAC, aRow.getAccruedBalance(), effectiveDate);
223 assertEquals("transferOnDemand transfer amount", (new BigDecimal(1)).longValue(), bt.getTransferAmount().longValue());
224 assertEquals("transferOnDemand forfeited amount",(new BigDecimal(0)).longValue(), bt.getForfeitedAmount().longValue());
225 assertEquals("transferOnDemand amount transferred", (new BigDecimal(0.5)).longValue(), bt.getAmountTransferred().longValue());
226 }
227
228 @Test
229 public void testInitializeTransferOnYearEndMaxCarryOver() throws Exception {
230 /**
231 * decEntry is not the last calendar entry in the leave plan. Want to check amounts for this action & action frequency
232 * without exceeding the transfer limit.
233 *
234 * max transfer amount = 10
235 * leave balance = 16
236 * max balance = 15
237 * max carry over = 10
238 *
239 * all excess should be transferrable. 1 unit of time for excess over max balance, 5 units of time for
240 * excess over max carry over.
241 *
242 */
243 BalanceTransfer bt = new BalanceTransfer();
244 LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(USER_ID, decEntry);
245 LeaveSummaryRow aRow = summary.getLeaveSummaryRowForAccrualCategory(YE_XFER_MAC);
246 java.sql.Date effectiveDate = new java.sql.Date(DateUtils.addDays(decStart,3).getTime());
247 bt = TkServiceLocator.getBalanceTransferService().initializeTransfer(USER_ID, YE_XFER_MAC, aRow.getAccruedBalance(), effectiveDate);
248 assertEquals("transferOnDemand transfer amount", (new BigDecimal(6)).longValue(), bt.getTransferAmount().longValue());
249 assertEquals("transferOnDemand forfeited amount", (new BigDecimal(0)).longValue(), bt.getForfeitedAmount().longValue());
250 assertEquals("transferOnDemand amount transferred", (new BigDecimal(3)).longValue(), bt.getAmountTransferred().longValue());
251 }
252
253 /* @Test
254 public void testInitializeTransferUnderMaxBalanceOnYearEndMaxCarryOver() throws Exception {
255 //Create a leave block that will bring the available balance for january down to 14.
256 //this balance would be under the max available balance (15), but over the max annual carry over amount.
257 //i.o.w., this transfer would not due to max balance limit, but max annual carry over.
258 //could also simply change the accrual amount.
259 LeaveBlock usage = new LeaveBlock();
260 usage.setAccrualCategory(YE_XFER_MAC);
261 usage.setLeaveDate(new java.sql.Date(DateUtils.addDays(janStart,5).getTime()));
262 usage.setLeaveAmount(new BigDecimal(-18));
263 usage.setPrincipalId(USER_ID);
264 usage.setAccrualGenerated(false);
265 usage.setRequestStatus(LMConstants.REQUEST_STATUS.APPROVED);
266 usage.setDocumentId(janLCD.getDocumentId());
267 usage.setLmLeaveBlockId("99999");
268 usage.setEarnCode("EC5");
269 usage.setBlockId(0L);
270 usage.setLeaveBlockType(LMConstants.LEAVE_BLOCK_TYPE.LEAVE_CALENDAR);
271 List<LeaveBlock> leaveBlocks = new ArrayList<LeaveBlock>();
272 leaveBlocks.add(usage);
273 TkServiceLocator.getLeaveBlockService().saveLeaveBlocks(leaveBlocks);
274
275 BalanceTransfer bt = new BalanceTransfer();
276 janLCD = TkServiceLocator.getLeaveCalendarService().getLeaveCalendarDocument(JAN_ID);
277 LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(USER_ID, janLCD.getCalendarEntry());
278 java.sql.Date effectiveDate = new java.sql.Date(DateUtils.addDays(janStart,3).getTime());
279 bt = TkServiceLocator.getBalanceTransferService().initializeTransfer(USER_ID, YE_XFER_MAC, aRow.getAccruedBalance(), effectiveDate);
280 assertEquals("transferOnDemand transfer amount", (new BigDecimal(4)).longValue(), bt.getTransferAmount().longValue());
281 assertEquals("transferOnDemand forfeited amount", (new BigDecimal(0)).longValue(), bt.getForfeitedAmount().longValue());
282 assertEquals("transferOnDemand amount transferred", (new BigDecimal(2)).longValue(), bt.getAmountTransferred().longValue());
283 }*/
284
285 @Test
286 public void testInitializeTransferOnYearEndMaxCarryOverWithForfeiture() throws Exception {
287 //max bal limit reached and max annual carry over triggererd.
288 BalanceTransfer bt = new BalanceTransfer();
289 LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(USER_ID, janEntry);
290 LeaveSummaryRow aRow = summary.getLeaveSummaryRowForAccrualCategory(YE_XFER_MAC);
291 java.sql.Date effectiveDate = new java.sql.Date(DateUtils.addDays(janStart,3).getTime());
292 bt = TkServiceLocator.getBalanceTransferService().initializeTransfer(USER_ID, YE_XFER_MAC, aRow.getAccruedBalance(), effectiveDate);
293 assertEquals("transferOnDemand transfer amount", (new BigDecimal(10)).longValue(), bt.getTransferAmount().longValue());
294 assertEquals("transferOnDemand forfeited amount", (new BigDecimal(12)).longValue(), bt.getForfeitedAmount().longValue());
295 assertEquals("transferOnDemand amount transferred", (new BigDecimal(5)).longValue(), bt.getAmountTransferred().longValue());
296 }
297
298 @Test
299 public void testInitializeTransferOnLeaveApproveMaxCarryOver() throws Exception {
300 BalanceTransfer bt = new BalanceTransfer();
301 LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(USER_ID, decEntry);
302 LeaveSummaryRow aRow = summary.getLeaveSummaryRowForAccrualCategory(LA_XFER_MAC);
303 java.sql.Date effectiveDate = new java.sql.Date(DateUtils.addDays(decStart,3).getTime());
304 bt = TkServiceLocator.getBalanceTransferService().initializeTransfer(USER_ID, LA_XFER_MAC, aRow.getAccruedBalance(), effectiveDate);
305 assertEquals("transferOnDemand transfer amount", (new BigDecimal(1)).longValue(), bt.getTransferAmount().longValue());
306 assertEquals("transferOnDemand forfeited amount",(new BigDecimal(0)).longValue(), bt.getForfeitedAmount().longValue());
307 assertEquals("transferOnDemand amount transferred", (new BigDecimal(0.5)).longValue(), bt.getAmountTransferred().longValue());
308 }
309
310 //
311 // ACTION_AT_MAX_BALANCE = LOSE
312 //
313 @Test
314 public void testInitializeLoseOnDemand() throws Exception {
315 BalanceTransfer bt = new BalanceTransfer();
316 LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(USER_ID, decEntry);
317 LeaveSummaryRow aRow = summary.getLeaveSummaryRowForAccrualCategory(OD_LOSE);
318 java.sql.Date effectiveDate = new java.sql.Date(DateUtils.addDays(decStart,3).getTime());
319 bt = TkServiceLocator.getBalanceTransferService().initializeTransfer(USER_ID, OD_LOSE, aRow.getAccruedBalance(), effectiveDate);
320 assertEquals("transferOnDemand transfer amount", (new BigDecimal(0)).longValue(), bt.getTransferAmount().longValue());
321 assertEquals("transferOnDemand forfeited amount",(new BigDecimal(1)).longValue(), bt.getForfeitedAmount().longValue());
322 assertEquals("transferOnDemand amount transferred", (new BigDecimal(0)).longValue(), bt.getAmountTransferred().longValue());
323 }
324
325 @Test
326 public void testInitializeLoseOnYearEnd() throws Exception {
327 BalanceTransfer bt = new BalanceTransfer();
328 LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(USER_ID, janEntry);
329 LeaveSummaryRow aRow = summary.getLeaveSummaryRowForAccrualCategory(YE_LOSE);
330 java.sql.Date effectiveDate = new java.sql.Date(DateUtils.addDays(janStart,3).getTime());
331 bt = TkServiceLocator.getBalanceTransferService().initializeTransfer(USER_ID, YE_LOSE, aRow.getAccruedBalance(), effectiveDate);
332 assertEquals("transferOnDemand transfer amount", (new BigDecimal(0)).longValue(), bt.getTransferAmount().longValue());
333 assertEquals("transferOnDemand forfeited amount",(new BigDecimal(17)).longValue(), bt.getForfeitedAmount().longValue());
334 assertEquals("transferOnDemand amount transferred", (new BigDecimal(0)).longValue(), bt.getAmountTransferred().longValue());
335 }
336
337 @Test
338 public void testInitializeLoseOnLeaveApprove() throws Exception {
339 BalanceTransfer bt = new BalanceTransfer();
340 LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(USER_ID, janEntry);
341 LeaveSummaryRow aRow = summary.getLeaveSummaryRowForAccrualCategory(LA_LOSE);
342 java.sql.Date effectiveDate = new java.sql.Date(DateUtils.addDays(janStart,3).getTime());
343 bt = TkServiceLocator.getBalanceTransferService().initializeTransfer(USER_ID, LA_LOSE, aRow.getAccruedBalance(), effectiveDate);
344 assertEquals("transferOnDemand transfer amount", (new BigDecimal(0)).longValue(), bt.getTransferAmount().longValue());
345 assertEquals("transferOnDemand forfeited amount",(new BigDecimal(17)).longValue(), bt.getForfeitedAmount().longValue());
346 assertEquals("transferOnDemand amount transferred", (new BigDecimal(0)).longValue(), bt.getAmountTransferred().longValue());
347 }
348
349 @Test
350 public void testInitializeLoseOnDemandMaxCarryOver() throws Exception {
351 BalanceTransfer bt = new BalanceTransfer();
352 LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(USER_ID, janEntry);
353 LeaveSummaryRow aRow = summary.getLeaveSummaryRowForAccrualCategory(OD_LOSE_MAC);
354 java.sql.Date effectiveDate = new java.sql.Date(DateUtils.addDays(janStart,3).getTime());
355 bt = TkServiceLocator.getBalanceTransferService().initializeTransfer(USER_ID, OD_LOSE_MAC, 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 testInitializeLoseOnYearEndMaxCarryOver() throws Exception {
363 BalanceTransfer bt = new BalanceTransfer();
364 LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(USER_ID, janEntry);
365 LeaveSummaryRow aRow = summary.getLeaveSummaryRowForAccrualCategory(YE_LOSE_MAC);
366 java.sql.Date effectiveDate = new java.sql.Date(DateUtils.addDays(janStart,3).getTime());
367 bt = TkServiceLocator.getBalanceTransferService().initializeTransfer(USER_ID, YE_LOSE_MAC, aRow.getAccruedBalance(), effectiveDate);
368 assertEquals("transferOnDemand transfer amount", (new BigDecimal(0)).longValue(), bt.getTransferAmount().longValue());
369 assertEquals("transferOnDemand forfeited amount",(new BigDecimal(22)).longValue(), bt.getForfeitedAmount().longValue());
370 assertEquals("transferOnDemand amount transferred", (new BigDecimal(0)).longValue(), bt.getAmountTransferred().longValue());
371 }
372
373 @Test
374 public void testInitializeLoseOnLeaveApproveMaxCarryOver() throws Exception {
375 BalanceTransfer bt = new BalanceTransfer();
376 LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(USER_ID, janEntry);
377 LeaveSummaryRow aRow = summary.getLeaveSummaryRowForAccrualCategory(LA_LOSE_MAC);
378 java.sql.Date effectiveDate = new java.sql.Date(DateUtils.addDays(janStart,3).getTime());
379 bt = TkServiceLocator.getBalanceTransferService().initializeTransfer(USER_ID, LA_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 testInitializeTransferWithOverrides() throws Exception {
387 BalanceTransfer bt = new BalanceTransfer();
388 LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(USER_ID, janEntry);
389 LeaveSummaryRow aRow = summary.getLeaveSummaryRowForAccrualCategory(YE_XFER_EO);
390 java.sql.Date effectiveDate = new java.sql.Date(DateUtils.addDays(janStart,3).getTime());
391 bt = TkServiceLocator.getBalanceTransferService().initializeTransfer(USER_ID, YE_XFER_EO, aRow.getAccruedBalance(), effectiveDate);
392 assertEquals("transferOnDemand transfer amount", (new BigDecimal(7)).longValue(), bt.getTransferAmount().longValue());
393 assertEquals("transferOnDemand forfeited amount",(new BigDecimal(20)).longValue(), bt.getForfeitedAmount().longValue());
394 // max balance transfer conversion factor is undefined for YE_XFER_EO
395 assertEquals("transferOnDemand amount transferred", (new BigDecimal(7)).longValue(), bt.getAmountTransferred().longValue());
396 }
397 /**
398 * End Use-case testing
399 */
400
401 @Test
402 public void testTransferNullBalanceTransfer() {
403 BalanceTransfer balanceTransfer = null;
404 try {
405 balanceTransfer = TkServiceLocator.getBalanceTransferService().transfer(balanceTransfer);
406 } catch (RuntimeException re) {
407 assertTrue(re.getMessage().contains("did not supply a valid BalanceTransfer object"));
408 }
409 }
410
411 @Test
412 public void testTransferWithZeroTransferAmount() throws Exception {
413 BalanceTransfer bt = new BalanceTransfer();
414 LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(USER_ID, janEntry);
415 LeaveSummaryRow aRow = summary.getLeaveSummaryRowForAccrualCategory(YE_LOSE);
416 java.sql.Date effectiveDate = new java.sql.Date(DateUtils.addDays(janStart,3).getTime());
417 bt = TkServiceLocator.getBalanceTransferService().initializeTransfer(USER_ID, YE_LOSE, aRow.getAccruedBalance(), effectiveDate);
418 bt = TkServiceLocator.getBalanceTransferService().transfer(bt);
419 LeaveBlock forfeitedLeaveBlock = TkServiceLocator.getLeaveBlockService().getLeaveBlock(bt.getForfeitedLeaveBlockId());
420 LeaveBlock accruedLeaveBlock = TkServiceLocator.getLeaveBlockService().getLeaveBlock(bt.getAccruedLeaveBlockId());
421 LeaveBlock debitedLeaveBlock = TkServiceLocator.getLeaveBlockService().getLeaveBlock(bt.getDebitedLeaveBlockId());
422 assertEquals("forfeited leave block leave amount incorrect", (new BigDecimal(-17)).longValue(), forfeitedLeaveBlock.getLeaveAmount().longValue());
423 assertTrue("accrued leave block should not exist",ObjectUtils.isNull(accruedLeaveBlock));
424 assertTrue("debited leave block should not exist",ObjectUtils.isNull(debitedLeaveBlock));
425 }
426
427 @Test
428 public void testTransferWithNoAmountTransferred() throws Exception {
429 BalanceTransfer bt = new BalanceTransfer();
430 LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(USER_ID, janEntry);
431 LeaveSummaryRow aRow = summary.getLeaveSummaryRowForAccrualCategory(YE_LOSE);
432 java.sql.Date effectiveDate = new java.sql.Date(DateUtils.addDays(janStart,3).getTime());
433 bt = TkServiceLocator.getBalanceTransferService().initializeTransfer(USER_ID, YE_LOSE, aRow.getAccruedBalance(), effectiveDate);
434 bt.setAmountTransferred(null);
435 bt = TkServiceLocator.getBalanceTransferService().transfer(bt);
436 LeaveBlock forfeitedLeaveBlock = TkServiceLocator.getLeaveBlockService().getLeaveBlock(bt.getForfeitedLeaveBlockId());
437 LeaveBlock accruedLeaveBlock = TkServiceLocator.getLeaveBlockService().getLeaveBlock(bt.getAccruedLeaveBlockId());
438 LeaveBlock debitedLeaveBlock = TkServiceLocator.getLeaveBlockService().getLeaveBlock(bt.getDebitedLeaveBlockId());
439 assertEquals("forfeited leave block leave amount incorrect",(new BigDecimal(-17)).longValue(), forfeitedLeaveBlock.getLeaveAmount().longValue());
440 assertTrue("accrued leave block should not exist",ObjectUtils.isNull(accruedLeaveBlock));
441 assertTrue("debited leave block should not exist",ObjectUtils.isNull(debitedLeaveBlock));
442 }
443
444 @Test
445 public void testTransferWithZeroForfeiture() throws Exception {
446 BalanceTransfer bt = new BalanceTransfer();
447 LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(USER_ID, decEntry);
448 LeaveSummaryRow aRow = summary.getLeaveSummaryRowForAccrualCategory(OD_XFER);
449 java.sql.Date effectiveDate = new java.sql.Date(DateUtils.addDays(decStart,3).getTime());
450 bt = TkServiceLocator.getBalanceTransferService().initializeTransfer(USER_ID, OD_XFER, aRow.getAccruedBalance(), effectiveDate);
451 bt = TkServiceLocator.getBalanceTransferService().transfer(bt);
452 LeaveBlock forfeitedLeaveBlock = TkServiceLocator.getLeaveBlockService().getLeaveBlock(bt.getForfeitedLeaveBlockId());
453 LeaveBlock accruedLeaveBlock = TkServiceLocator.getLeaveBlockService().getLeaveBlock(bt.getAccruedLeaveBlockId());
454 LeaveBlock debitedLeaveBlock = TkServiceLocator.getLeaveBlockService().getLeaveBlock(bt.getDebitedLeaveBlockId());
455 assertEquals("accrued leave block leave amount incorrect", (new BigDecimal(0.5)).longValue(), accruedLeaveBlock.getLeaveAmount().longValue());
456 assertTrue("forfeited leave block should not exist",ObjectUtils.isNull(forfeitedLeaveBlock));
457 assertEquals("transfered leave block leave amount incorrect", (new BigDecimal(-1)).longValue(), debitedLeaveBlock.getLeaveAmount().longValue());
458 }
459
460 @Test
461 public void testTransferWithThreeLeaveBlocks() throws Exception {
462 BalanceTransfer bt = new BalanceTransfer();
463 LeaveSummary summary = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(USER_ID, janEntry);
464 LeaveSummaryRow aRow = summary.getLeaveSummaryRowForAccrualCategory(YE_XFER);
465 java.sql.Date effectiveDate = new java.sql.Date(DateUtils.addDays(janStart,3).getTime());
466 bt = TkServiceLocator.getBalanceTransferService().initializeTransfer(USER_ID, YE_XFER, aRow.getAccruedBalance(), effectiveDate);
467 bt = TkServiceLocator.getBalanceTransferService().transfer(bt);
468 LeaveBlock forfeitedLeaveBlock = TkServiceLocator.getLeaveBlockService().getLeaveBlock(bt.getForfeitedLeaveBlockId());
469 LeaveBlock accruedLeaveBlock = TkServiceLocator.getLeaveBlockService().getLeaveBlock(bt.getAccruedLeaveBlockId());
470 LeaveBlock debitedLeaveBlock = TkServiceLocator.getLeaveBlockService().getLeaveBlock(bt.getDebitedLeaveBlockId());
471 assertEquals("forfeited leave block leave amount incorrect", (new BigDecimal(-7)).longValue(), forfeitedLeaveBlock.getLeaveAmount().longValue());
472 assertEquals((new BigDecimal(5)).longValue(), accruedLeaveBlock.getLeaveAmount().longValue());
473 assertEquals((new BigDecimal(-10)).longValue(), debitedLeaveBlock.getLeaveAmount().longValue());
474 }
475
476 //TODO: write tests for adjusted max balance cases - i.e. FTE < 1, employee override's w/ type MAX_BALANCE
477
478 @Test
479 public void testSubmitToWorkflow() {
480 assertNull(null);
481 }
482
483 }