function enroll($user_id, $id, $type = 'iButton', $number = 0, $extra_value = NULL)
 {
     Debug::text('Client Version: ' . $this->getClientVersion() . ' User ID : ' . $user_id . ' ID: ' . substr($id, 0, 100) . ' Type: ' . $type . ' Number: ' . $number, __FILE__, __LINE__, __METHOD__, 10);
     $user_id = trim($user_id);
     $id = trim($id);
     $type = strtolower($type);
     $number = trim($number);
     $ulf = new UserListFactory();
     if (version_compare($this->getClientVersion(), '2.7.0', '<')) {
         Debug::text('aVersion: ' . $this->getClientVersion(), __FILE__, __LINE__, __METHOD__, 10);
         //Fingerprints can send $id=NULL to clear an enrollment.
         if (strpos($type, 'finger_print') === FALSE and $id == '') {
             Debug::text('ID is not valid: ' . $id, __FILE__, __LINE__, __METHOD__, 10);
             return FALSE;
         }
         //Check to make sure the logged in user has edit_advance permissions
         if ($this->getPermissionObject()->Check('user', 'enroll') or $this->getPermissionObject()->Check('user', 'enroll_child')) {
             Debug::text('User : '******' has Enroll permission', __FILE__, __LINE__, __METHOD__, 10);
             switch ($type) {
                 case 'finger_print_1':
                 case 'finger_print_2':
                 case 'finger_print_3':
                 case 'finger_print_4':
                     $enroll_user_obj = $ulf->getByIdAndCompanyId($user_id, $this->getUserObject()->getCompany());
                     if ($enroll_user_obj->getRecordCount() == 1) {
                         Debug::text('Enroller User ID : ' . $user_id . ' FOUND', __FILE__, __LINE__, __METHOD__, 10);
                         $enroll_user_obj = $enroll_user_obj->getCurrent();
                         switch ($type) {
                             case 'finger_print_1':
                                 $number = 10;
                                 break;
                             case 'finger_print_2':
                                 $number = 20;
                                 break;
                             case 'finger_print_3':
                                 $number = 30;
                                 break;
                             case 'finger_print_4':
                                 $number = 40;
                                 break;
                         }
                         $uilf = new UserIdentificationListFactory();
                         $uilf->getByUserIdAndTypeIdAndNumber($enroll_user_obj->getID(), 20, $number);
                         if ($uilf->getRecordCount() > 0) {
                             $uif = $uilf->getCurrent();
                         } else {
                             $uif = new UserIdentificationFactory();
                         }
                         if ($id == '' and $uilf->getRecordCount() > 0) {
                             Debug::text('Deleting Fingerprint...', __FILE__, __LINE__, __METHOD__, 10);
                             $uif->setDeleted(TRUE);
                             if ($uif->isValid()) {
                                 if ($uif->save()) {
                                     return TRUE;
                                 }
                             }
                         } elseif ($id != '') {
                             $uif->setUser($enroll_user_obj->getId());
                             $uif->setType(20);
                             //Griaule
                             $uif->setNumber($number);
                             $uif->setValue($id);
                             if ($uif->isValid()) {
                                 if ($uif->save()) {
                                     return TRUE;
                                 }
                             }
                         }
                         Debug::text('Enroll User Object not valid : ' . $user_id, __FILE__, __LINE__, __METHOD__, 10);
                     } else {
                         Debug::text('User ID : ' . $user_id . ' NOT FOUND', __FILE__, __LINE__, __METHOD__, 10);
                     }
                     break;
                 case 'ibutton':
                     //Remove ibutton from current user.
                     $uilf = new UserIdentificationListFactory();
                     $uilf->getByCompanyIdAndTypeIdAndValue($this->getUserObject()->getCompany(), 10, $id);
                     if ($uilf->getRecordCount() > 0) {
                         foreach ($uilf as $ui_obj) {
                             Debug::text('Removing iButton ID from User: '******'Didnt find current user with iButton assigned...', __FILE__, __LINE__, __METHOD__, 10);
                     }
                     $enroll_user_obj = $ulf->getByIdAndCompanyId($user_id, $this->getUserObject()->getCompany());
                     if ($enroll_user_obj->getRecordCount() == 1) {
                         Debug::text('Enroller User ID : ' . $user_id . ' FOUND', __FILE__, __LINE__, __METHOD__, 10);
                         $enroll_user_obj = $enroll_user_obj->getCurrent();
                         $uilf = new UserIdentificationListFactory();
                         $uilf->getByUserIdAndTypeIdAndNumber($enroll_user_obj->getID(), 10, 0);
                         if ($uilf->getRecordCount() > 0) {
                             $uif = $uilf->getCurrent();
                         } else {
                             $uif = new UserIdentificationFactory();
                         }
                         $uif->setUser($enroll_user_obj->getId());
                         $uif->setType(10);
                         //iButton
                         $uif->setNumber(0);
                         $uif->setValue($id);
                         if ($uif->isValid()) {
                             if ($uif->save()) {
                                 return TRUE;
                             }
                         }
                         Debug::text('Enroll User Object not valid : ' . $user_id, __FILE__, __LINE__, __METHOD__, 10);
                     } else {
                         Debug::text('User ID : ' . $user_id . ' NOT FOUND', __FILE__, __LINE__, __METHOD__, 10);
                     }
                     /*
                     $ulf->getByCompanyIDAndIButtonId( $this->getUserObject()->getCompany(), $id );
                     if ( $ulf->getRecordCount() > 0 ) {
                     	$old_user_obj = $ulf->getCurrent();
                     
                     	Debug::text('Removing iButton ID from User: '******'Didnt find current user with iButton assigned...', __FILE__, __LINE__, __METHOD__, 10);
                     }
                     
                     //$enroll_user_obj = $ulf->getByUserNameAndCompanyId( $user_name, $this->getUserObject()->getCompany() );
                     $enroll_user_obj = $ulf->getByIdAndCompanyId( $user_id, $this->getUserObject()->getCompany() );
                     
                     if ( $enroll_user_obj->getRecordCount() == 1 ) {
                     	Debug::text('Enroller User ID : '. $user_id .' FOUND', __FILE__, __LINE__, __METHOD__, 10);
                     
                     	$enroll_user_obj = $enroll_user_obj->getCurrent();
                     
                     	//Update ibutton id.
                     	$enroll_user_obj->setIButtonID( $id );
                     	if ( $enroll_user_obj->isValid() ) {
                     		if ( $enroll_user_obj->save() ) {
                     			return TRUE;
                     		}
                     	}
                     
                     	Debug::text('Enroll User Object not valid : '. $user_id, __FILE__, __LINE__, __METHOD__, 10);
                     } else {
                     	Debug::text('User ID : '. $user_id .' NOT FOUND', __FILE__, __LINE__, __METHOD__, 10);
                     }
                     */
                     break;
             }
         } else {
             Debug::text('User : '******' DOES NOT HAVE edit advance permission', __FILE__, __LINE__, __METHOD__, 10);
         }
     } else {
         //This code path needs to handle re-enrolling iButtons, proximity cards, etc... for a different employees.
         Debug::text('bVersion: ' . $this->getClientVersion(), __FILE__, __LINE__, __METHOD__, 10);
         $ulf->getByIdAndCompanyId($user_id, $this->getUserObject()->getCompany());
         if ($ulf->getRecordCount() == 1) {
             Debug::text('Enroller User ID : ' . $user_id . ' FOUND', __FILE__, __LINE__, __METHOD__, 10);
             //Checking to see if value is enrolled for a different user first.
             $uilf = new UserIdentificationListFactory();
             $uilf->getByCompanyIdAndTypeIdAndValue($this->getUserObject()->getCompany(), $type, $id);
             if ($uilf->getRecordCount() > 0) {
                 foreach ($uilf as $ui_obj) {
                     Debug::text('Removing enolled value from User: '******'Didnt find current user with enrolled value assigned...', __FILE__, __LINE__, __METHOD__, 10);
             }
             $enroll_user_obj = $ulf->getCurrent();
             $uilf = new UserIdentificationListFactory();
             $uilf->getByUserIdAndTypeIdAndNumber($enroll_user_obj->getID(), $type, $number);
             if ($uilf->getRecordCount() > 0) {
                 $uif = $uilf->getCurrent();
             } else {
                 $uif = new UserIdentificationFactory();
             }
             if ($id == '' and $uilf->getRecordCount() > 0) {
                 Debug::text('Deleting User Identification...', __FILE__, __LINE__, __METHOD__, 10);
                 $uif->setDeleted(TRUE);
                 if ($uif->isValid()) {
                     if ($uif->save()) {
                         return TRUE;
                     }
                 }
             } elseif ($id != '') {
                 Debug::text('Adding/Modifying User Identification...', __FILE__, __LINE__, __METHOD__, 10);
                 $uif->setUser($enroll_user_obj->getId());
                 $uif->setType($type);
                 $uif->setNumber($number);
                 $uif->setValue($id);
                 //Primarily used to store raw fingerprint images during enroll.
                 if ($extra_value != '') {
                     $uif->setExtraValue($extra_value);
                 }
                 if ($uif->isValid()) {
                     if ($uif->save()) {
                         return TRUE;
                     }
                 }
             }
             Debug::text('Enroll User Object not valid : ' . $user_id, __FILE__, __LINE__, __METHOD__, 10);
         } else {
             Debug::text('User ID : ' . $user_id . ' NOT FOUND', __FILE__, __LINE__, __METHOD__, 10);
         }
     }
     return FALSE;
 }
    function getIsModifiedByCompanyIdAndDate($company_id, $date, $where = NULL, $order = NULL)
    {
        if ($company_id == '') {
            return FALSE;
        }
        if ($date == '') {
            return FALSE;
        }
        $ph = array('company_id' => $company_id, 'created_date' => $date, 'updated_date' => $date, 'uif_created_date' => $date);
        $uif = new UserIdentificationFactory();
        //INCLUDE Deleted rows in this query.
        //Also include users with user_identifcation rows that have been *created* after the given date
        //so the first supervisor/admin enrolled on a timeclock is properly updated to lock the menu.
        $query = '
					select 	a.*
					from	' . $this->getTable() . ' as a
					LEFT JOIN ' . $uif->getTable() . ' as uif ON ( a.id = uif.user_id )
					where
							a.company_id = ?
						AND
							( a.created_date >= ? OR a.updated_date >= ? OR uif.created_date >= ? )
					';
        $query .= $this->getWhereSQL($where);
        $query .= $this->getSortSQL($order);
        $this->rs = $this->db->SelectLimit($query, 1, -1, $ph);
        if ($this->getRecordCount() > 0) {
            Debug::text('User rows have been modified: ' . $this->getRecordCount(), __FILE__, __LINE__, __METHOD__, 10);
            return TRUE;
        }
        Debug::text('User rows have NOT been modified', __FILE__, __LINE__, __METHOD__, 10);
        return FALSE;
    }
 function postInstall()
 {
     Debug::text('postInstall: ' . $this->getVersion(), __FILE__, __LINE__, __METHOD__, 9);
     //Copy iButton,Fingerprint,EmployeeNumber (barcode/proximity) fields to new UserIdentification table.
     //Find out if they have both TimeClocks and FingerPrint stations. If they do
     //we need to copy the fingerprint data to both types of UserIdentification rows.
     $clf = new CompanyListFactory();
     $clf->getAll();
     $clf->StartTransaction();
     foreach ($clf as $c_obj) {
         Debug::text('Company: ' . $c_obj->getName(), __FILE__, __LINE__, __METHOD__, 9);
         $max_templates = 4;
         $slf = new StationListFactory();
         $slf->getByCompanyIdAndTypeId($c_obj->getId(), array(30, 40, 50, 100, 110));
         if ($slf->getRecordCount() > 0) {
             $slf_tmp1 = $slf->getByCompanyIdAndTypeId($c_obj->getId(), array(50));
             $griaule_stations = $slf_tmp1->getRecordCount();
             Debug::text('  Found Griaule Stations: ' . $griaule_stations, __FILE__, __LINE__, __METHOD__, 9);
             unset($slf_tmp1);
             $slf_tmp2 = $slf->getByCompanyIdAndTypeId($c_obj->getId(), array(100, 110));
             $zk_stations = $slf_tmp2->getRecordCount();
             Debug::text('  Found ZK Stations: ' . $zk_stations, __FILE__, __LINE__, __METHOD__, 9);
             unset($slf_tmp2);
             $slf_tmp3 = $slf->getByCompanyIdAndTypeId($c_obj->getId(), array(40));
             $barcode_stations = $slf_tmp3->getRecordCount();
             Debug::text('  Found Barcode Stations: ' . $barcode_stations, __FILE__, __LINE__, __METHOD__, 9);
             unset($slf_tmp3);
             //Loop through each user copying their data to the UserIdenfification Table.
             $ulf = new UserListFactory();
             $ulf->getByCompanyID($c_obj->getId());
             if ($ulf->getRecordCount() > 0) {
                 foreach ($ulf as $u_obj) {
                     Debug::text('  User: '******'') {
                         Debug::text('    Converting iButton...', __FILE__, __LINE__, __METHOD__, 9);
                         $uif = new UserIdentificationFactory();
                         $uif->setUser($u_obj->getId());
                         $uif->setType(10);
                         //10=iButton
                         $uif->setNumber(0);
                         $uif->setValue($u_obj->getIButtonID());
                         if ($uif->isValid() == TRUE) {
                             $uif->Save();
                             $u_obj->getIButtonID('');
                         }
                     }
                     if ($u_obj->getRFID() != '') {
                         Debug::text('    Converting RFID...', __FILE__, __LINE__, __METHOD__, 9);
                         $uif = new UserIdentificationFactory();
                         $uif->setUser($u_obj->getId());
                         $uif->setType(40);
                         //40=Proximity
                         $uif->setNumber(0);
                         $uif->setValue($u_obj->getRFID());
                         if ($uif->isValid() == TRUE) {
                             $uif->Save();
                             $u_obj->getRFID('');
                         }
                     }
                     if ($barcode_stations > 0 and $u_obj->getEmployeeNumber() != '') {
                         Debug::text('    Converting EmployeeNumber...', __FILE__, __LINE__, __METHOD__, 9);
                         $uif = new UserIdentificationFactory();
                         $uif->setUser($u_obj->getId());
                         $uif->setType(30);
                         //30=Barcode
                         $uif->setNumber(0);
                         $uif->setValue($u_obj->getEmployeeNumber());
                         if ($uif->isValid() == TRUE) {
                             $uif->Save();
                         }
                     }
                     if ($griaule_stations > 0) {
                         for ($t = 1; $t <= $max_templates; $t++) {
                             $set_fingerprint_function = 'setFingerPrint' . $t;
                             $get_fingerprint_function = 'getFingerPrint' . $t;
                             //Griaule fingerprint templates start with: "p/8B"
                             if ($u_obj->{$get_fingerprint_function}() != '' and substr($u_obj->{$get_fingerprint_function}(), 0, 4) == 'p/8B') {
                                 Debug::text('    Converting Griaule FingerPrint: ' . $t, __FILE__, __LINE__, __METHOD__, 9);
                                 $uif = new UserIdentificationFactory();
                                 $uif->setUser($u_obj->getId());
                                 $uif->setType(20);
                                 //20=Griaule, 100=ZK
                                 $uif->setNumber($t * 10);
                                 $uif->setValue($u_obj->{$get_fingerprint_function}());
                                 if ($uif->isValid() == TRUE) {
                                     $uif->Save();
                                     $u_obj->{$set_fingerprint_function}('');
                                 }
                             }
                         }
                     }
                     if ($zk_stations > 0) {
                         for ($t = 1; $t <= $max_templates; $t++) {
                             $set_fingerprint_function = 'setFingerPrint' . $t;
                             $get_fingerprint_function = 'getFingerPrint' . $t;
                             //ZK fingerprint templates start with: "oco"
                             if ($u_obj->{$get_fingerprint_function}() != '' and substr($u_obj->{$get_fingerprint_function}(), 0, 3) == 'oco') {
                                 Debug::text('    Converting ZK FingerPrint: ' . $t, __FILE__, __LINE__, __METHOD__, 9);
                                 $uif = new UserIdentificationFactory();
                                 $uif->setUser($u_obj->getId());
                                 $uif->setType(100);
                                 //20=Griaule, 100=ZK
                                 $uif->setNumber($t);
                                 $uif->setValue($u_obj->{$get_fingerprint_function}());
                                 if ($uif->isValid() == TRUE) {
                                     $uif->Save();
                                     $u_obj->{$set_fingerprint_function}('');
                                 }
                             }
                         }
                     }
                     if ($u_obj->isValid()) {
                         $u_obj->Save();
                     }
                 }
             }
         }
     }
     $clf->CommitTransaction();
     return TRUE;
 }