001/**
002 * Copyright 2004-2014 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 */
016package org.kuali.hr.time.department.lunch.rule;
017
018import java.math.BigDecimal;
019import java.util.List;
020
021import org.apache.commons.lang.StringUtils;
022import org.joda.time.DateTime;
023import org.junit.Assert;
024import org.junit.Test;
025import org.kuali.hr.KPMEWebTestCase;
026import org.kuali.kpme.core.FunctionalTest;
027import org.kuali.kpme.core.util.HrConstants;
028import org.kuali.kpme.core.util.TKUtils;
029import org.kuali.kpme.tklm.time.rules.lunch.department.DeptLunchRule;
030import org.kuali.kpme.tklm.time.service.TkServiceLocator;
031import org.kuali.kpme.tklm.time.timeblock.TimeBlock;
032import org.kuali.kpme.tklm.time.timehourdetail.TimeHourDetail;
033import org.kuali.kpme.tklm.time.timesheet.TimesheetDocument;
034import org.kuali.kpme.tklm.utils.TkTestUtils;
035import org.kuali.rice.krad.service.KRADServiceLocator;
036
037@FunctionalTest
038public class DepartmentLunchRuleTest extends KPMEWebTestCase {
039    private DateTime JAN_AS_OF_DATE = new DateTime(2010, 1, 1, 0, 0, 0, 0, TKUtils.getSystemDateTimeZone());
040
041        @Test
042        public void testDepartmentLunchRuleFetch() throws Exception{
043                DeptLunchRule deptLunchRule = new DeptLunchRule();
044                deptLunchRule.setActive(true);
045                deptLunchRule.setDept("TEST");
046                deptLunchRule.setWorkArea(1234L);
047                deptLunchRule.setEffectiveLocalDate(JAN_AS_OF_DATE.toLocalDate());
048                deptLunchRule.setJobNumber(0L);
049                deptLunchRule.setPrincipalId("admin");
050                deptLunchRule.setDeductionMins(new BigDecimal(30));
051                deptLunchRule.setShiftHours(new BigDecimal(6));
052                deptLunchRule.setTkDeptLunchRuleId("1001");
053
054                KRADServiceLocator.getBusinessObjectService().save(deptLunchRule);
055
056                deptLunchRule = TkServiceLocator.getDepartmentLunchRuleService().getDepartmentLunchRule("TEST",
057                                                                                        1234L, "admin", 0L, JAN_AS_OF_DATE.toLocalDate());
058                Assert.assertTrue("dept lunch rule fetched ", deptLunchRule!=null);
059
060        }
061
062        /**
063         * Test if the minute deduction rule is applied correctly if there is a valid department lunch rule
064         */
065
066        @Test
067        public void testDepartmentLunchRule() throws Exception {
068                // create a dept lunch rule
069                DeptLunchRule deptLunchRule = new DeptLunchRule();
070                deptLunchRule.setActive(true);
071                deptLunchRule.setDept("TEST-DEPT");
072                deptLunchRule.setWorkArea(1234L);
073                deptLunchRule.setEffectiveLocalDate(JAN_AS_OF_DATE.toLocalDate());
074                deptLunchRule.setJobNumber(1L);
075                deptLunchRule.setPrincipalId("edna");
076                deptLunchRule.setDeductionMins(new BigDecimal(30));
077                deptLunchRule.setShiftHours(new BigDecimal(6));
078                deptLunchRule.setTkDeptLunchRuleId("1001");
079
080                KRADServiceLocator.getBusinessObjectService().save(deptLunchRule);
081
082                deptLunchRule = TkServiceLocator.getDepartmentLunchRuleService().getDepartmentLunchRule("TEST-DEPT",
083                                                                                        1234L, "edna", 1L, JAN_AS_OF_DATE.toLocalDate());
084                Assert.assertTrue("dept lunch rule fetched ", deptLunchRule!=null);
085
086                TimesheetDocument doc = TkTestUtils.populateTimesheetDocument(JAN_AS_OF_DATE, "edna");
087
088                for(TimeBlock tb : doc.getTimeBlocks()){
089                        tb.setClockLogCreated(true);
090                }
091        //reset time block
092        //TkServiceLocator.getTimesheetService().resetTimeBlock(doc.getTimeBlocks());
093                //TkServiceLocator.getTkRuleControllerService().applyRules(TkConstants.ACTIONS.ADD_TIME_BLOCK, doc.getTimeBlocks(), doc.getCalendarEntry(), doc, "admin");
094                for(TimeBlock tb : doc.getTimeBlocks()) {
095                        if(tb.getHours().compareTo(deptLunchRule.getShiftHours()) == 1) {
096                                for(TimeHourDetail thd : tb.getTimeHourDetails()){
097                                        //      this assumes the hours for the dummy timeblocks are always 10
098                                        if(!StringUtils.equals(thd.getEarnCode(), HrConstants.LUNCH_EARN_CODE)){
099                                                Assert.assertEquals(new BigDecimal(9.50).setScale(2), tb.getHours());
100                                        }
101                                }
102                        }
103                }
104
105        }
106
107        @Test
108        public void testSearchDepartmentLunchRules() throws Exception {
109                List<DeptLunchRule> allResults = TkServiceLocator.getDepartmentLunchRuleService().getDepartmentLunchRules("admin", null, null, null, null, null, null, "Y", "N");
110                Assert.assertEquals("Search returned the wrong number of results.", 2, allResults.size());
111                
112                List<DeptLunchRule> restrictedResults = TkServiceLocator.getDepartmentLunchRuleService().getDepartmentLunchRules("fran", null, null, null, null, null, null, "Y", "N");
113                Assert.assertEquals("Search returned the wrong number of results.", 0, restrictedResults.size());
114        }
115        
116}