/**
 <<<<<<< 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!');
 }