/**
  * Retrieve a specific employee or search for employees based on given criteria
  * GET /api/employee/:netId OR GET /api/employee?firstName=x&lastName=y&netId=z&fullTime=1&active=0&area=4
  *
  * If a netId is given, the get data is ignored and the employee who matches
  *   the given netId will be returned
  * If netId is omitted a search is performed. The following parameters can be given:
  *   firstName string
  *   lastName  string
  *   netId     string
  *   fullTime  0/1
  *   active    -1/0/1
  *   area      (int)
  *
  * The parameters firstName, lastName and netId match any employee where the given
  *   fields contain the supplied search string. (i.e. firstName=m matches any employee with m in their first name)
  * The parameters fullTime, active, and area must be exact matches
  *   (i.e. fullTime=1 will only retrieve fullTime employees)
  *
  * returns:
  * {
  *    Status: OK/failed,
  *    data: {
  *        netID: "",
  *        active: -1/0/1,
  *        area: int,
  *        firstName: "",
  *        lastName: "",
  *        maidenName: "",
  *        phone: "",
  *        email: "",
  *        chqId: "",
  *        birthday: "",
  *        languages: "",
  *        hometown: "",
  *        major: "",
  *        mission: "",
  *        graduation: "",
  *        position: int,
  *        shift: "",
  *        supervisor: "",
  *        hireDate: "",
  *        certification: "",
  *        international: 0/1,
  *        byuId: "",
  *        fullTime: 0/1
  *    }
  * }
  */
 public function get($params)
 {
     $this->requireAuthentication();
     $single = isset($params['url'][2]) ? true : false;
     $employeeAccessor = new \TMT\accessor\Employee();
     $areaAccessor = new \TMT\accessor\AreaAccessor();
     $userAreas = $areaAccessor->getAll($this->user['netId']);
     // Respond for single employee
     if ($single) {
         $netId = $params['url'][2];
         $employeeAreas = $areaAccessor->getAll($netId);
         // Determine if both employees have rights to an area in common
         $overlap = false;
         foreach ($employeeAreas as $eArea) {
             foreach ($userAreas as $uArea) {
                 if ($uArea->ID === $eArea->ID) {
                     $overlap = true;
                     break;
                 }
             }
             if ($overlap) {
                 break;
             }
         }
         if (!$overlap) {
             $this->error("You do not have rights to see this employee's data");
             return;
         }
         $employee = $employeeAccessor->get($netId);
         $this->respond($employee);
         return;
     }
     // Respond if it is a search
     $search = $params['request'];
     unset($search['url']);
     $employees = $employeeAccessor->search($search);
     $results = array();
     // Filter results to only return employees who have access to an area in common with the user
     for ($i = 0; $i < count($employees); $i++) {
         $employeeAreas = $areaAccessor->getAll($employees[$i]->netID);
         $overlap = false;
         foreach ($employeeAreas as $eArea) {
             foreach ($userAreas as $uArea) {
                 if ($uArea->ID === $eArea->ID) {
                     $overlap = true;
                     $results[] = $employees[$i];
                     break;
                 }
             }
             if ($overlap) {
                 break;
             }
         }
     }
     $this->respond($results);
 }
 /**
  * @covers ::search
  */
 public function testSearch()
 {
     $accessor = new \TMT\accessor\Employee();
     $employees = $accessor->search();
     $this->assertEquals(0, count($employees));
     $employees = $accessor->search(array());
     $this->assertEquals(0, count($employees));
     $employees = $accessor->search(array('something' => "L"));
     $this->assertEquals(0, count($employees));
     $employees = $accessor->search(array('lastName' => "l"));
     $this->assertEquals(3, count($employees));
     $employees = $accessor->search(array('firstName' => "f"));
     $this->assertEquals(2, count($employees));
     $employees = $accessor->search(array('firstName' => "f", 'lastName' => 'o'));
     $this->assertEquals(4, count($employees));
     $employees = $accessor->search(array('firstName' => "f", 'lastName' => 'o', 'area' => 1));
     $this->assertEquals(1, count($employees));
     $this->assertEquals("netId", $employees[0]->netID);
     $employees = $accessor->search(array('firstName' => "f", 'lastName' => 'o', 'active' => 1));
     $this->assertEquals(2, count($employees));
     $employees = $accessor->search(array('netId' => "e"));
     $this->assertEquals(4, count($employees));
     $employees = $accessor->search(array('netId' => "e", 'area' => 4));
     $this->assertEquals(0, count($employees));
     $employees = $accessor->search(array('netId' => "e", 'fullTime' => 1));
     $this->assertEquals(2, count($employees));
     $employees = $accessor->search(array('active' => 1, 'area' => 1, 'fullTime' => 0));
     $this->assertEquals(1, count($employees));
     $this->assertEquals($employees[0]->netID, "netId");
     $employees = $accessor->search(array('active' => 1, 'area' => 2, 'fullTime' => 1));
     $this->assertEquals(1, count($employees));
     $this->assertEquals("other", $employees[0]->netID);
     $employees = $accessor->search(array('firstName' => 'e', 'lastName' => 'e', 'netId' => 'e', 'active' => 0, 'area' => 2, 'fullTime' => 1));
     $this->assertEquals(1, count($employees));
     $this->assertEquals("employee2", $employees[0]->netID);
     $employees = $accessor->search(array('firstName' => 'e', 'lastName' => 'e', 'netId' => 'e'));
     $this->assertEquals(4, count($employees));
     $employees = $accessor->search(array('firstName' => 'emp', 'lastName' => 'emp', 'netId' => 'emp'));
     $this->assertEquals(1, count($employees));
     $this->assertEquals("employee2", $employees[0]->netID);
 }