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.time.accrual.service;
017
018 import java.math.BigDecimal;
019 import java.sql.Date;
020 import java.util.Calendar;
021 import java.util.List;
022
023 import org.joda.time.DateTime;
024 import org.junit.Assert;
025 import org.junit.Test;
026 import org.kuali.hr.lm.LMConstants;
027 import org.kuali.hr.lm.leaveblock.LeaveBlock;
028 import org.kuali.hr.lm.leaveblock.LeaveBlockHistory;
029 import org.kuali.hr.test.KPMETestCase;
030 import org.kuali.hr.time.service.base.TkServiceLocator;
031 import org.kuali.hr.time.util.TKUtils;
032
033 public class AccrualServiceTest extends KPMETestCase {
034 Date START_DATE = new Date((new DateTime(2012, 2, 20, 0, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
035 Date END_DATE = new Date((new DateTime(2012, 5, 3, 0, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
036
037 @Test
038 /*the employee has job A starts from 03/01/2012, ends on 04/01/2012 with standard hours of 40, so fte is 1.0
039 * job B starts on 04/01/2012, no end to it with standard hours of 20, fte is 0.5
040 * on 04/10/2012, there's a system scheduled time off of 8 hrs
041 */
042 public void testRunAccrualForStatusChange() {
043 String principal_id = "testUser";
044 List<LeaveBlock> leaveBlockList = (List<LeaveBlock>) TkServiceLocator.getLeaveBlockService().getLeaveBlocks(principal_id, START_DATE, END_DATE);
045 Assert.assertTrue("There are leave blocks before runAccrual for princiapl id " + principal_id, leaveBlockList.isEmpty());
046
047 // first time to run accrual from 02/20/2012 to 05/03/2012
048 TkServiceLocator.getLeaveAccrualService().runAccrual(principal_id, START_DATE, END_DATE, false);
049 verifyLeaveBlocksForStatusChange();
050
051 List<LeaveBlockHistory> historyList = TkServiceLocator.getLeaveBlockHistoryService().getLeaveBlockHistories(principal_id, null);
052 Assert.assertTrue("There should be 5 leave block history for emplyee " + principal_id + ", not " + historyList.size(), historyList.size()== 5);
053 LeaveBlockHistory lbh = historyList.get(0);
054 Assert.assertTrue("Leave Block Type of leave block history should be " + LMConstants.LEAVE_BLOCK_TYPE.ACCRUAL_SERVICE + ", not " + lbh.getLeaveBlockType()
055 , lbh.getLeaveBlockType().equals(LMConstants.LEAVE_BLOCK_TYPE.ACCRUAL_SERVICE));
056
057 // second time to run accrual from 02/20/2012 to 05/03/2012, should get the same results as first run
058 TkServiceLocator.getLeaveAccrualService().runAccrual(principal_id, START_DATE, END_DATE, false);
059 verifyLeaveBlocksForStatusChange();
060
061 historyList = TkServiceLocator.getLeaveBlockHistoryService().getLeaveBlockHistories(principal_id, null);
062 Assert.assertTrue("There should be 15 leave block history for employee " + principal_id + ", not " + historyList.size(), historyList.size()== 15);
063 }
064 private void verifyLeaveBlocksForStatusChange() {
065 String principal_id = "testUser";
066 List<LeaveBlock> leaveBlockList;
067 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocks(principal_id, START_DATE, END_DATE);
068 Assert.assertFalse("No leave blocks created by runAccrual for princiapl id " + principal_id, leaveBlockList.isEmpty());
069 Assert.assertTrue("There should be 5 leave blocks for emplyee 'testUser', not " + leaveBlockList.size(), leaveBlockList.size()== 5);
070
071 // there should be one leave block of 16 hours on 03/31/2012
072 Date intervalDate = new Date((new DateTime(2012, 3, 31, 5, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
073 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocksForDate(principal_id, intervalDate);
074 Assert.assertTrue("There should be 1 leave block for date 03/31/2012.", leaveBlockList.size()==1);
075 LeaveBlock lb = leaveBlockList.get(0);
076 Assert.assertTrue("Hours of the leave block for date 03/31/2012 should be 16, not " + lb.getLeaveAmount().toString(), lb.getLeaveAmount().equals(new BigDecimal(16)));
077 Assert.assertNull("lm_sys_schd_timeoff_id should be null for regular accrual leave block", lb.getScheduleTimeOffId());
078 Assert.assertTrue("Leave Block Type of leave block should be " + LMConstants.LEAVE_BLOCK_TYPE.ACCRUAL_SERVICE + ", not " + lb.getLeaveBlockType()
079 , lb.getLeaveBlockType().equals(LMConstants.LEAVE_BLOCK_TYPE.ACCRUAL_SERVICE));
080 Assert.assertTrue("Requst status of leave block should be " + LMConstants.REQUEST_STATUS.APPROVED + ", not " + lb.getRequestStatus()
081 , lb.getRequestStatus().equals(LMConstants.REQUEST_STATUS.APPROVED));
082
083 // employee changed status on 04/01, fte is changed from 1 to 0.5
084 // there should be an empty leave block for status change on 04/01/2012
085 intervalDate = new Date((new DateTime(2012, 4, 01, 5, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
086 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocksForDate(principal_id, intervalDate);
087 Assert.assertTrue("There should be 1 leave block for date 04/01/2012.", leaveBlockList.size()==1);
088 lb = leaveBlockList.get(0);
089 Assert.assertTrue("Hours of the leave block for date 04/01/2012 should be 0, not " + lb.getLeaveAmount().toString(), lb.getLeaveAmount().equals(BigDecimal.ZERO));
090 Assert.assertTrue("Leave Code of the leave block for date 04/01/2012 should be " + LMConstants.STATUS_CHANGE_EARN_CODE + ", not " + lb.getEarnCode()
091 , lb.getEarnCode().equals(LMConstants.STATUS_CHANGE_EARN_CODE));
092 Assert.assertNull("accrual_category should be null for empty status change leave block", lb.getAccrualCategory());
093 Assert.assertTrue("Leave Block Type of leave block should be " + LMConstants.LEAVE_BLOCK_TYPE.ACCRUAL_SERVICE + ", not " + lb.getLeaveBlockType()
094 , lb.getLeaveBlockType().equals(LMConstants.LEAVE_BLOCK_TYPE.ACCRUAL_SERVICE));
095 Assert.assertTrue("Requst status of leave block should be " + LMConstants.REQUEST_STATUS.APPROVED + ", not " + lb.getRequestStatus()
096 , lb.getRequestStatus().equals(LMConstants.REQUEST_STATUS.APPROVED));
097
098 // there should be two holiday leave blocks of 4 hours on 04/10/2012, one positive, one negative
099 intervalDate = new Date((new DateTime(2012, 4, 10, 5, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
100 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocksForDate(principal_id, intervalDate);
101 Assert.assertTrue("There should be 2 leave block for date 04/10/2012.", leaveBlockList.size()==2);
102 for(LeaveBlock aLeaveBlock : leaveBlockList) {
103 Assert.assertNotNull("lm_sys_schd_timeoff_id should NOT be null for holiday accrual leave block", aLeaveBlock.getScheduleTimeOffId());
104 Assert.assertTrue("Leave Block Type of leave block should be " + LMConstants.LEAVE_BLOCK_TYPE.ACCRUAL_SERVICE + ", not " + aLeaveBlock.getLeaveBlockType()
105 , aLeaveBlock.getLeaveBlockType().equals(LMConstants.LEAVE_BLOCK_TYPE.ACCRUAL_SERVICE));
106 Assert.assertTrue("Requst status of leave block should be " + LMConstants.REQUEST_STATUS.APPROVED + ", not " + aLeaveBlock.getRequestStatus()
107 , aLeaveBlock.getRequestStatus().equals(LMConstants.REQUEST_STATUS.APPROVED));
108 if(!aLeaveBlock.getLeaveAmount().equals(new BigDecimal(4)) && !aLeaveBlock.getLeaveAmount().equals(new BigDecimal(-4))) {
109 Assert.fail("Hours of the leave blocks for date 04/10/2012 should be either 4 or -4, not " + aLeaveBlock.getLeaveAmount().toString());
110 }
111 }
112
113 // the disabled system scheduled time off on 04/20/2012 should not generate accruals
114 intervalDate = new Date((new DateTime(2012, 4, 20, 5, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
115 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocksForDate(principal_id, intervalDate);
116 Assert.assertTrue("There should be 0 leave block for date 04/20/2012.", leaveBlockList.isEmpty());
117
118 // there should be 1 leave blocks on 04/30/2012, regular accrual of 8 hours
119 intervalDate = new Date((new DateTime(2012, 4, 30, 5, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
120 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocksForDate(principal_id, intervalDate);
121 Assert.assertTrue("There should be 1 leave block for date 04/30/2012.", leaveBlockList.size()==1);
122 lb = leaveBlockList.get(0);
123 Assert.assertTrue("Hours of the regular accrual leave block for date 04/30/2012 should be 8, not " + lb.getLeaveAmount().toString(), lb.getLeaveAmount().equals(new BigDecimal(8)));
124 Assert.assertNull("lm_sys_schd_timeoff_id should be null for regular accrual leave block", lb.getScheduleTimeOffId());
125 Assert.assertTrue("Leave Block Type of leave block should be " + LMConstants.LEAVE_BLOCK_TYPE.ACCRUAL_SERVICE + ", not " + lb.getLeaveBlockType()
126 , lb.getLeaveBlockType().equals(LMConstants.LEAVE_BLOCK_TYPE.ACCRUAL_SERVICE));
127 Assert.assertTrue("Requst status of leave block should be " + LMConstants.REQUEST_STATUS.APPROVED + ", not " + lb.getRequestStatus()
128 , lb.getRequestStatus().equals(LMConstants.REQUEST_STATUS.APPROVED));
129 }
130
131 @Test
132 /* testUser's leavePlan "testLP" has planning month of 12
133 * after calculateFutureAccrualUsingPlanningMonth, try to get leaveBlock for 18 months in the future
134 * should still get 12 or 13 leave blocks depends on the date the test is running.
135 * The accrual service also goes back 1 year for accrual runs.
136 */
137 public void testCalculateFutureAccrualUsingPlanningMonth() {
138 String principal_id = "testUser";
139 // the planning month of this leave plan is set to 12
140 Date currentDate = TKUtils.getCurrentDate();
141 TkServiceLocator.getLeaveAccrualService().calculateFutureAccrualUsingPlanningMonth(principal_id, currentDate);
142 Calendar aCal = Calendar.getInstance();
143 aCal.setTime(currentDate);
144 int futureSize = 12;
145 int allSize = 17;
146 if(aCal.getActualMaximum(Calendar.DAY_OF_MONTH) == aCal.get(Calendar.DATE)) {
147 futureSize ++;
148 allSize ++;
149 }
150
151 aCal.add(Calendar.MONTH, 18);
152
153 Date endDate = new java.sql.Date(aCal.getTime().getTime());
154 // lookup future leave blocks up to 18 months in the future
155 List<LeaveBlock> leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocks(principal_id, currentDate, aCal.getTime());
156
157 Assert.assertFalse("No leave blocks created by calculateF?utureAccrualUsingPlanningMonth for princiapl id " + principal_id, leaveBlockList.isEmpty());
158 Assert.assertTrue("There should be " + futureSize + " leave blocks for employee 'testUser', not " + leaveBlockList.size(), leaveBlockList.size()== futureSize);
159
160 aCal.setTime(currentDate);
161 aCal.add(Calendar.MONTH, -5);
162 Date startDate = new java.sql.Date(aCal.getTime().getTime());
163 // lookup leave blocks including past and future
164 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocks(principal_id, startDate, endDate);
165 Assert.assertTrue("There should be " + allSize + " leave blocks for employee 'testUser', not " + leaveBlockList.size(), leaveBlockList.size()== allSize);
166 }
167
168 @Test
169 /*
170 *testUser2 has two accrual category rules, rule 1 goes from 0 month to 5 with accrual rate of 16
171 *rule 2 goes from 5 to 900 with accrual rate of 24
172 *run accrual for testUser2 for 15 months
173 */
174 public void testRunAccrualForRuleChanges() {
175 String principal_id = "testUser2";
176 Calendar aCal = Calendar.getInstance();
177 aCal.setTime(START_DATE);
178 aCal.add(Calendar.MONTH, 15);
179 Date endDate = new java.sql.Date(aCal.getTime().getTime());
180
181 List<LeaveBlock> leaveBlockList = (List<LeaveBlock>) TkServiceLocator.getLeaveBlockService().getLeaveBlocks(principal_id, START_DATE, endDate);
182 Assert.assertTrue("There are leave blocks before runAccrual for princiapl id " + principal_id, leaveBlockList.isEmpty());
183
184 TkServiceLocator.getLeaveAccrualService().runAccrual(principal_id, START_DATE, endDate, false);
185
186 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocks(principal_id, START_DATE, endDate);
187 Assert.assertTrue("There should be 14 leave blocks for emplyee " + principal_id + ", not " + leaveBlockList.size(), leaveBlockList.size()== 14);
188
189 // July of 2012 is the 5th month of this user's employment, the accrual rate should be 16
190 Date intervalDate = new Date((new DateTime(2012, 7, 31, 5, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
191 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocksForDate(principal_id, intervalDate);
192 Assert.assertTrue("There should be 1 leave block for employee " + principal_id + " for date 07/31/2012.", leaveBlockList.size()==1);
193 LeaveBlock lb = leaveBlockList.get(0);
194 Assert.assertTrue("Hours of the leave block on date 07/31/2012 for employee " + principal_id + " should be 16, not " + lb.getLeaveAmount().toString()
195 , lb.getLeaveAmount().equals(new BigDecimal(16)));
196
197 // August of 2012 is the 6th month of this user's employment, the accrual rate should be 24 from now on
198 intervalDate = new Date((new DateTime(2012, 8, 31, 5, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
199 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocksForDate(principal_id, intervalDate);
200 Assert.assertTrue("There should be 1 leave block for employee " + principal_id + " for date 08/31/2012.", leaveBlockList.size()==1);
201 lb = leaveBlockList.get(0);
202 Assert.assertTrue("Hours of the leave block for date 08/31/2012 for employee " + principal_id + " should be 24, not " + lb.getLeaveAmount().toString()
203 , lb.getLeaveAmount().equals(new BigDecimal(24)));
204
205 }
206 @Test
207 /* testUser3's leavePlan has 2 accrual categories with different accrual intervals
208 * testAC3 has accrual interval semi-monthly
209 * testAC4 has accrual interval monthly
210 */
211 public void testRunAccrualWithDifferentAccrualIntervals() {
212 String principal_id = "testUser3";
213 List<LeaveBlock> leaveBlockList = (List<LeaveBlock>) TkServiceLocator.getLeaveBlockService().getLeaveBlocks(principal_id, START_DATE, END_DATE);
214 Assert.assertTrue("There are leave blocks before runAccrual for princiapl id " + principal_id, leaveBlockList.isEmpty());
215
216 TkServiceLocator.getLeaveAccrualService().runAccrual(principal_id, START_DATE, END_DATE, false);
217 leaveBlockList = (List<LeaveBlock>) TkServiceLocator.getLeaveBlockService().getLeaveBlocks(principal_id, START_DATE, END_DATE);
218 Assert.assertTrue("There should be 6 leave blocks for emplyee " + principal_id + ", not " + leaveBlockList.size(), leaveBlockList.size()== 6);
219
220 Date semiMonthlyDate = new Date((new DateTime(2012, 3, 15, 5, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
221 Date monthlyDate = new Date((new DateTime(2012, 3, 31, 5, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
222 this.verifyLeaveBlocksWithDifferentAccrualIntervals(semiMonthlyDate, monthlyDate);
223
224 semiMonthlyDate = new Date((new DateTime(2012, 4, 15, 5, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
225 monthlyDate = new Date((new DateTime(2012, 4, 30, 5, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
226 this.verifyLeaveBlocksWithDifferentAccrualIntervals(semiMonthlyDate, monthlyDate);
227
228 }
229 public void verifyLeaveBlocksWithDifferentAccrualIntervals(Date semiMonthlyDate, Date monthlyDate) {
230 String principal_id = "testUser3";
231 List<LeaveBlock> leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocksForDate(principal_id, semiMonthlyDate);
232 Assert.assertTrue("There should be 1 leave block for date " + semiMonthlyDate.toString() + " for emplyee " + principal_id, leaveBlockList.size()==1);
233 LeaveBlock lb = leaveBlockList.get(0);
234 Assert.assertTrue("Hours of the leave block on date " + semiMonthlyDate.toString() + " should be 8, not " + lb.getLeaveAmount().toString(), lb.getLeaveAmount().equals(new BigDecimal(8)));
235 Assert.assertTrue("Leave code of the leave block on date " + semiMonthlyDate.toString() + " should be EC1, not " + lb.getEarnCode(), lb.getEarnCode().equals("EC1"));
236 Assert.assertTrue("accrual_category of the leave block on date " + semiMonthlyDate.toString() + " should be testAC3, not " + lb.getAccrualCategory(), lb.getAccrualCategory().equals("testAC3"));
237
238
239 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocksForDate(principal_id, monthlyDate);
240 Assert.assertTrue("There should be 2 leave block for date " + monthlyDate.toString() + " for emplyee " + principal_id, leaveBlockList.size()==2);
241 for(LeaveBlock aLeaveBlock : leaveBlockList) {
242 if(aLeaveBlock.getAccrualCategory().equals("testAC3")) {
243 Assert.assertTrue("Leave code of the leave block with accrualCategory testAC3 on date " + monthlyDate.toString() + " should be EC1, not " + aLeaveBlock.getEarnCode()
244 , aLeaveBlock.getEarnCode().equals("EC1"));
245 Assert.assertTrue("Hours of the leave block with accrualCategory testAC4 on date " + monthlyDate.toString() + " should be 8, not " + aLeaveBlock.getLeaveAmount().toString()
246 , aLeaveBlock.getLeaveAmount().equals(new BigDecimal(8)));
247 } else if(aLeaveBlock.getAccrualCategory().equals("testAC4")) {
248 Assert.assertTrue("Leave code of the leave block with accrualCategory testAC4 on date " + monthlyDate.toString() + " should be EC2, not " + aLeaveBlock.getEarnCode()
249 , aLeaveBlock.getEarnCode().equals("EC2"));
250 Assert.assertTrue("Hours of the leave block with accrualCategory testAC4 on date " + monthlyDate.toString() + " should be 24, not " + aLeaveBlock.getLeaveAmount().toString()
251 , aLeaveBlock.getLeaveAmount().equals(new BigDecimal(24)));
252 } else {
253 Assert.fail("Leave block on date " + monthlyDate.toString() + " should not have accrual_category " + aLeaveBlock.getAccrualCategory());
254 }
255 }
256 }
257
258 @Test
259 /* testUser4 has PrincipalHRAttributes that's associated with 2 accrual categories, one is testAC5, the other is testAC6
260 * testAC5 has minimum accrual of 0.5, proration = true
261 * testAC6 has minimum accrual of 0
262 * testUser4 has records of principalHRAttributes, the employment is from 03/18/2012 to 08/08/2012
263 * There should not be accrual for testAC5 in March and August of 2012 since minimum percentage is not reached
264 */
265 public void testMinNotReachedProrationTrueFirstLastPeriod() {
266 String principal_id = "testUser4";
267 Date end = new Date((new DateTime(2012, 9, 25, 0, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
268 List<LeaveBlock> leaveBlockList = (List<LeaveBlock>) TkServiceLocator.getLeaveBlockService().getLeaveBlocks(principal_id, START_DATE, end);
269 Assert.assertTrue("There are leave blocks before runAccrual for princiapl id " + principal_id, leaveBlockList.isEmpty());
270
271 TkServiceLocator.getLeaveAccrualService().runAccrual(principal_id, START_DATE, end, false);
272 leaveBlockList = (List<LeaveBlock>) TkServiceLocator.getLeaveBlockService().getLeaveBlocks(principal_id, START_DATE, end);
273 Assert.assertTrue("There should be 10 leave blocks for emplyee " + principal_id + ", not " + leaveBlockList.size(), leaveBlockList.size()== 10);
274
275 Date monthlyDate = new Date((new DateTime(2012, 3, 31, 5, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
276 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocksForDate(principal_id, monthlyDate);
277 Assert.assertTrue("There should be 1 leave block for date " + monthlyDate.toString() + " for emplyee " + principal_id, leaveBlockList.size()==1);
278 LeaveBlock lb = leaveBlockList.get(0);
279 Assert.assertTrue("Leave block on date " + monthlyDate.toString() + " should have accrual_category testAC6, not " + lb.getAccrualCategory()
280 , lb.getAccrualCategory().equals("testAC6"));
281 Assert.assertTrue("Leave block on date " + monthlyDate.toString() + " should have 7 hours, not " + lb.getLeaveAmount()
282 , lb.getLeaveAmount().equals(new BigDecimal(7)));
283
284 monthlyDate = new Date((new DateTime(2012, 4, 30, 5, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
285 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocksForDate(principal_id, monthlyDate);
286 Assert.assertTrue("There should be 2 leave block for date " + monthlyDate.toString() + " for emplyee " + principal_id, leaveBlockList.size()==2);
287
288 // should the accrual of the last days show up on the end day or the interval day of the last pay period?????
289 monthlyDate = new Date((new DateTime(2012, 8, 8, 5, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
290 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocksForDate(principal_id, monthlyDate);
291 Assert.assertTrue("There should be 1 leave block for date " + monthlyDate.toString() + " for emplyee " + principal_id, leaveBlockList.size()==1);
292 lb = leaveBlockList.get(0);
293 Assert.assertTrue("Leave block on date " + monthlyDate.toString() + " should have accrual_category testAC6, not " + lb.getAccrualCategory()
294 , lb.getAccrualCategory().equals("testAC6"));
295 Assert.assertTrue("Leave block on date " + monthlyDate.toString() + " should have 4 hours, not " + lb.getLeaveAmount()
296 , lb.getLeaveAmount().equals(new BigDecimal(4)));
297
298 monthlyDate = new Date((new DateTime(2012, 8, 31, 5, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
299 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocksForDate(principal_id, monthlyDate);
300 Assert.assertTrue("There should NOT be any leave blocks for date " + monthlyDate.toString() + " for emplyee " + principal_id, leaveBlockList.size()==0);
301 }
302 @Test
303 /* testUser9 has PrincipalHRAttributes that's associated with accrual categories "testAC12"
304 * testAC12 has minimum accrual of 0.5, proration = true, fte of the ac rule is 8
305 * testUser9 has records of principalHRAttributes, the employment is from 03/10/2012 to 08/20/2012
306 * There should be partial fte accrued for testAC12 in March and August of 2012 since minimum percentage is reached
307 */
308 public void testMinReachedProrationTrueFirstLastPeriod() {
309 String principal_id = "testUser9";
310 Date end = new Date((new DateTime(2012, 9, 25, 0, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
311 List<LeaveBlock> leaveBlockList = (List<LeaveBlock>) TkServiceLocator.getLeaveBlockService().getLeaveBlocks(principal_id, START_DATE, end);
312 Assert.assertTrue("There are leave blocks before runAccrual for princiapl id " + principal_id, leaveBlockList.isEmpty());
313
314 TkServiceLocator.getLeaveAccrualService().runAccrual(principal_id, START_DATE, end, false);
315 leaveBlockList = (List<LeaveBlock>) TkServiceLocator.getLeaveBlockService().getLeaveBlocks(principal_id, START_DATE, end);
316 Assert.assertTrue("There should be 6 leave blocks for emplyee " + principal_id + ", not " + leaveBlockList.size(), leaveBlockList.size()== 6);
317
318 Date monthlyDate = new Date((new DateTime(2012, 3, 31, 5, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
319 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocksForDate(principal_id, monthlyDate);
320 Assert.assertTrue("There should be 1 leave block for date " + monthlyDate.toString() + " for emplyee " + principal_id, leaveBlockList.size()==1);
321 LeaveBlock lb = leaveBlockList.get(0);
322 Assert.assertTrue("Leave block on date " + monthlyDate.toString() + " should have 5 hours, not " + lb.getLeaveAmount()
323 , lb.getLeaveAmount().equals(new BigDecimal(5)));
324
325 monthlyDate = new Date((new DateTime(2012, 4, 30, 5, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
326 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocksForDate(principal_id, monthlyDate);
327 Assert.assertTrue("There should be 1 leave block for date " + monthlyDate.toString() + " for emplyee " + principal_id, leaveBlockList.size()==1);
328 lb = leaveBlockList.get(0);
329 Assert.assertTrue("Leave block on date " + monthlyDate.toString() + " should have 8 hours, not " + lb.getLeaveAmount()
330 , lb.getLeaveAmount().equals(new BigDecimal(8)));
331
332 monthlyDate = new Date((new DateTime(2012, 8, 20, 5, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
333 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocksForDate(principal_id, monthlyDate);
334 Assert.assertTrue("There should be 1 leave block for date " + monthlyDate.toString() + " for emplyee " + principal_id, leaveBlockList.size()==1);
335 lb = leaveBlockList.get(0);
336 Assert.assertTrue("Leave block on date " + monthlyDate.toString() + " should have 5 hours, not " + lb.getLeaveAmount()
337 , lb.getLeaveAmount().equals(new BigDecimal(5)));
338
339 monthlyDate = new Date((new DateTime(2012, 8, 31, 5, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
340 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocksForDate(principal_id, monthlyDate);
341 Assert.assertTrue("There should NOT be any leave blocks for date " + monthlyDate.toString() + " for emplyee " + principal_id, leaveBlockList.size()==0);
342 }
343 @Test
344 /* testUser10 has PrincipalHRAttributes that's associated with accrual categories "testAC13"
345 * testAC13 has minimum accrual of 0.5, proration = false
346 * testUser10 has records of principalHRAttributes, the employment is from 03/10/2012 to 08/20/2012
347 * There should be whole fte accrued for testAC13 in March and August of 2012 since minimum percentage is reached
348 */
349 public void testMinReachedProrationFalseFirstLastPeriod() {
350 String principal_id = "testUser10";
351 Date end = new Date((new DateTime(2012, 9, 25, 0, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
352 List<LeaveBlock> leaveBlockList = (List<LeaveBlock>) TkServiceLocator.getLeaveBlockService().getLeaveBlocks(principal_id, START_DATE, end);
353 Assert.assertTrue("There are leave blocks before runAccrual for princiapl id " + principal_id, leaveBlockList.isEmpty());
354
355 TkServiceLocator.getLeaveAccrualService().runAccrual(principal_id, START_DATE, end, false);
356 leaveBlockList = (List<LeaveBlock>) TkServiceLocator.getLeaveBlockService().getLeaveBlocks(principal_id, START_DATE, end);
357 Assert.assertTrue("There should be 6 leave blocks for emplyee " + principal_id + ", not " + leaveBlockList.size(), leaveBlockList.size()== 6);
358
359 Date monthlyDate = new Date((new DateTime(2012, 3, 31, 5, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
360 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocksForDate(principal_id, monthlyDate);
361 Assert.assertTrue("There should be 1 leave block for date " + monthlyDate.toString() + " for emplyee " + principal_id, leaveBlockList.size()==1);
362 LeaveBlock lb = leaveBlockList.get(0);
363 Assert.assertTrue("Leave block on date " + monthlyDate.toString() + " should have 8 hours, not " + lb.getLeaveAmount()
364 , lb.getLeaveAmount().equals(new BigDecimal(8)));
365
366 monthlyDate = new Date((new DateTime(2012, 4, 30, 5, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
367 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocksForDate(principal_id, monthlyDate);
368 Assert.assertTrue("There should be 1 leave block for date " + monthlyDate.toString() + " for emplyee " + principal_id, leaveBlockList.size()==1);
369 lb = leaveBlockList.get(0);
370 Assert.assertTrue("Leave block on date " + monthlyDate.toString() + " should have 8 hours, not " + lb.getLeaveAmount()
371 , lb.getLeaveAmount().equals(new BigDecimal(8)));
372
373 monthlyDate = new Date((new DateTime(2012, 8, 20, 5, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
374 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocksForDate(principal_id, monthlyDate);
375 Assert.assertTrue("There should be 1 leave block for date " + monthlyDate.toString() + " for emplyee " + principal_id, leaveBlockList.size()==1);
376 lb = leaveBlockList.get(0);
377 Assert.assertTrue("Leave block on date " + monthlyDate.toString() + " should have 8 hours, not " + lb.getLeaveAmount()
378 , lb.getLeaveAmount().equals(new BigDecimal(8)));
379
380 monthlyDate = new Date((new DateTime(2012, 8, 31, 5, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
381 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocksForDate(principal_id, monthlyDate);
382 Assert.assertTrue("There should NOT be any leave blocks for date " + monthlyDate.toString() + " for emplyee " + principal_id, leaveBlockList.size()==0);
383 }
384
385 @Test
386 /* testUser11 has PrincipalHRAttributes that's associated with accrual categories "testAC14"
387 * testAC14 has minimum accrual of 0.5, proration = false
388 * testUser11 has records of principalHRAttributes, the employment is from 03/20/2012 to 08/10/2012
389 * There should NOT be accrual leave blocks for testAC14 in March and August of 2012 since minimum percentage is NOT reached
390 */
391 public void testMinNotReachedProrationFalseFirstLastPeriod() {
392 String principal_id = "testUser11";
393 Date end = new Date((new DateTime(2012, 9, 25, 0, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
394 List<LeaveBlock> leaveBlockList = (List<LeaveBlock>) TkServiceLocator.getLeaveBlockService().getLeaveBlocks(principal_id, START_DATE, end);
395 Assert.assertTrue("There are leave blocks before runAccrual for princiapl id " + principal_id, leaveBlockList.isEmpty());
396
397 TkServiceLocator.getLeaveAccrualService().runAccrual(principal_id, START_DATE, end, false);
398 leaveBlockList = (List<LeaveBlock>) TkServiceLocator.getLeaveBlockService().getLeaveBlocks(principal_id, START_DATE, end);
399 Assert.assertTrue("There should be 4 leave blocks for emplyee " + principal_id + ", not " + leaveBlockList.size(), leaveBlockList.size()== 4);
400
401 Date monthlyDate = new Date((new DateTime(2012, 3, 31, 5, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
402 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocksForDate(principal_id, monthlyDate);
403 Assert.assertTrue("There should be 0 leave block for date " + monthlyDate.toString() + " for emplyee " + principal_id, leaveBlockList.isEmpty());
404
405 monthlyDate = new Date((new DateTime(2012, 4, 30, 5, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
406 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocksForDate(principal_id, monthlyDate);
407 Assert.assertTrue("There should be 1 leave block for date " + monthlyDate.toString() + " for emplyee " + principal_id, leaveBlockList.size()==1);
408 LeaveBlock lb = leaveBlockList.get(0);
409 Assert.assertTrue("Leave block on date " + monthlyDate.toString() + " should have 8 hours, not " + lb.getLeaveAmount()
410 , lb.getLeaveAmount().equals(new BigDecimal(8)));
411
412 monthlyDate = new Date((new DateTime(2012, 8, 20, 5, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
413 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocksForDate(principal_id, monthlyDate);
414 Assert.assertTrue("There should be 0 leave block for date " + monthlyDate.toString() + " for emplyee " + principal_id, leaveBlockList.isEmpty());
415
416 monthlyDate = new Date((new DateTime(2012, 8, 31, 5, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
417 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocksForDate(principal_id, monthlyDate);
418 Assert.assertTrue("There should NOT be any leave blocks for date " + monthlyDate.toString() + " for emplyee " + principal_id, leaveBlockList.size()==0);
419 }
420 @Test
421 /* testUser5's service date is 2012-03-10
422 * testUser5 has two accrual category rules, rule 1 goes from 0 month to 12 with accrual rate of 16
423 * rule 2 goes from 12 to 900 with accrual rate of 24
424 * accrual category associated with the two rules has Proration=false, and minimum percentage of 0.5
425 * run accrual for testUser5 for 18 months
426 */
427 public void testMinReachedProrationFalseAndRuleChange() {
428 String principal_id = "testUser5";
429 Calendar aCal = Calendar.getInstance();
430 aCal.setTime(START_DATE);
431 aCal.add(Calendar.MONTH, 18);
432 Date endDate = new java.sql.Date(aCal.getTime().getTime());
433
434 List<LeaveBlock> leaveBlockList = (List<LeaveBlock>) TkServiceLocator.getLeaveBlockService().getLeaveBlocks(principal_id, START_DATE, endDate);
435 Assert.assertTrue("There are leave blocks before runAccrual for princiapl id " + principal_id, leaveBlockList.isEmpty());
436
437 TkServiceLocator.getLeaveAccrualService().runAccrual(principal_id, START_DATE, endDate, false);
438
439 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocks(principal_id, START_DATE, endDate);
440 Assert.assertTrue("There should be 17 leave blocks for emplyee " + principal_id + ", not " + leaveBlockList.size(), leaveBlockList.size()== 17);
441
442 // 03/31/2012 is the first accrual interval date, service starts on 2012-03-10, so minimum percentage is reached for that month
443 // since proration is false, the whole accrual rate is created for the first pay period
444 Date intervalDate = new Date((new DateTime(2012, 3, 31, 5, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
445 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocksForDate(principal_id, intervalDate);
446 Assert.assertTrue("There should be 1 leave block for date " + intervalDate.toString() + " for emplyee " + principal_id, leaveBlockList.size()==1);
447 LeaveBlock lb = leaveBlockList.get(0);
448 Assert.assertTrue("Leave block on date " + intervalDate.toString() + " should have 16 hours, not " + lb.getLeaveAmount()
449 , lb.getLeaveAmount().equals(new BigDecimal(16)));
450
451 // 02/28/2013 is the 12th month of this user's employment, the accrual rate should be 16
452 intervalDate = new Date((new DateTime(2013, 2, 28, 5, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
453 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocksForDate(principal_id, intervalDate);
454 Assert.assertTrue("There should be 1 leave block for employee " + principal_id + " for date 02/28/2013.", leaveBlockList.size()==1);
455 lb = leaveBlockList.get(0);
456 Assert.assertTrue("Hours of the leave block on date " + intervalDate.toString() + " should be 16, not " + lb.getLeaveAmount().toString()
457 , lb.getLeaveAmount().equals(new BigDecimal(16)));
458
459 // 03/31/2013 is the 13th month of this user's employment, since the minimum percentage of days is meet for
460 // that month (03/10 - 03/31) and proration = false, the accrual rate should be 24 from now on
461 intervalDate = new Date((new DateTime(2013, 3, 31, 5, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
462 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocksForDate(principal_id, intervalDate);
463 Assert.assertTrue("There should be 1 leave block for employee " + principal_id + " for date " + intervalDate.toString(), leaveBlockList.size()==1);
464 lb = leaveBlockList.get(0);
465 Assert.assertTrue("Hours of the leave block for date " + intervalDate.toString() + " should be 24, not " + lb.getLeaveAmount().toString()
466 , lb.getLeaveAmount().equals(new BigDecimal(24)));
467 }
468 @Test
469 /* testUser12's service date is 2012-03-20
470 * testUser12 has two accrual category rules, rule 1 goes from 6 month to 12 with accrual rate of 16
471 * rule 2 goes from 6 to 900 with accrual rate of 24
472 * accrual category "testAC15" is associated with the two rules. testAC15 has Proration=false, and minimum percentage of 0.5
473 * run accrual for testUser12 for 12 months
474 * for 2012-09-30, the accrual should still be 16 since the minimum is NOT reached for the rule 2
475 */
476 public void testMinNotReachedProrationFalseAndRuleChange() {
477 String principal_id = "testUser12";
478 Calendar aCal = Calendar.getInstance();
479 aCal.setTime(START_DATE);
480 aCal.add(Calendar.MONTH, 18);
481 Date endDate = new java.sql.Date(aCal.getTime().getTime());
482
483 List<LeaveBlock> leaveBlockList = (List<LeaveBlock>) TkServiceLocator.getLeaveBlockService().getLeaveBlocks(principal_id, START_DATE, endDate);
484 Assert.assertTrue("There are leave blocks before runAccrual for princiapl id " + principal_id, leaveBlockList.isEmpty());
485
486 TkServiceLocator.getLeaveAccrualService().runAccrual(principal_id, START_DATE, endDate, false);
487
488 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocks(principal_id, START_DATE, endDate);
489 Assert.assertTrue("There should be 17 leave blocks for emplyee " + principal_id + ", not " + leaveBlockList.size(), leaveBlockList.size()== 17);
490 // 08/31/2013
491 Date intervalDate = new Date((new DateTime(2012, 8, 31, 5, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
492 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocksForDate(principal_id, intervalDate);
493 Assert.assertTrue("There should be 1 leave block for employee " + principal_id + " for date " + intervalDate.toString(), leaveBlockList.size()==1);
494 LeaveBlock lb = leaveBlockList.get(0);
495 Assert.assertTrue("Hours of the leave block for date " + intervalDate.toString() + " should be 16, not " + lb.getLeaveAmount().toString()
496 , lb.getLeaveAmount().equals(new BigDecimal(16)));
497
498 // 09/30/2012 is the 6th month of this user's employment, since minimum percentage is not reached, the accrual rate should be 16
499 intervalDate = new Date((new DateTime(2012, 9, 30, 5, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
500 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocksForDate(principal_id, intervalDate);
501 Assert.assertTrue("There should be 1 leave block for date " + intervalDate.toString() + " for emplyee " + principal_id, leaveBlockList.size()==1);
502 lb = leaveBlockList.get(0);
503 Assert.assertTrue("Leave block on date " + intervalDate.toString() + " should have 16 hours, not " + lb.getLeaveAmount()
504 , lb.getLeaveAmount().equals(new BigDecimal(16)));
505
506 // 10/31/2013
507 intervalDate = new Date((new DateTime(2012, 10, 31, 5, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
508 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocksForDate(principal_id, intervalDate);
509 Assert.assertTrue("There should be 1 leave block for employee " + principal_id + " for date " + intervalDate.toString(), leaveBlockList.size()==1);
510 lb = leaveBlockList.get(0);
511 Assert.assertTrue("Hours of the leave block on date " + intervalDate.toString() + " should be 24, not " + lb.getLeaveAmount().toString()
512 , lb.getLeaveAmount().equals(new BigDecimal(24)));
513 }
514 @Test
515 /* testUser13's service date is 2012-03-10
516 * testUser13 has two accrual category rules, rule 1 goes from 0 month to 6 with accrual rate of 16
517 * rule 2 goes from 6 to 900 with accrual rate of 24
518 * accrual category "testAC16" is associated with the two rules. testAC16 has Proration=true, and minimum percentage of 0.5
519 * run accrual for testUser13 for 12 months
520 * for 2012-09-30, the accrual should be based on actual work days for those two rules, ie 22 because the minimum is reached for rule 2
521 */
522 public void testMinReachedProrationTrueAndRuleChange() {
523 String principal_id = "testUser13";
524 Calendar aCal = Calendar.getInstance();
525 aCal.setTime(START_DATE);
526 aCal.add(Calendar.MONTH, 18);
527 Date endDate = new java.sql.Date(aCal.getTime().getTime());
528
529 List<LeaveBlock> leaveBlockList = (List<LeaveBlock>) TkServiceLocator.getLeaveBlockService().getLeaveBlocks(principal_id, START_DATE, endDate);
530 Assert.assertTrue("There are leave blocks before runAccrual for princiapl id " + principal_id, leaveBlockList.isEmpty());
531
532 TkServiceLocator.getLeaveAccrualService().runAccrual(principal_id, START_DATE, endDate, false);
533
534 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocks(principal_id, START_DATE, endDate);
535 Assert.assertTrue("There should be 17 leave blocks for emplyee " + principal_id + ", not " + leaveBlockList.size(), leaveBlockList.size()== 17);
536 // 08/31/2013
537 Date intervalDate = new Date((new DateTime(2012, 8, 31, 5, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
538 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocksForDate(principal_id, intervalDate);
539 Assert.assertTrue("There should be 1 leave block for employee " + principal_id + " for date " + intervalDate.toString(), leaveBlockList.size()==1);
540 LeaveBlock lb = leaveBlockList.get(0);
541 Assert.assertTrue("Hours of the leave block for date " + intervalDate.toString() + " should be 16, not " + lb.getLeaveAmount().toString()
542 , lb.getLeaveAmount().equals(new BigDecimal(16)));
543
544 // 09/30/2012 is the 6th month of this user's employment, since minimum percentage is reached, the accrual rate is 16 for 6 work days
545 // and 24 hrs for 14 work days, so the final accrual hrs is 22
546 intervalDate = new Date((new DateTime(2012, 9, 30, 5, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
547 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocksForDate(principal_id, intervalDate);
548 Assert.assertTrue("There should be 1 leave block for date " + intervalDate.toString() + " for emplyee " + principal_id, leaveBlockList.size()==1);
549 lb = leaveBlockList.get(0);
550 Assert.assertTrue("Leave block on date " + intervalDate.toString() + " should have 22 hours, not " + lb.getLeaveAmount()
551 , lb.getLeaveAmount().equals(new BigDecimal(22)));
552
553 // 10/31/2013
554 intervalDate = new Date((new DateTime(2012, 10, 31, 5, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
555 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocksForDate(principal_id, intervalDate);
556 Assert.assertTrue("There should be 1 leave block for employee " + principal_id + " for date " + intervalDate.toString(), leaveBlockList.size()==1);
557 lb = leaveBlockList.get(0);
558 Assert.assertTrue("Hours of the leave block on date " + intervalDate.toString() + " should be 24, not " + lb.getLeaveAmount().toString()
559 , lb.getLeaveAmount().equals(new BigDecimal(24)));
560 }
561 @Test
562 /* testUser14's service date is 2012-03-20
563 * testUser14 has two accrual category rules, rule 1 goes from 0 month to 6 with accrual rate of 16
564 * rule 2 goes from 6 to 900 with accrual rate of 24
565 * accrual category "testAC17" is associated with the two rules. testAC17 has Proration=true, and minimum percentage of 0.5
566 * run accrual for testUser14 for 12 months
567 * for 2012-09-30, the accrual should be 16 since the minimum is NOT reached for the rule 2
568 */
569 public void testMinNotReachedProrationTrueAndRuleChange() {
570 String principal_id = "testUser14";
571 Calendar aCal = Calendar.getInstance();
572 aCal.setTime(START_DATE);
573 aCal.add(Calendar.MONTH, 18);
574 Date endDate = new java.sql.Date(aCal.getTime().getTime());
575
576 List<LeaveBlock> leaveBlockList = (List<LeaveBlock>) TkServiceLocator.getLeaveBlockService().getLeaveBlocks(principal_id, START_DATE, endDate);
577 Assert.assertTrue("There are leave blocks before runAccrual for princiapl id " + principal_id, leaveBlockList.isEmpty());
578
579 TkServiceLocator.getLeaveAccrualService().runAccrual(principal_id, START_DATE, endDate, false);
580 // only 16 leave blocks since the first interval 03/31/2012 does not have accruals due to minimum not reached
581 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocks(principal_id, START_DATE, endDate);
582 Assert.assertTrue("There should be 16 leave blocks for emplyee " + principal_id + ", not " + leaveBlockList.size(), leaveBlockList.size()== 16);
583
584 // 03/31/2013
585 Date intervalDate = new Date((new DateTime(2012, 3, 31, 5, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
586 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocksForDate(principal_id, intervalDate);
587 Assert.assertTrue("There should be 0 leave block for employee " + principal_id + " for date " + intervalDate.toString(), leaveBlockList.isEmpty());
588
589 // 08/31/2013
590 intervalDate = new Date((new DateTime(2012, 8, 31, 5, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
591 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocksForDate(principal_id, intervalDate);
592 Assert.assertTrue("There should be 1 leave block for employee " + principal_id + " for date " + intervalDate.toString(), leaveBlockList.size()==1);
593 LeaveBlock lb = leaveBlockList.get(0);
594 Assert.assertTrue("Hours of the leave block for date " + intervalDate.toString() + " should be 16, not " + lb.getLeaveAmount().toString()
595 , lb.getLeaveAmount().equals(new BigDecimal(16)));
596
597 // 09/30/2012 is the 6th month of this user's employment, since minimum percentage is NOT reached, the accrual rate should be 16
598 intervalDate = new Date((new DateTime(2012, 9, 30, 5, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
599 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocksForDate(principal_id, intervalDate);
600 Assert.assertTrue("There should be 1 leave block for date " + intervalDate.toString() + " for emplyee " + principal_id, leaveBlockList.size()==1);
601 lb = leaveBlockList.get(0);
602 Assert.assertTrue("Leave block on date " + intervalDate.toString() + " should have 16 hours, not " + lb.getLeaveAmount()
603 , lb.getLeaveAmount().equals(new BigDecimal(16)));
604
605 // 10/31/2013
606 intervalDate = new Date((new DateTime(2012, 10, 31, 5, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
607 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocksForDate(principal_id, intervalDate);
608 Assert.assertTrue("There should be 1 leave block for employee " + principal_id + " for date " + intervalDate.toString(), leaveBlockList.size()==1);
609 lb = leaveBlockList.get(0);
610 Assert.assertTrue("Hours of the leave block on date " + intervalDate.toString() + " should be 24, not " + lb.getLeaveAmount().toString()
611 , lb.getLeaveAmount().equals(new BigDecimal(24)));
612 }
613 @Test
614 /* testUser6's service date is 2012-03-25
615 * testUser6 has two accrual category rules, rule 1 goes from 0 to 6 month with accrual rate of 16
616 * rule 2 goes from 6 month to 900 with accrual rate of 24
617 * accrual category testAC8 associated with the two rules has Proration=false, and minimum percentage of 0.5 and earn interval=semi_monthly
618 * run accrual for testUser5 for 10 months
619 */
620 public void testMinNOTReachedProrationFalseAndRuleChange() {
621 String principal_id = "testUser6";
622 Calendar aCal = Calendar.getInstance();
623 aCal.setTime(START_DATE); // 02/10/2012
624 aCal.add(Calendar.MONTH, 10); // 12/10/2012
625 Date endDate = new java.sql.Date(aCal.getTime().getTime());
626
627 List<LeaveBlock> leaveBlockList = (List<LeaveBlock>) TkServiceLocator.getLeaveBlockService().getLeaveBlocks(principal_id, START_DATE, endDate);
628 Assert.assertTrue("There are leave blocks before runAccrual for princiapl id " + principal_id, leaveBlockList.isEmpty());
629
630 TkServiceLocator.getLeaveAccrualService().runAccrual(principal_id, START_DATE, endDate, false);
631
632 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocks(principal_id, START_DATE, endDate);
633 Assert.assertTrue("There should be 17 leave blocks for emplyee " + principal_id + ", not " + leaveBlockList.size(), leaveBlockList.size()== 17);
634
635 // 03/31/2012 is the first accrual interval date, since minimum percentage is not reached (03/25-03/31) and proration=false
636 // there should not be leave blocks
637 Date intervalDate = new Date((new DateTime(2012, 3, 31, 5, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
638 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocksForDate(principal_id, intervalDate);
639 Assert.assertTrue("There should be 0 leave block for date " + intervalDate.toString(), leaveBlockList.isEmpty());
640
641 // 04/15/2012 should have the first leave block for testUser6 and the accrual hours should be the full 16
642 intervalDate = new Date((new DateTime(2012, 4, 15, 5, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
643 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocksForDate(principal_id, intervalDate);
644 Assert.assertTrue("There should be 1 leave block for date " + intervalDate.toString() + " for emplyee " + principal_id, leaveBlockList.size()==1);
645 LeaveBlock lb = leaveBlockList.get(0);
646 Assert.assertTrue("Leave block on date " + intervalDate.toString() + " should have 16 hours, not " + lb.getLeaveAmount()
647 , lb.getLeaveAmount().equals(new BigDecimal(16)));
648
649 // accrual rate for 09/15/2012 should still be 16
650 intervalDate = new Date((new DateTime(2012, 9, 15, 5, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
651 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocksForDate(principal_id, intervalDate);
652 Assert.assertTrue("There should be 1 leave block for employee " + principal_id + " for date " + intervalDate.toString(), leaveBlockList.size()==1);
653 lb = leaveBlockList.get(0);
654 Assert.assertTrue("Hours of the leave block on date " + intervalDate.toString() + " should be 16, not " + lb.getLeaveAmount().toString()
655 , lb.getLeaveAmount().equals(new BigDecimal(16)));
656
657 // 09/30/2013 is the first pay interval of rule 2, since the minimum percentage is not reached (09/25-09/30)
658 // the accrual rate should still be 16
659 intervalDate = new Date((new DateTime(2012, 9, 30, 5, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
660 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocksForDate(principal_id, intervalDate);
661 Assert.assertTrue("There should be 1 leave block for employee " + principal_id + " for date " + intervalDate.toString(), leaveBlockList.size()==1);
662 lb = leaveBlockList.get(0);
663 Assert.assertTrue("Hours of the leave block for date " + intervalDate.toString() + " should be 16, not " + lb.getLeaveAmount().toString()
664 , lb.getLeaveAmount().equals(new BigDecimal(16)));
665
666 // 10/15/2013, should use new rate of 24
667 intervalDate = new Date((new DateTime(2012, 10, 15, 5, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
668 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocksForDate(principal_id, intervalDate);
669 Assert.assertTrue("There should be 1 leave block for employee " + principal_id + " for date " + intervalDate.toString(), leaveBlockList.size()==1);
670 lb = leaveBlockList.get(0);
671 Assert.assertTrue("Hours of the leave block for date " + intervalDate.toString() + " should be 24, not " + lb.getLeaveAmount().toString()
672 , lb.getLeaveAmount().equals(new BigDecimal(24)));
673 }
674
675 @Test
676 /* testUser7's service date is 2012-03-10
677 * testUser7 has two leave blocks scheduled on 04/26/2012 for 2 hours and 05/08/2012 for 5 hours, they both are NOT eligible for accrual
678 * testUser7 has one leave block scheduled on 05/22/1012 of 8 horus, it's eligible for accrual
679 * testUser7 has one leave block scheduled on 06/12/1012 of 15 horus, it's NOT eligible for accrual
680 * testUser7 has one accrual category rule of 32 hours of accrual rate, two jobs are eligible for leave with total of 40 standard hours
681 * run accrual for testUser7 for 5 months
682 */
683 public void testNotEligibleForAccrualAdjustment() {
684 String principal_id = "testUser7";
685 Calendar aCal = Calendar.getInstance();
686 aCal.setTime(START_DATE); // 02/20/2012
687 aCal.add(Calendar.MONTH, 5); // 7/20/2012
688 Date endDate = new java.sql.Date(aCal.getTime().getTime());
689
690 List<LeaveBlock> leaveBlockList = (List<LeaveBlock>) TkServiceLocator.getLeaveBlockService().getLeaveBlocks(principal_id, START_DATE, endDate);
691 Assert.assertTrue("There should be 4 leave blocks before runAccrual for princiapl id " + principal_id, leaveBlockList.size() == 4);
692
693 TkServiceLocator.getLeaveAccrualService().runAccrual(principal_id, START_DATE, endDate, false);
694
695 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocks(principal_id, START_DATE, endDate);
696 Assert.assertTrue("There should be 10 leave blocks for emplyee " + principal_id + ", not " + leaveBlockList.size(), leaveBlockList.size()== 10);
697
698 // 03/31/2012,
699 Date intervalDate = new Date((new DateTime(2012, 3, 31, 5, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
700 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocksForDate(principal_id, intervalDate);
701 Assert.assertTrue("There should be 1 leave block for date " + intervalDate.toString(), leaveBlockList.size() == 1);
702 LeaveBlock lb = leaveBlockList.get(0);
703 Assert.assertTrue("Hours of the leave block for date " + intervalDate.toString() + " should be 22, not " + lb.getLeaveAmount().toString()
704 , lb.getLeaveAmount().equals(new BigDecimal(22)));
705
706 // 04/30/2012,
707 intervalDate = new Date((new DateTime(2012, 4, 30, 5, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
708 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocksForDate(principal_id, intervalDate);
709 Assert.assertTrue("There should be 1 leave block for date " + intervalDate.toString(), leaveBlockList.size() == 1);
710 lb = leaveBlockList.get(0);
711 Assert.assertTrue("Hours of the leave block for date " + intervalDate.toString() + " should be 32, not " + lb.getLeaveAmount().toString()
712 , lb.getLeaveAmount().equals(new BigDecimal(32)));
713
714 //05/31/2012
715 intervalDate = new Date((new DateTime(2012, 5, 31, 5, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
716 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocksForDate(principal_id, intervalDate);
717 Assert.assertTrue("There should be 2 leave block for date " + intervalDate.toString(), leaveBlockList.size() == 2);
718 for(LeaveBlock aLeaveBlock : leaveBlockList) {
719 if(aLeaveBlock.getLeaveAmount().equals(new BigDecimal(-1))) {
720 Assert.assertTrue("Accrual category of the leave block for date " + intervalDate.toString() + " should be 'testAC9' , not " + aLeaveBlock.getAccrualCategory()
721 , aLeaveBlock.getAccrualCategory().equals("testAC9"));
722 } else if(aLeaveBlock.getLeaveAmount().equals(new BigDecimal(32))) {
723 Assert.assertTrue("Accrual category of the leave block for date " + intervalDate.toString() + " should be 'testAC9' , not " + aLeaveBlock.getAccrualCategory()
724 , aLeaveBlock.getAccrualCategory().equals("testAC9"));
725 } else {
726 Assert.fail("Hours of the leave block for date " + intervalDate.toString() + " should be either 32 or -1, not " + aLeaveBlock.getLeaveAmount().toString());
727 }
728 }
729
730 //06/30/2012
731 intervalDate = new Date((new DateTime(2012, 6, 30, 5, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
732 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocksForDate(principal_id, intervalDate);
733 Assert.assertTrue("There should be 2 leave block for date " + intervalDate.toString(), leaveBlockList.size() == 2);
734 for(LeaveBlock aLeaveBlock : leaveBlockList) {
735 if(aLeaveBlock.getLeaveAmount().equals(new BigDecimal(-3))) {
736 Assert.assertTrue("Accrual category of the leave block for date " + intervalDate.toString() + " should be 'testAC9' , not " + lb.getAccrualCategory()
737 , lb.getAccrualCategory().equals("testAC9"));
738 } else if(aLeaveBlock.getLeaveAmount().equals(new BigDecimal(32))) {
739 Assert.assertTrue("Accrual category of the leave block for date " + intervalDate.toString() + " should be 'testAC9' , not " + lb.getAccrualCategory()
740 , lb.getAccrualCategory().equals("testAC9"));
741 } else {
742 Assert.fail("Hours of the leave block for date " + intervalDate.toString() + " should be either 32 or -3, not " + lb.getLeaveAmount().toString());
743 }
744 }
745 }
746
747 @Test
748 /* testUser8's service date is 2012-03-10
749 * testUser8 has one accrual category, two entries of the same accrual category.
750 * The first entry has effectiveDate = 2012-03-01. The rule associated with it has 16 as the accrual rate
751 * the second entry has effectiveDate = 2012-5-01. The rule associated with it has 32 as the accrual rate
752 * run accrual for testUser8 for 6 months
753 */
754 public void testAccrualCategoryChanges() {
755 String principal_id = "testUser8";
756 Calendar aCal = Calendar.getInstance();
757 aCal.setTime(START_DATE); // 02/20/2012
758 aCal.add(Calendar.MONTH, 6); // 8/20/2012
759 Date endDate = new java.sql.Date(aCal.getTime().getTime());
760
761 List<LeaveBlock> leaveBlockList = (List<LeaveBlock>) TkServiceLocator.getLeaveBlockService().getLeaveBlocks(principal_id, START_DATE, endDate);
762 Assert.assertTrue("There are leave blocks before runAccrual for princiapl id " + principal_id, leaveBlockList.isEmpty());
763
764 TkServiceLocator.getLeaveAccrualService().runAccrual(principal_id, START_DATE, endDate, false);
765
766 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocks(principal_id, START_DATE, endDate);
767 Assert.assertTrue("There should be 5 leave blocks for emplyee " + principal_id + ", not " + leaveBlockList.size(), leaveBlockList.size()== 5);
768
769 // 03/31/2012,
770 Date intervalDate = new Date((new DateTime(2012, 3, 31, 5, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
771 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocksForDate(principal_id, intervalDate);
772 Assert.assertTrue("There should be 1 leave block for date " + intervalDate.toString(), leaveBlockList.size() == 1);
773 LeaveBlock lb = leaveBlockList.get(0);
774 Assert.assertTrue("Hours of the leave block for date " + intervalDate.toString() + " should be 11, not " + lb.getLeaveAmount().toString()
775 , lb.getLeaveAmount().equals(new BigDecimal(11)));
776
777 // 04/30/2012,
778 intervalDate = new Date((new DateTime(2012, 4, 30, 5, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
779 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocksForDate(principal_id, intervalDate);
780 Assert.assertTrue("There should be 1 leave block for date " + intervalDate.toString(), leaveBlockList.size() == 1);
781 lb = leaveBlockList.get(0);
782 Assert.assertTrue("Hours of the leave block for date " + intervalDate.toString() + " should be 16, not " + lb.getLeaveAmount().toString()
783 , lb.getLeaveAmount().equals(new BigDecimal(16)));
784
785 //05/31/2012
786 intervalDate = new Date((new DateTime(2012, 5, 31, 5, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
787 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocksForDate(principal_id, intervalDate);
788 Assert.assertTrue("There should be 1 leave block for date " + intervalDate.toString(), leaveBlockList.size() == 1);
789 lb = leaveBlockList.get(0);
790 Assert.assertTrue("Hours of the leave block for date " + intervalDate.toString() + " should be 32, not " + lb.getLeaveAmount().toString()
791 , lb.getLeaveAmount().equals(new BigDecimal(32)));
792
793 }
794
795 @Test
796 /* testUser15's service Date is 2012-03-10
797 * testUser15 has one accrual category, the effectiveDate of the AC is 2012-03-01
798 * The rule associated with the AC has 24 as the accrual rate
799 * There's Leave Calendar document for calendar entry 2012-04-01 -- 2012-05-01
800 * run accrual for testUser15 for 6 months
801 */
802 public void testLeaveBlocksWithLeaveCalendarDocId() {
803 String principal_id = "testUser15";
804 Calendar aCal = Calendar.getInstance();
805 aCal.setTime(START_DATE);
806 aCal.add(Calendar.MONTH, 6);
807 Date endDate = new java.sql.Date(aCal.getTime().getTime());
808
809 List<LeaveBlock> leaveBlockList = (List<LeaveBlock>) TkServiceLocator.getLeaveBlockService().getLeaveBlocks(principal_id, START_DATE, endDate);
810 Assert.assertTrue("There are leave blocks before runAccrual for princiapl id " + principal_id, leaveBlockList.isEmpty());
811
812 TkServiceLocator.getLeaveAccrualService().runAccrual(principal_id, START_DATE, endDate, false);
813
814 // 04/30/2012
815 Date intervalDate = new Date((new DateTime(2012, 4, 30, 5, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
816 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocksForDate(principal_id, intervalDate);
817 Assert.assertTrue("There should be 1 leave block for employee " + principal_id + " for date " + intervalDate.toString(), leaveBlockList.size()==1);
818 LeaveBlock lb = leaveBlockList.get(0);
819 Assert.assertTrue("DocumentId of the leave block for date " + intervalDate.toString() + " should be 5000, not " + lb.getDocumentId()
820 , lb.getDocumentId().equals("5000"));
821
822 }
823
824 @Test
825 /* testUser16's service Date is 2012-03-26 which is a Monday
826 * testUser16 has one accrual category "testAC19" with effectiveDate of 2012-03-01
827 * testAC19 has proration = false, minimum percentage = 0
828 * testAC19 has "pay calendar" as the earn interval, so the accrual interval will be based on the pay calendar entries of testUser16
829 * testUser16 has "BI-WE" as the pay calendar, it's bi-weekly with start day as Sunday
830 * The rule associated with the AC has 24 as the accrual rate
831 * run accrual for testUser16 for 6 months
832 */
833 public void testPayCalAsEarnInterval() {
834 String principal_id = "testUser16";
835 Calendar aCal = Calendar.getInstance();
836 aCal.setTime(START_DATE);
837 aCal.add(Calendar.MONTH, 6);
838 Date endDate = new java.sql.Date(aCal.getTime().getTime());
839
840 List<LeaveBlock> leaveBlockList = (List<LeaveBlock>) TkServiceLocator.getLeaveBlockService().getLeaveBlocks(principal_id, START_DATE, endDate);
841 Assert.assertTrue("There are leave blocks before runAccrual for princiapl id " + principal_id, leaveBlockList.isEmpty());
842
843 TkServiceLocator.getLeaveAccrualService().runAccrual(principal_id, START_DATE, endDate, false);
844
845 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocks(principal_id, START_DATE, endDate);
846 Assert.assertTrue("There should be 11 leave blocks for emplyee " + principal_id + ", not " + leaveBlockList.size(), leaveBlockList.size()== 11);
847
848 // 03/31/2012, testAC19 has proration= false, minimum percentage = 0, so whole FTE of 24 hours is given to the first interval
849 Date intervalDate = new Date((new DateTime(2012, 3, 31, 5, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
850 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocksForDate(principal_id, intervalDate);
851 Assert.assertTrue("There should be 1 leave block for employee " + principal_id + " for date " + intervalDate.toString(), leaveBlockList.size()==1);
852 LeaveBlock lb = leaveBlockList.get(0);
853 Assert.assertTrue("Hours of the leave block for date " + intervalDate.toString() + " should be 24, not " + lb.getLeaveAmount().toString()
854 , lb.getLeaveAmount().equals(new BigDecimal(24)));
855
856 // 04/28/2012
857 intervalDate = new Date((new DateTime(2012, 4, 28, 5, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
858 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocksForDate(principal_id, intervalDate);
859 Assert.assertTrue("There should be 1 leave block for employee " + principal_id + " for date " + intervalDate.toString(), leaveBlockList.size()==1);
860 lb = leaveBlockList.get(0);
861 Assert.assertTrue("Hours of the leave block for date " + intervalDate.toString() + " should be 24, not " + lb.getLeaveAmount().toString()
862 , lb.getLeaveAmount().equals(new BigDecimal(24)));
863 // 05/12/2012
864 intervalDate = new Date((new DateTime(2012, 5, 12, 5, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
865 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocksForDate(principal_id, intervalDate);
866 Assert.assertTrue("There should be 1 leave block for employee " + principal_id + " for date " + intervalDate.toString(), leaveBlockList.size()==1);
867 // 08/04/2012
868 intervalDate = new Date((new DateTime(2012, 8, 4, 5, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
869 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocksForDate(principal_id, intervalDate);
870 Assert.assertTrue("There should be 1 leave block for employee " + principal_id + " for date " + intervalDate.toString(), leaveBlockList.size()==1);
871 // 08/18/2012
872 intervalDate = new Date((new DateTime(2012, 8, 18, 5, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
873 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocksForDate(principal_id, intervalDate);
874 Assert.assertTrue("There should be 1 leave block for employee " + principal_id + " for date " + intervalDate.toString(), leaveBlockList.size()==1);
875 }
876
877 @Test
878 /* testUser17's service Date is 2012-03-26 which is a Monday
879 * testUser17 has one accrual category "testAC20" with effectiveDate of 2012-03-01
880 * testAC20 has proration = true, minimum percentage = 0.5
881 * testAC20 has "pay calendar" as the earn interval, so the accrual interval will be based on the pay calendar entries of testUser17
882 * testUser17 has "BI-WE" as the pay calendar, it's bi-weekly with start day as Sunday
883 * The rule associated with the AC has 24 as the accrual rate
884 * run accrual for testUser17 for 6 months
885 */
886 public void testPayCalAsEarnIntervalProrationFalseMinReached() {
887 String principal_id = "testUser17";
888 Calendar aCal = Calendar.getInstance();
889 aCal.setTime(START_DATE);
890 aCal.add(Calendar.MONTH, 6);
891 Date endDate = new java.sql.Date(aCal.getTime().getTime());
892
893 List<LeaveBlock> leaveBlockList = (List<LeaveBlock>) TkServiceLocator.getLeaveBlockService().getLeaveBlocks(principal_id, START_DATE, endDate);
894 Assert.assertTrue("There are leave blocks before runAccrual for princiapl id " + principal_id, leaveBlockList.isEmpty());
895
896 TkServiceLocator.getLeaveAccrualService().runAccrual(principal_id, START_DATE, endDate, false);
897
898 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocks(principal_id, START_DATE, endDate);
899 Assert.assertTrue("There should be 11 leave blocks for emplyee " + principal_id + ", not " + leaveBlockList.size(), leaveBlockList.size()== 11);
900
901 // 03/31/2012, testAC20 has proration= true, minimum percentage = 0.5, so only 12 hours is given to the first interval
902 Date intervalDate = new Date((new DateTime(2012, 3, 31, 5, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
903 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocksForDate(principal_id, intervalDate);
904 Assert.assertTrue("There should be 1 leave block for employee " + principal_id + " for date " + intervalDate.toString(), leaveBlockList.size()==1);
905 LeaveBlock lb = leaveBlockList.get(0);
906 Assert.assertTrue("Hours of the leave block for date " + intervalDate.toString() + " should be 12, not " + lb.getLeaveAmount().toString()
907 , lb.getLeaveAmount().equals(new BigDecimal(12)));
908
909 // 04/28/2012
910 intervalDate = new Date((new DateTime(2012, 4, 28, 5, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
911 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocksForDate(principal_id, intervalDate);
912 Assert.assertTrue("There should be 1 leave block for employee " + principal_id + " for date " + intervalDate.toString(), leaveBlockList.size()==1);
913 lb = leaveBlockList.get(0);
914 Assert.assertTrue("Hours of the leave block for date " + intervalDate.toString() + " should be 24, not " + lb.getLeaveAmount().toString()
915 , lb.getLeaveAmount().equals(new BigDecimal(24)));
916 // 05/12/2012
917 intervalDate = new Date((new DateTime(2012, 5, 12, 5, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
918 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocksForDate(principal_id, intervalDate);
919 Assert.assertTrue("There should be 1 leave block for employee " + principal_id + " for date " + intervalDate.toString(), leaveBlockList.size()==1);
920 // 08/04/2012
921 intervalDate = new Date((new DateTime(2012, 8, 4, 5, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
922 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocksForDate(principal_id, intervalDate);
923 Assert.assertTrue("There should be 1 leave block for employee " + principal_id + " for date " + intervalDate.toString(), leaveBlockList.size()==1);
924 // 08/18/2012
925 intervalDate = new Date((new DateTime(2012, 8, 18, 5, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
926 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocksForDate(principal_id, intervalDate);
927 Assert.assertTrue("There should be 1 leave block for employee " + principal_id + " for date " + intervalDate.toString(), leaveBlockList.size()==1);
928 }
929
930 @Test
931 /* testUser18's service Date is 2012-03-20 which is a Tuesday
932 * testUser18 has one accrual category "testAC21" with effectiveDate of 2012-03-01
933 * testAC21 has proration = false, minimum percentage = 0
934 * testAC21 has "weekly" as the earn interval
935 * The rule associated with the AC has 24 as the accrual rate
936 * run accrual for testUser18 for 6 months
937 */
938 public void testWeeklyAsEarnInterval() {
939 String principal_id = "testUser18";
940 Calendar aCal = Calendar.getInstance();
941 aCal.setTime(START_DATE);
942 aCal.add(Calendar.MONTH, 6);
943 Date endDate = new java.sql.Date(aCal.getTime().getTime());
944
945 List<LeaveBlock> leaveBlockList = (List<LeaveBlock>) TkServiceLocator.getLeaveBlockService().getLeaveBlocks(principal_id, START_DATE, endDate);
946 Assert.assertTrue("There are leave blocks before runAccrual for princiapl id " + principal_id, leaveBlockList.isEmpty());
947
948 TkServiceLocator.getLeaveAccrualService().runAccrual(principal_id, START_DATE, endDate, false);
949
950 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocks(principal_id, START_DATE, endDate);
951 Assert.assertTrue("There should be 22 leave blocks for emplyee " + principal_id + ", not " + leaveBlockList.size(), leaveBlockList.size()== 22);
952
953 // 03/24/2012
954 Date intervalDate = new Date((new DateTime(2012, 3, 24, 5, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
955 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocksForDate(principal_id, intervalDate);
956 Assert.assertTrue("There should be 1 leave block for employee " + principal_id + " for date " + intervalDate.toString(), leaveBlockList.size()==1);
957 LeaveBlock lb = leaveBlockList.get(0);
958 Assert.assertTrue("Hours of the leave block for date " + intervalDate.toString() + " should be 24, not " + lb.getLeaveAmount().toString()
959 , lb.getLeaveAmount().equals(new BigDecimal(24)));
960 // 03/31/2012
961 intervalDate = new Date((new DateTime(2012, 3, 31, 5, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
962 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocksForDate(principal_id, intervalDate);
963 Assert.assertTrue("There should be 1 leave block for employee " + principal_id + " for date " + intervalDate.toString(), leaveBlockList.size()==1);
964 lb = leaveBlockList.get(0);
965 Assert.assertTrue("Hours of the leave block for date " + intervalDate.toString() + " should be 24, not " + lb.getLeaveAmount().toString()
966 , lb.getLeaveAmount().equals(new BigDecimal(24)));
967 // 08/11/2012
968 intervalDate = new Date((new DateTime(2012, 8, 11, 5, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
969 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocksForDate(principal_id, intervalDate);
970 Assert.assertTrue("There should be 1 leave block for employee " + principal_id + " for date " + intervalDate.toString(), leaveBlockList.size()==1);
971 lb = leaveBlockList.get(0);
972 Assert.assertTrue("Hours of the leave block for date " + intervalDate.toString() + " should be 24, not " + lb.getLeaveAmount().toString()
973 , lb.getLeaveAmount().equals(new BigDecimal(24)));
974 // 08/18/2012
975 intervalDate = new Date((new DateTime(2012, 8, 18, 5, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
976 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocksForDate(principal_id, intervalDate);
977 Assert.assertTrue("There should be 1 leave block for employee " + principal_id + " for date " + intervalDate.toString(), leaveBlockList.size()==1);
978 lb = leaveBlockList.get(0);
979 Assert.assertTrue("Hours of the leave block for date " + intervalDate.toString() + " should be 24, not " + lb.getLeaveAmount().toString()
980 , lb.getLeaveAmount().equals(new BigDecimal(24)));
981 }
982 @Test
983 /* testUser19's service Date is 2012-03-20
984 * testUser19 has one accrual category "testAC22" with effectiveDate of 2012-03-01
985 * testAC22 has "yearly" as the earn interval
986 * The rule associated with the AC has 100 hours as the accrual rate
987 * run accrual for testUser19 for 18 months
988 */
989 public void testYearlyAsEarnInterval() {
990 String principal_id = "testUser19";
991 Calendar aCal = Calendar.getInstance();
992 aCal.setTime(START_DATE);
993 aCal.add(Calendar.MONTH, 18);
994 Date endDate = new java.sql.Date(aCal.getTime().getTime());
995
996 List<LeaveBlock> leaveBlockList = (List<LeaveBlock>) TkServiceLocator.getLeaveBlockService().getLeaveBlocks(principal_id, START_DATE, endDate);
997 Assert.assertTrue("There are leave blocks before runAccrual for princiapl id " + principal_id, leaveBlockList.isEmpty());
998
999 TkServiceLocator.getLeaveAccrualService().runAccrual(principal_id, START_DATE, endDate, false);
1000
1001 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocks(principal_id, START_DATE, endDate);
1002 Assert.assertTrue("There should be 1 leave blocks for emplyee " + principal_id + ", not " + leaveBlockList.size(), leaveBlockList.size()== 1);
1003
1004 // 12/31/2013
1005 Date intervalDate = new Date((new DateTime(2012, 12, 31, 5, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
1006 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocksForDate(principal_id, intervalDate);
1007 Assert.assertTrue("There should be 1 leave block for employee " + principal_id + " for date " + intervalDate.toString(), leaveBlockList.size()==1);
1008 LeaveBlock lb = leaveBlockList.get(0);
1009 Assert.assertTrue("Hours of the leave block for date " + intervalDate.toString() + " should be 100, not " + lb.getLeaveAmount().toString()
1010 , lb.getLeaveAmount().equals(new BigDecimal(100)));
1011 }
1012 @Test
1013 /* testUser20's service Date is 2012-03-20
1014 * testUser20 has one accrual category "testAC23" with effectiveDate of 2012-03-01
1015 * testAC23 has "daily" as the earn interval
1016 * The rule associated with the AC has 2 as the accrual rate
1017 * run accrual for testUser20 for 3 months
1018 */
1019 public void testDailyAsEarnInterval() {
1020 String principal_id = "testUser20";
1021 Calendar aCal = Calendar.getInstance();
1022 aCal.setTime(START_DATE);
1023 aCal.add(Calendar.MONTH, 3);
1024 Date endDate = new java.sql.Date(aCal.getTime().getTime());
1025
1026 List<LeaveBlock> leaveBlockList = (List<LeaveBlock>) TkServiceLocator.getLeaveBlockService().getLeaveBlocks(principal_id, START_DATE, endDate);
1027 Assert.assertTrue("There are leave blocks before runAccrual for princiapl id " + principal_id, leaveBlockList.isEmpty());
1028
1029 TkServiceLocator.getLeaveAccrualService().runAccrual(principal_id, START_DATE, endDate, false);
1030
1031 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocks(principal_id, START_DATE, endDate);
1032 Assert.assertTrue("There should be 44 leave blocks for emplyee " + principal_id + ", not " + leaveBlockList.size(), leaveBlockList.size()== 44);
1033
1034 // 03/20/2012
1035 Date intervalDate = new Date((new DateTime(2012, 3, 20, 5, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
1036 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocksForDate(principal_id, intervalDate);
1037 Assert.assertTrue("There should be 1 leave block for employee " + principal_id + " for date " + intervalDate.toString(), leaveBlockList.size()==1);
1038 LeaveBlock lb = leaveBlockList.get(0);
1039 Assert.assertTrue("Hours of the leave block for date " + intervalDate.toString() + " should be 2, not " + lb.getLeaveAmount().toString()
1040 , lb.getLeaveAmount().equals(new BigDecimal(2)));
1041
1042 // 05/28/2012
1043 intervalDate = new Date((new DateTime(2012, 5, 18, 5, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
1044 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocksForDate(principal_id, intervalDate);
1045 Assert.assertTrue("There should be 1 leave block for employee " + principal_id + " for date " + intervalDate.toString(), leaveBlockList.size()==1);
1046 lb = leaveBlockList.get(0);
1047 Assert.assertTrue("Hours of the leave block for date " + intervalDate.toString() + " should be 2, not " + lb.getLeaveAmount().toString()
1048 , lb.getLeaveAmount().equals(new BigDecimal(2)));
1049 }
1050
1051 @Test
1052 /* testUser21's service Date is 2012-03-20
1053 * testUser21 has one accrual category "testAC24" with effectiveDate of 2012-03-01
1054 * testAC24 has "monthly" as the earn interval
1055 * There's a accrual ssto leave block on 04/10/2012 for testUser21,no usage lb, so that's a banked ssto accrual
1056 * run accrual for testUser21 for 3 months, the accrual service should not delete the existing leaveblock
1057 * and should not generate new ssto accrual/usage lbs on 04/10/2012
1058 * There's a balance transferred leave block on 04/15/2012, sstoId is not empty,
1059 * accrual service should not generate ssto accrual leave blocks on 04/15/2012
1060 */
1061 public void testSSTOBankedOrTransferred() {
1062 String principal_id = "testUser21";
1063 Calendar aCal = Calendar.getInstance();
1064 aCal.setTime(START_DATE);
1065 aCal.add(Calendar.MONTH, 3);
1066 Date endDate = new java.sql.Date(aCal.getTime().getTime());
1067
1068 List<LeaveBlock> leaveBlockList = (List<LeaveBlock>) TkServiceLocator.getLeaveBlockService().getLeaveBlocks(principal_id, START_DATE, endDate);
1069 Assert.assertTrue("There should be 1 leave blocks for princiapl id before runAccrual" + principal_id, leaveBlockList.size() == 2);
1070
1071 TkServiceLocator.getLeaveAccrualService().runAccrual(principal_id, START_DATE, endDate, false);
1072
1073 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocks(principal_id, START_DATE, endDate);
1074 Assert.assertTrue("There should be 4 leave blocks for emplyee " + principal_id + ", not " + leaveBlockList.size(), leaveBlockList.size()== 4);
1075
1076 // 04/10/2012
1077 Date intervalDate = new Date((new DateTime(2012, 4, 10, 5, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
1078 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocksForDate(principal_id, intervalDate);
1079 Assert.assertTrue("There should be 1 leave block for employee " + principal_id + " for date " + intervalDate.toString(), leaveBlockList.size()==1);
1080 LeaveBlock lb = leaveBlockList.get(0);
1081 Assert.assertTrue("Hours of the leave block for date " + intervalDate.toString() + " should be 8, not " + lb.getLeaveAmount().toString()
1082 , lb.getLeaveAmount().equals(new BigDecimal(8)));
1083 Assert.assertTrue("LeaveBlockId of the leave block for date " + intervalDate.toString() + " should be 5004, not " + lb.getLmLeaveBlockId()
1084 , lb.getLmLeaveBlockId().equals("5004"));
1085
1086 // 04/15/2012
1087 intervalDate = new Date((new DateTime(2012, 4, 15, 5, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
1088 leaveBlockList = TkServiceLocator.getLeaveBlockService().getLeaveBlocksForDate(principal_id, intervalDate);
1089 Assert.assertTrue("There should be 1 leave block for employee " + principal_id + " for date " + intervalDate.toString(), leaveBlockList.size()==1);
1090 lb = leaveBlockList.get(0);
1091 Assert.assertTrue("Hours of the leave block for date " + intervalDate.toString() + " should be 4, not " + lb.getLeaveAmount().toString()
1092 , lb.getLeaveAmount().equals(new BigDecimal(4)));
1093 Assert.assertTrue("LeaveBlockId of the leave block for date " + intervalDate.toString() + " should be 5005, not " + lb.getLmLeaveBlockId()
1094 , lb.getLmLeaveBlockId().equals("5005"));
1095 }
1096
1097 }