/** * Retrieves a document specified by the item barcode. * * @param string $barcode A barcode of an item in the document to retrieve from Solr * @access public * @throws object PEAR Error * @return string The requested resource */ function getRecordByBarcode($barcode) { return $this->indexEngine->getRecordByBarcode($barcode); }
/** * Process inventory for a particular item in the catalog * * @param string $login Login for the user doing the inventory * @param string $password1 Password for the user doing the inventory * @param string $initials * @param string $password2 * @param string[] $barcodes * @param boolean $updateIncorrectStatuses * * @return array */ function doInventory($login, $password1, $initials, $password2, $barcodes, $updateIncorrectStatuses) { global $configArray; global $logger; $results = array(); if (!isset($configArray['Catalog']['url'])) { return array('success' => false, 'message' => 'There is not a url to millennium set in the config.ini file. Please update the configuration'); } $ils = $configArray['Catalog']['ils']; if ($login == '' || $password1 == '') { return array('success' => false, 'message' => 'Login information not provided correctly. Please fill out all login fields'); } if ($ils != 'Sierra') { if ($initials == '' || $password2 == '') { return array('success' => false, 'message' => 'Login information not provided correctly. Please fill out all login fields'); } } if (is_string($barcodes) && strlen($barcodes) == 0) { return array('success' => false, 'message' => 'Please enter at least one barcode to inventory.'); } else { if (!is_array($barcodes)) { $barcodes = preg_split('/[\\s\\r\\n]+/', $barcodes); } if (count($barcodes) == 0) { return array('success' => false, 'message' => 'Please enter at least one barcode to inventory.'); } } //Setup Solr to be able to get additional information about the title global $configArray; $class = $configArray['Index']['engine']; $url = $configArray['Index']['url']; $this->db = new $class($url); $baseUrl = $configArray['Catalog']['url']; $circaUrl = $configArray['Catalog']['url'] . '/iii/airwkst/airwkstcore'; //Setup curl $curl_url = $circaUrl; $this->curl_connection = curl_init($curl_url); $cookieJar = tempnam("/tmp", "CURLCOOKIE"); curl_setopt($this->curl_connection, CURLOPT_CONNECTTIMEOUT, 30); curl_setopt($this->curl_connection, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"); curl_setopt($this->curl_connection, CURLOPT_RETURNTRANSFER, true); curl_setopt($this->curl_connection, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($this->curl_connection, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($this->curl_connection, CURLOPT_UNRESTRICTED_AUTH, true); curl_setopt($this->curl_connection, CURLOPT_COOKIEJAR, $cookieJar); curl_setopt($this->curl_connection, CURLOPT_HTTPGET, true); curl_setopt($this->curl_connection, CURLOPT_COOKIESESSION, is_null($cookieJar) ? true : false); //First get the login page curl_exec($this->curl_connection); sleep(1); //Login to circa $post_data = array('action' => 'ValidateAirWkstUserAction', 'login' => $login, 'loginpassword' => $password1, 'nextaction' => 'null', 'purpose' => 'null', 'submit.x' => 41, 'submit.y' => 10, 'subpurpose' => 'null', 'validationstatus' => 'needlogin'); $post_items = array(); foreach ($post_data as $key => $value) { $post_items[] = $key . '=' . urlencode($value); } $post_string = implode('&', $post_items); curl_setopt($this->curl_connection, CURLOPT_POST, true); curl_setopt($this->curl_connection, CURLOPT_POSTFIELDS, $post_string); $sresult = curl_exec($this->curl_connection); $logger->log("Calling {$curl_url}?{$post_string}", PEAR_LOG_DEBUG); //$logger->log("result of circa login $sresult", PEAR_LOG_DEBUG); sleep(1); //Check that we logged in successfully $loginSuccess = false; if (!preg_match('/Invalid login\\/password/i', $sresult)) { if ($ils == 'Sierra') { $loginSuccess = true; } else { $loginSuccess = preg_match('/initials/i', $sresult); } } if ($loginSuccess) { if ($ils != 'Sierra') { //we logged in successfully. //enter initials $post_data = array('action' => 'ValidateAirWkstUserAction', 'initials' => $initials, 'initialspassword' => $password2, 'nextaction' => 'null', 'purpose' => 'null', 'submit.x' => 30, 'submit.y' => 10, 'subpurpose' => 'null', 'validationstatus' => 'needinitials'); $post_items = array(); foreach ($post_data as $key => $value) { $post_items[] = $key . '=' . urlencode($value); } $post_string = implode('&', $post_items); curl_setopt($this->curl_connection, CURLOPT_POSTFIELDS, $post_string); $sresult = curl_exec($this->curl_connection); sleep(1); $logger->log("Calling {$curl_url}?{$post_string}", PEAR_LOG_DEBUG); //$logger->log("result of circa initials $sresult", PEAR_LOG_DEBUG); } if (!preg_match('/You are not authorized to use Circa/i', $sresult) && preg_match('/inventory control/i', $sresult)) { //Logged in and authorized, check in each barcode //Go to the Inventory page curl_setopt($this->curl_connection, CURLOPT_HTTPGET, true); curl_setopt($this->curl_connection, CURLOPT_URL, $baseUrl . '/iii/airwkst/?action=GetAirWkstUserInfoAction&purpose=updinvdt'); curl_exec($this->curl_connection); curl_setopt($this->curl_connection, CURLOPT_POST, true); curl_setopt($this->curl_connection, CURLOPT_URL, $curl_url); $results['barcodes'] = array(); foreach ($barcodes as $barcode) { set_time_limit(60); $post_data = array('action' => 'GetAirWkstItemOneAction', 'prevscreen' => 'AirWkstItemRequestPage', 'purpose' => 'updinvdt', 'searchstring' => $barcode, 'searchtype' => 'b', 'sourcebrowse' => 'airwkstpage'); $post_items = array(); foreach ($post_data as $key => $value) { $post_items[] = $key . '=' . urlencode($value); } $post_string = implode('&', $post_items); curl_setopt($this->curl_connection, CURLOPT_POSTFIELDS, $post_string); $sresult = curl_exec($this->curl_connection); $titleInfo = $this->db->getRecordByBarcode($barcode); $itemInfo = null; if ($titleInfo != null) { $marcInfo = MarcLoader::loadMarcRecordFromRecord($titleInfo); //Get the matching item from the item records $marcItemField = isset($configArray['Reindex']['itemTag']) ? $configArray['Reindex']['itemTag'] : '989'; $itemFields = $marcInfo->getFields($marcItemField); $itemInfo = null; if ($itemFields) { /** @var File_MARC_Data_Field $fieldInfo */ foreach ($itemFields as $fieldInfo) { if ($fieldInfo->getSubfield('b')->getData() == $barcode) { $itemInfo = $fieldInfo; } } } else { $logger->log("Did not find item records {$barcode}", PEAR_LOG_ERR); } } if ($itemInfo == null) { $logger->log("Did not find an item for barcode {$barcode}", PEAR_LOG_ERR); } if (preg_match("/{$barcode} updated successfully/i", $sresult)) { $results['barcodes'][$barcode] = array('inventoryResult' => 'Updated successfully.', 'title' => $titleInfo['title'], 'callNumber' => is_null($itemInfo) ? '' : $itemInfo->getSubfield('a')->getData()); if (preg_match('/Unexpected status; adjust below if appropriate/i', $sresult)) { if ($updateIncorrectStatuses) { //Automatically update the item to checked in //extract the current status and item record preg_match('/<input type="hidden" name="olditemstatuscode" value="(.*?)">/', $sresult, $matches); $lastStatus = $matches[1]; preg_match('/<input type="hidden" name="itemrecordkey" value="(.*?)">/', $sresult, $matches); $itemrecordkey = $matches[1]; $post_data = array('action' => 'UpdateAirWkstItemOneAction', 'itemrecordkey' => $itemrecordkey, 'lastaction' => 'updstatus', 'lastactionstatus' => 'good', 'lastitembarcode' => $barcode, 'newitemstatuscode' => '-', 'olditemstatuscode' => $lastStatus, 'purpose' => 'updstatus', 'submit.x' => 40, 'submit.y' => 10, 'ulang' => 'eng'); $post_items = array(); foreach ($post_data as $key => $value) { $post_items[] = $key . '=' . urlencode($value); } $post_string = implode('&', $post_items); curl_setopt($this->curl_connection, CURLOPT_POSTFIELDS, $post_string); $sresult = curl_exec($this->curl_connection); if (preg_match("/{$barcode} updated successfully/i", $sresult)) { $results['barcodes'][$barcode]['inventoryResult'] = "Automatically changed status from {$lastStatus} to on shelf"; $results['barcodes'][$barcode]['needsAdditionalProcessing'] = false; } else { $logger->log("Could not update status for barcode {$barcode}/r/n{$sresult}", PEAR_LOG_ERR); $results['barcodes'][$barcode]['inventoryResult'] = "Could not automatically fix status, old status is {$lastStatus}"; $results['barcodes'][$barcode]['needsAdditionalProcessing'] = true; } } else { $results['barcodes'][$barcode]['inventoryResult'] = "Unexpected Status, Needs Update"; $results['barcodes'][$barcode]['needsAdditionalProcessing'] = true; } } elseif (preg_match('/Unexpected status; pull this item for correction/i', $sresult)) { $results['barcodes'][$barcode]['inventoryResult'] .= " Pull this item for status correction"; $results['barcodes'][$barcode]['needsAdditionalProcessing'] = true; } else { $results['barcodes'][$barcode]['needsAdditionalProcessing'] = false; } sleep(1); } else { $results['barcodes'][$barcode] = array('inventoryResult' => 'Not updated', 'title' => $titleInfo['title'], 'callNumber' => is_null($itemInfo) ? '' : $itemInfo->getSubfield('a')->getData()); } } $results['success'] = true; } else { //Did not log in correctly. $results['success'] = false; $results['message'] = "The initials or password were incorrect or you are not authorized to use circa."; if (preg_match('/class="error">(.*?)<\\/h2>/i', $sresult, $matches)) { $results['message'] = $matches[1]; } } } else { //Did not log in correctly. $results['success'] = false; $results['message'] = "The login or password were incorrect. Please reenter."; } //Logout of the system curl_setopt($this->curl_connection, CURLOPT_HTTPGET, true); curl_setopt($this->curl_connection, CURLOPT_URL, $circaUrl . '/iii/airwkst/airwkstcore?action=AirWkstReturnToWelcomeAction'); $sresult = curl_exec($this->curl_connection); //Cleanup curl_close($this->curl_connection); unlink($cookieJar); return $results; }