diff --git a/config/vufind/Voyager.ini b/config/vufind/Voyager.ini index 6ec0d37115fc954b75bc037ba224f249dfaca6d2..197509fda4843a1c930a5292d9aeb4cf8b474c24 100644 --- a/config/vufind/Voyager.ini +++ b/config/vufind/Voyager.ini @@ -76,3 +76,7 @@ login_field = LAST_NAME [Loans] ; Uncomment this line to display the location where each loan was made ;display_borrowing_location = true + +; This regular expression controls which status messages are displayed on the +; Checked Out Items list. +show_statuses = "/lost|missing|claim/i" diff --git a/config/vufind/VoyagerRestful.ini b/config/vufind/VoyagerRestful.ini index 492142e9fb8a53354df82a6889778ff505281192..d1e6f322f2e956da4a24b1671d6d32203cf9a25e 100644 --- a/config/vufind/VoyagerRestful.ini +++ b/config/vufind/VoyagerRestful.ini @@ -260,6 +260,10 @@ disableAvailabilityCheckForRequestGroups = "15:19:21:32" ; Uncomment this line to display the location where each loan was made ;display_borrowing_location = true +; This regular expression controls which status messages are displayed on the +; Checked Out Items list. +show_statuses = "/lost|missing|claim/i" + ; Uncomment the following lines to enable password (PIN) change ;[changePassword] ; PIN change parameters. The default limits are taken from the interface documentation. diff --git a/module/VuFind/src/VuFind/ILS/Driver/Voyager.php b/module/VuFind/src/VuFind/ILS/Driver/Voyager.php index 1d69818251d59523133748931099a6e1e0b08fb6..a0f671e04f1f83389d27f88b7bf9866e4bfef9f4 100644 --- a/module/VuFind/src/VuFind/ILS/Driver/Voyager.php +++ b/module/VuFind/src/VuFind/ILS/Driver/Voyager.php @@ -1251,24 +1251,29 @@ class Voyager extends AbstractBase { // Expressions $sqlExpressions = [ - "to_char(CIRC_TRANSACTIONS.CURRENT_DUE_DATE, 'MM-DD-YY HH24:MI')" . + "to_char(MAX(CIRC_TRANSACTIONS.CURRENT_DUE_DATE), 'MM-DD-YY HH24:MI')" . " as DUEDATE", - "to_char(CURRENT_DUE_DATE, 'YYYYMMDD HH24:MI') as FULLDATE", - "BIB_ITEM.BIB_ID", - "CIRC_TRANSACTIONS.ITEM_ID as ITEM_ID", - "MFHD_ITEM.ITEM_ENUM", - "MFHD_ITEM.YEAR", - "BIB_TEXT.TITLE_BRIEF", - "BIB_TEXT.TITLE", - "CIRC_TRANSACTIONS.RENEWAL_COUNT", - "CIRC_POLICY_MATRIX.RENEWAL_COUNT as RENEWAL_LIMIT", - "LOCATION.LOCATION_DISPLAY_NAME as BORROWING_LOCATION" + "to_char(MAX(CURRENT_DUE_DATE), 'YYYYMMDD HH24:MI') as FULLDATE", + "MAX(BIB_ITEM.BIB_ID) AS BIB_ID", + "MAX(CIRC_TRANSACTIONS.ITEM_ID) as ITEM_ID", + "MAX(MFHD_ITEM.ITEM_ENUM) AS ITEM_ENUM", + "MAX(MFHD_ITEM.YEAR) AS YEAR", + "MAX(BIB_TEXT.TITLE_BRIEF) AS TITLE_BRIEF", + "MAX(BIB_TEXT.TITLE) AS TITLE", + "LISTAGG(ITEM_STATUS_DESC, CHR(9)) " + . "WITHIN GROUP (ORDER BY ITEM_STATUS_DESC) as status", + "MAX(CIRC_TRANSACTIONS.RENEWAL_COUNT) AS RENEWAL_COUNT", + "MAX(CIRC_POLICY_MATRIX.RENEWAL_COUNT) as RENEWAL_LIMIT", + "MAX(LOCATION.LOCATION_DISPLAY_NAME) as BORROWING_LOCATION" ]; // From $sqlFrom = [ $this->dbName . ".CIRC_TRANSACTIONS", $this->dbName . ".BIB_ITEM", + $this->dbName . ".ITEM", + $this->dbName . ".ITEM_STATUS", + $this->dbName . ".ITEM_STATUS_TYPE", $this->dbName . ".MFHD_ITEM", $this->dbName . ".BIB_TEXT", $this->dbName . ".CIRC_POLICY_MATRIX", @@ -1283,11 +1288,14 @@ class Voyager extends AbstractBase "BIB_TEXT.BIB_ID = BIB_ITEM.BIB_ID", "CIRC_TRANSACTIONS.CIRC_POLICY_MATRIX_ID = " . "CIRC_POLICY_MATRIX.CIRC_POLICY_MATRIX_ID", - "CIRC_TRANSACTIONS.CHARGE_LOCATION = LOCATION.LOCATION_ID" + "CIRC_TRANSACTIONS.CHARGE_LOCATION = LOCATION.LOCATION_ID", + "BIB_ITEM.ITEM_ID = ITEM.ITEM_ID", + "ITEM.ITEM_ID = ITEM_STATUS.ITEM_ID", + "ITEM_STATUS.ITEM_STATUS = ITEM_STATUS_TYPE.ITEM_STATUS_TYPE", ]; // Order - $sqlOrder = ["FULLDATE ASC"]; + $sqlOrder = ["FULLDATE ASC", "TITLE ASC"]; // Bind $sqlBind = [':id' => $patron['id']]; @@ -1297,12 +1305,35 @@ class Voyager extends AbstractBase 'from' => $sqlFrom, 'where' => $sqlWhere, 'order' => $sqlOrder, - 'bind' => $sqlBind + 'bind' => $sqlBind, + 'group' => ['CIRC_TRANSACTIONS.ITEM_ID'] ]; return $sqlArray; } + /** + * Pick a transaction status worth displaying to the user (or return false + * if nothing important is found). + * + * @param array $statuses Status strings + * + * @return string|bool + */ + protected function pickTransactionStatus($statuses) + { + $regex = isset($this->config['Loans']['show_statuses']) + ? $this->config['Loans']['show_statuses'] + : '/lost|missing|claim/i'; + $retVal = []; + foreach ($statuses as $status) { + if (preg_match($regex, $status)) { + $retVal[] = $status; + } + } + return empty($retVal) ? false : implode(', ', $retVal); + } + /** * Protected support method for getMyTransactions. * @@ -1350,7 +1381,9 @@ class Voyager extends AbstractBase 'title' => empty($sqlRow['TITLE_BRIEF']) ? $sqlRow['TITLE'] : $sqlRow['TITLE_BRIEF'], 'renew' => $sqlRow['RENEWAL_COUNT'], - 'renewLimit' => $sqlRow['RENEWAL_LIMIT'] + 'renewLimit' => $sqlRow['RENEWAL_LIMIT'], + 'message' => + $this->pickTransactionStatus(explode(chr(9), $sqlRow['STATUS'])), ]; if (isset($this->config['Loans']['display_borrowing_location']) && $this->config['Loans']['display_borrowing_location']