/** <<<<<<< HEAD * @see: https://forge.tine20.org/mantisbt/view.php?id=10122 */ public function testAlternatingContracts() { $date = Tinebase_DateTime::now()->setDate(2014, 1, 1)->setTimezone(Tinebase_Core::getUserTimezone())->setTime(0, 0, 0); $employee = $this->_getEmployee('unittest'); $employee->employment_begin = clone $date; $contract1 = $this->_getContract(); $contract1->start_date = clone $date; // 1.1.2014 $date->addMonth(7)->subDay(1); $contract1->end_date = clone $date; // 31.7.2014 $contract1->workingtime_json = '{"days": [8,8,8,8,8,0,0]}'; $contract1->vacation_days = 27; $date->addDay(1); // 1.8.2014 $contract2 = $this->_getContract(); $contract2->start_date = clone $date; $contract2->workingtime_json = '{"days": [8,8,8,8,8,0,0]}'; $contract2->vacation_days = 30; $recordData = $employee->toArray(); $recordData['contracts'] = array($contract1->toArray(), $contract2->toArray()); $recordData = $this->_json->saveEmployee($recordData); $recordData['vacation'] = array(array()); $res = $this->_json->searchAccounts(array(array('field' => 'year', 'operator' => 'equals', 'value' => '2014')), array()); $account = $res['results'][0]; $date->subDay(1); // 31.7.2014 $extraFreeTime = HumanResources_Controller_ExtraFreeTime::getInstance()->create(new HumanResources_Model_ExtraFreeTime(array('account_id' => $account['id'], 'days' => 4, 'expires' => clone $date, 'type' => 'payed'))); $res = $this->_json->getFeastAndFreeDays($recordData['id'], 2014); // at this point, vacation days are not created, so the extra freetime is expired $this->assertEquals(28, $res['results']['remainingVacation']); // create vacation days $day = Tinebase_DateTime::now()->setDate(2014, 1, 2)->setTimezone(Tinebase_Core::getUserTimezone())->setTime(0, 0, 0); $newFreeTime = array('account_id' => $account['id'], 'employee_id' => $recordData['id'], 'type' => 'vacation', 'status' => 'ACCEPTED', 'firstday_date' => $day->toString()); $newFreeTime['freedays'] = array(array('duration' => '1', 'date' => $day->toString()), array('duration' => '1', 'date' => $day->addDay(1)->toString())); $newFreeTime['days_count'] = 2; $newFreeTime['lastday_date'] = $day->toString(); $this->_json->saveFreeTime($newFreeTime); // create vacation days $day = Tinebase_DateTime::now()->setDate(2014, 6, 10)->setTimezone(Tinebase_Core::getUserTimezone())->setTime(0, 0, 0); $newFreeTime = array('account_id' => $account['id'], 'employee_id' => $recordData['id'], 'type' => 'vacation', 'status' => 'ACCEPTED', 'firstday_date' => $day->toString()); $newFreeTime['freedays'] = array(array('duration' => '1', 'date' => $day->toString()), array('duration' => '1', 'date' => $day->addDay(1)->toString()), array('duration' => '1', 'date' => $day->addDay(1)->toString()), array('duration' => '1', 'date' => $day->addDay(1)->toString())); $newFreeTime['days_count'] = 4; $newFreeTime['lastday_date'] = $day->toString(); $this->_json->saveFreeTime($newFreeTime); // create vacation days $day = Tinebase_DateTime::now()->setDate(2014, 7, 28)->setTimezone(Tinebase_Core::getUserTimezone())->setTime(0, 0, 0); $newFreeTime = array('account_id' => $account['id'], 'employee_id' => $recordData['id'], 'type' => 'vacation', 'status' => 'ACCEPTED', 'firstday_date' => $day->toString()); $newFreeTime['freedays'] = array(array('duration' => '1', 'date' => $day->toString()), array('duration' => '1', 'date' => $day->addDay(1)->toString()), array('duration' => '1', 'date' => $day->addDay(1)->toString()), array('duration' => '1', 'date' => $day->addDay(1)->toString()), array('duration' => '1', 'date' => $day->addDay(1)->toString())); $newFreeTime['days_count'] = 5; $newFreeTime['lastday_date'] = $day->toString(); $this->_json->saveFreeTime($newFreeTime); // create sickness days $day = Tinebase_DateTime::now()->setDate(2014, 1, 21)->setTimezone(Tinebase_Core::getUserTimezone())->setTime(0, 0, 0); $newFreeTime = array('account_id' => $account['id'], 'employee_id' => $recordData['id'], 'type' => 'sickness', 'status' => "EXCUSED", 'firstday_date' => $day->toString()); $newFreeTime['freedays'] = array(array('duration' => '1', 'date' => $day->toString()), array('duration' => '1', 'date' => $day->addDay(1)->toString()), array('duration' => '1', 'date' => $day->addDay(1)->toString()), array('duration' => '1', 'date' => $day->addDay(1)->toString())); $day->addDay(2); $newFreeTime['freedays'][] = array('duration' => '1', 'date' => $day->addDay(1)->toString()); $newFreeTime['freedays'][] = array('duration' => '1', 'date' => $day->addDay(1)->toString()); $newFreeTime['freedays'][] = array('duration' => '1', 'date' => $day->addDay(1)->toString()); $newFreeTime['freedays'][] = array('duration' => '1', 'date' => $day->addDay(1)->toString()); $newFreeTime['freedays'][] = array('duration' => '1', 'date' => $day->addDay(1)->toString()); $day->addDay(2); $newFreeTime['freedays'][] = array('duration' => '1', 'date' => $day->addDay(1)->toString()); $newFreeTime['freedays'][] = array('duration' => '1', 'date' => $day->addDay(1)->toString()); $newFreeTime['freedays'][] = array('duration' => '1', 'date' => $day->addDay(1)->toString()); $newFreeTime['freedays'][] = array('duration' => '1', 'date' => $day->addDay(1)->toString()); $newFreeTime['freedays'][] = array('duration' => '1', 'date' => $day->addDay(1)->toString()); $newFreeTime['days_count'] = 14; $newFreeTime['lastday_date'] = $day->toString(); $this->_json->saveFreeTime($newFreeTime); // create sickness days $day = Tinebase_DateTime::now()->setDate(2014, 1, 6)->setTimezone(Tinebase_Core::getUserTimezone())->setTime(0, 0, 0); $newFreeTime = array('account_id' => $account['id'], 'employee_id' => $recordData['id'], 'type' => 'sickness', 'status' => "UNEXCUSED", 'firstday_date' => $day->toString()); $newFreeTime['freedays'] = array(array('duration' => '1', 'date' => $day->toString())); $this->_json->saveFreeTime($newFreeTime); $res = $this->_json->getFeastAndFreeDays($recordData['id'], 2014); // at this point the extra freetime has been taken and is not expired // 28 + 4 - 11 = 21 $this->assertEquals(21, $res['results']['remainingVacation']); $account = $this->_json->getAccount($account['id']); $this->assertEquals(32, $account['possible_vacation_days']); $this->assertEquals(0, $account['expired_vacation_days']); $this->assertEquals(21, $account['remaining_vacation_days']); $this->assertEquals(11, $account['taken_vacation_days']); $this->assertEquals(14, $account['excused_sickness']); $this->assertEquals(1, $account['unexcused_sickness']); }
/** * some contract tests (more in jsontests) */ public function testContract() { $sdate = new Tinebase_DateTime('2013-01-01 00:00:00'); $employee = $this->_getEmployee('rwright'); $contractController = HumanResources_Controller_Contract::getInstance(); $employeeController = HumanResources_Controller_Employee::getInstance(); $employee = $employeeController->create($employee); $contract = $this->_getContract($sdate); $contract->workingtime_json = '{"days": [8,8,8,8,8,0,0]}'; // create feast days $feastDays2013 = array(array('2013-12-25', '2013-12-26'), array('2013-04-01'), '2013-05-01', '2013-05-09', '2013-05-20', '2013-10-03', '2013-01-01', '2013-03-29', '2013-12-31', '2009-12-31'); $feastCalendar = $this->_getFeastCalendar(); $contract->feast_calendar_id = $feastCalendar->getId(); foreach ($feastDays2013 as $day) { if (is_array($day)) { $date = array(); foreach ($day as $dayQ) { $date[] = new Tinebase_DateTime($dayQ . ' 06:00:00'); } } else { $date = new Tinebase_DateTime($day . ' 06:00:00'); } $this->_createFeastDay($date); } // test "calculateVacationDays" $start = new Tinebase_DateTime('2013-01-01'); $stop = new Tinebase_DateTime('2013-12-31'); $contract->start_date = $start; $contract->end_date = $stop; $this->assertEquals(30, $contractController->calculateVacationDays($contract, $start, $stop)); $newStartDate = new Tinebase_DateTime('2013-07-01'); $contract->start_date = $newStartDate; $contract->employee_id = $employee->getId(); $contractController->create($contract); $this->assertEquals(15, round($contractController->calculateVacationDays($contract, $start, $stop), 0)); // test "getDatesToWorkOn" $contract->start_date = $start; // 2013 has 365 days, 52 Saturdays and 52 Sundays, all of the 10 feast days are at working days (a good year for an employee!) // so we expect 365-52-52-10 = 251 days $workingDates = $contractController->getDatesToWorkOn($contract, $start, $stop); $this->assertEquals(251, count($workingDates['results'])); // test $respectTakenVacationDays parameter of getDatesToWorkOn $accountController = HumanResources_Controller_Account::getInstance(); $accounts = $accountController->createMissingAccounts(2013, $contract->employee_id); $account = $accounts->getFirstRecord(); $refDate = clone $newStartDate; // get a monday $refDate->addWeek(1)->addDay(1); // now add 3 vacation days $freetime = array('account_id' => $account->getId(), 'employee_id' => $contract->employee_id, 'type' => 'vacation', 'status' => 'ACCEPTED', 'firstday_date' => $refDate->toString()); $freetime['freedays'] = array(array('duration' => '1', 'date' => $refDate->toString()), array('duration' => '1', 'date' => $refDate->addDay(1)->toString()), array('duration' => '1', 'date' => $refDate->addDay(1)->toString())); $json = new HumanResources_Frontend_Json(); $freetime = $json->saveFreeTime($freetime); $workingDates = $contractController->getDatesToWorkOn($contract, $start, $stop, TRUE); $this->assertEquals(248, count($workingDates['results'])); // test "getFeastDays" $feastDays = $contractController->getFeastDays($contract, $start, $stop); // we expect 10 here $this->assertEquals(10, count($feastDays), '10 feast days should have been found!'); }