Exemple #1
0
 public function placeItemHold($recordId, $itemId, $patronId, $comment, $type)
 {
     global $configArray;
     global $user;
     $userId = $user->id;
     //Get the session token for the user
     if (isset(HorizonAPI::$sessionIdsForUsers[$userId])) {
         $sessionToken = HorizonAPI::$sessionIdsForUsers[$userId];
     } else {
         //Log the user in
         list($userValid, $sessionToken) = $this->loginViaWebService($user->cat_username, $user->cat_password);
         if (!$userValid) {
             return array('result' => false, 'message' => 'Sorry, it does not look like you are logged in currently.  Please login and try again');
         }
     }
     // Retrieve Full Marc Record
     require_once ROOT_DIR . '/RecordDrivers/Factory.php';
     $record = RecordDriverFactory::initRecordDriverById('ils:' . $recordId);
     if (!$record) {
         $title = null;
     } else {
         $title = $record->getTitle();
     }
     if ($configArray['Catalog']['offline']) {
         global $user;
         require_once ROOT_DIR . '/sys/OfflineHold.php';
         $offlineHold = new OfflineHold();
         $offlineHold->bibId = $recordId;
         $offlineHold->patronBarcode = $patronId;
         $offlineHold->patronId = $user->id;
         $offlineHold->timeEntered = time();
         $offlineHold->status = 'Not Processed';
         if ($offlineHold->insert()) {
             return array('title' => $title, 'bib' => $recordId, 'result' => true, 'message' => 'The circulation system is currently offline.  This hold will be entered for you automatically when the circulation system is online.');
         } else {
             return array('title' => $title, 'bib' => $recordId, 'result' => false, 'message' => 'The circulation system is currently offline and we could not place this hold.  Please try again later.');
         }
     } else {
         if ($type == 'cancel' || $type == 'recall' || $type == 'update') {
             $result = $this->updateHold($recordId, $patronId, $type, $title);
             $result['title'] = $title;
             $result['bid'] = $recordId;
             return $result;
         } else {
             if (isset($_REQUEST['campus'])) {
                 $campus = trim($_REQUEST['campus']);
             } else {
                 global $user;
                 $campus = $user->homeLocationId;
             }
             //create the hold using the web service
             $createHoldUrl = $configArray['Catalog']['webServiceUrl'] . '/standard/createMyHold?clientID=' . $configArray['Catalog']['clientId'] . '&sessionToken=' . $sessionToken . '&pickupLocation=' . $campus . '&titleKey=' . $recordId;
             if ($itemId) {
                 $createHoldUrl .= '&itemKey=' . $itemId;
             }
             $createHoldResponse = $this->getWebServiceResponse($createHoldUrl);
             $hold_result = array();
             if ($createHoldResponse == true) {
                 $hold_result['result'] = true;
                 $hold_result['message'] = 'Your hold was placed successfully.';
             } else {
                 $hold_result['result'] = false;
                 $hold_result['message'] = 'Your hold could not be placed. ';
                 if (isset($createHoldResponse->message)) {
                     $hold_result['message'] .= (string) $createHoldResponse->message;
                 } else {
                     if (isset($createHoldResponse->string)) {
                         $hold_result['message'] .= (string) $createHoldResponse->string;
                     }
                 }
             }
             $hold_result['title'] = $title;
             $hold_result['bid'] = $recordId;
             global $analytics;
             if ($analytics) {
                 if ($hold_result['result'] == true) {
                     $analytics->addEvent('ILS Integration', 'Successful Hold', $title);
                 } else {
                     $analytics->addEvent('ILS Integration', 'Failed Hold', $hold_result['message'] . ' - ' . $title);
                 }
             }
             //Clear the patron profile
             $this->clearPatronProfile();
             return $hold_result;
         }
     }
 }
 /**
  * Place Item Hold
  *
  * This is responsible for both placing item level holds.
  *
  * @param   string  $recordId   The id of the bib record
  * @param   string  $itemId     The id of the item to hold
  * @param   string  $patronId   The id of the patron
  * @param   string  $comment    Any comment regarding the hold or recall
  * @param   string  $type       Whether to place a hold or recall
  * @param   string  $type       The date when the hold should be cancelled if any
  * @return  mixed               True if successful, false if unsuccessful
  *                              If an error occurs, return a PEAR_Error
  * @access  public
  */
 public function placeItemHold($recordId, $itemId, $patronId, $comment, $type)
 {
     global $configArray;
     $bib1 = $recordId;
     if (substr($bib1, 0, 1) != '.') {
         $bib1 = '.' . $bib1;
     }
     $bib = substr(str_replace('.b', 'b', $bib1), 0, -1);
     if (strlen($bib) == 0) {
         return array('result' => false, 'message' => 'A valid record id was not provided. Please try again.');
     }
     //Get the title of the book.
     $class = $configArray['Index']['engine'];
     $url = $configArray['Index']['url'];
     $this->driver->db = new $class($url);
     // Retrieve Full Marc Record
     require_once ROOT_DIR . '/RecordDrivers/Factory.php';
     $record = RecordDriverFactory::initRecordDriverById('ils:' . $bib1);
     if (!$record) {
         $title = null;
     } else {
         $title = $record->getTitle();
     }
     if ($configArray['Catalog']['offline']) {
         global $user;
         require_once ROOT_DIR . '/sys/OfflineHold.php';
         $offlineHold = new OfflineHold();
         $offlineHold->bibId = $bib1;
         $offlineHold->patronBarcode = $patronId;
         $offlineHold->patronId = $user->id;
         $offlineHold->timeEntered = time();
         $offlineHold->status = 'Not Processed';
         if ($offlineHold->insert()) {
             return array('title' => $title, 'bib' => $bib1, 'result' => true, 'message' => 'The circulation system is currently offline.  This hold will be entered for you automatically when the circulation system is online.');
         } else {
             return array('title' => $title, 'bib' => $bib1, 'result' => false, 'message' => 'The circulation system is currently offline and we could not place this hold.  Please try again later.');
         }
     } else {
         //Cancel a hold
         if ($type == 'cancel' || $type == 'recall' || $type == 'update') {
             $result = $this->updateHold($recordId, $patronId, $type, $title);
             $result['title'] = $title;
             $result['bid'] = $bib1;
             return $result;
         } else {
             if (isset($_REQUEST['canceldate']) && !is_null($_REQUEST['canceldate']) && $_REQUEST['canceldate'] != '') {
                 $date = $_REQUEST['canceldate'];
             } else {
                 //Default to a date 6 months (half a year) in the future.
                 $sixMonthsFromNow = time() + 182.5 * 24 * 60 * 60;
                 $date = date('m/d/Y', $sixMonthsFromNow);
             }
             if (isset($_REQUEST['campus'])) {
                 $campus = trim($_REQUEST['campus']);
             } else {
                 global $user;
                 $campus = $user->homeLocationId;
             }
             if (is_numeric($campus)) {
                 $location = new Location();
                 $location->locationId = $campus;
                 if ($location->find(true)) {
                     $campus = $location->code;
                 }
             }
             list($Month, $Day, $Year) = explode("/", $date);
             //------------BEGIN CURL-----------------------------------------------------------------
             $header = array();
             $header[0] = "Accept: text/xml,application/xml,application/xhtml+xml,";
             $header[0] .= "text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
             $header[] = "Cache-Control: max-age=0";
             $header[] = "Connection: keep-alive";
             $header[] = "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7";
             $header[] = "Accept-Language: en-us,en;q=0.5";
             $cookie = tempnam("/tmp", "CURLCOOKIE");
             $curl_connection = curl_init();
             curl_setopt($curl_connection, CURLOPT_CONNECTTIMEOUT, 30);
             curl_setopt($curl_connection, CURLOPT_HTTPHEADER, $header);
             curl_setopt($curl_connection, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)");
             curl_setopt($curl_connection, CURLOPT_RETURNTRANSFER, true);
             curl_setopt($curl_connection, CURLOPT_SSL_VERIFYPEER, false);
             curl_setopt($curl_connection, CURLOPT_FOLLOWLOCATION, true);
             curl_setopt($curl_connection, CURLOPT_UNRESTRICTED_AUTH, true);
             curl_setopt($curl_connection, CURLOPT_COOKIEJAR, $cookie);
             curl_setopt($curl_connection, CURLOPT_COOKIESESSION, true);
             curl_setopt($curl_connection, CURLOPT_FORBID_REUSE, false);
             curl_setopt($curl_connection, CURLOPT_HEADER, false);
             curl_setopt($curl_connection, CURLOPT_POST, true);
             $lt = null;
             if (isset($configArray['Catalog']['loginPriorToPlacingHolds']) && ($configArray['Catalog']['loginPriorToPlacingHolds'] = true)) {
                 //User must be logged in as a separate step to placing holds
                 $curl_url = $configArray['Catalog']['url'] . "/patroninfo";
                 $post_data = $this->driver->_getLoginFormValues();
                 $post_data['submit.x'] = "35";
                 $post_data['submit.y'] = "21";
                 $post_data['submit'] = "submit";
                 curl_setopt($curl_connection, CURLOPT_REFERER, $curl_url);
                 curl_setopt($curl_connection, CURLOPT_URL, $curl_url);
                 $post_items = array();
                 foreach ($post_data as $key => $value) {
                     $post_items[] = $key . '=' . $value;
                 }
                 $post_string = implode('&', $post_items);
                 curl_setopt($curl_connection, CURLOPT_POSTFIELDS, $post_string);
                 $loginResult = curl_exec($curl_connection);
                 $curlInfo = curl_getinfo($curl_connection);
                 //When a library uses Encore, the initial login does a redirect and requires additional parameters.
                 if (preg_match('/<input type="hidden" name="lt" value="(.*?)" \\/>/si', $loginResult, $loginMatches)) {
                     //Get the lt value
                     $lt = $loginMatches[1];
                     //Login again
                     $post_data['lt'] = $lt;
                     $post_data['_eventId'] = 'submit';
                     $post_items = array();
                     foreach ($post_data as $key => $value) {
                         $post_items[] = $key . '=' . $value;
                     }
                     $post_string = implode('&', $post_items);
                     curl_setopt($curl_connection, CURLOPT_POSTFIELDS, $post_string);
                     $loginResult = curl_exec($curl_connection);
                     $curlInfo = curl_getinfo($curl_connection);
                 }
                 $post_data = array();
             } else {
                 $post_data = $this->driver->_getLoginFormValues();
             }
             $scope = $this->driver->getLibraryScope();
             $curl_url = $configArray['Catalog']['url'] . "/search/.{$bib}/.{$bib}/1,1,1,B/request~{$bib}";
             //echo "$curl_url";
             curl_setopt($curl_connection, CURLOPT_URL, $curl_url);
             /** @var Library $librarySingleton */
             global $librarySingleton;
             $patronHomeBranch = $librarySingleton->getPatronHomeLibrary();
             if ($patronHomeBranch->defaultNotNeededAfterDays != -1) {
                 $post_data['needby_Month'] = $Month;
                 $post_data['needby_Day'] = $Day;
                 $post_data['needby_Year'] = $Year;
             }
             $post_data['submit.x'] = "35";
             $post_data['submit.y'] = "21";
             $post_data['submit'] = "submit";
             $post_data['locx00'] = str_pad($campus, 5 - strlen($campus), '+');
             if (!is_null($itemId) && $itemId != -1) {
                 $post_data['radio'] = $itemId;
             }
             $post_data['x'] = "48";
             $post_data['y'] = "15";
             if ($lt != null) {
                 $post_data['lt'] = $lt;
                 $post_data['_eventId'] = 'submit';
             }
             $post_items = array();
             foreach ($post_data as $key => $value) {
                 $post_items[] = $key . '=' . $value;
             }
             $post_string = implode('&', $post_items);
             curl_setopt($curl_connection, CURLOPT_POSTFIELDS, $post_string);
             $sResult = curl_exec($curl_connection);
             global $logger;
             $logger->log("Placing hold {$curl_url}?{$post_string}", PEAR_LOG_INFO);
             $sResult = preg_replace("/<!--([^(-->)]*)-->/", "", $sResult);
             curl_close($curl_connection);
             //Parse the response to get the status message
             $hold_result = $this->_getHoldResult($sResult);
             $hold_result['title'] = $title;
             $hold_result['bid'] = $bib1;
             global $analytics;
             if ($analytics) {
                 if ($hold_result['result'] == true) {
                     $analytics->addEvent('ILS Integration', 'Successful Hold', $title);
                 } else {
                     $analytics->addEvent('ILS Integration', 'Failed Hold', $hold_result['message'] . ' - ' . $title);
                 }
             }
             //Clear the patron profile
             $this->driver->clearPatronProfile();
             return $hold_result;
         }
     }
 }