From c299030c392e56ef8ee48cf139501759b4e72d20 Mon Sep 17 00:00:00 2001 From: Kodi Date: Mon, 5 Oct 2026 12:42:05 -0700 Subject: [PATCH 1/4] DIS-2825: Allow checking out multiple volumes of periodical in scan & go Update check to see if item is checked out to patron to check if item is checked out in addition to checking the bibkey Update release notes Tested on my local instance of Aspen --- code/web/Drivers/SirsiDynixROA.php | 2 +- code/web/release_notes/26.11.00/DIS-2824.yaml | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 code/web/release_notes/26.11.00/DIS-2824.yaml diff --git a/code/web/Drivers/SirsiDynixROA.php b/code/web/Drivers/SirsiDynixROA.php index 8ae153e8951..f237625e0fc 100644 --- a/code/web/Drivers/SirsiDynixROA.php +++ b/code/web/Drivers/SirsiDynixROA.php @@ -3954,7 +3954,7 @@ public function checkoutByAPI(User $patron, $barcode, Location $currentLocation) $patronHoldsAndCheckouts = $this->getWebServiceResponse('getHolds', $webServiceURL . '/user/patron/key/' . $patron->unique_ils_id . '?includeFields=' . $includeFields, null, $sessionToken); if ($patronHoldsAndCheckouts && isset($patronHoldsAndCheckouts->fields)) { foreach ($patronHoldsAndCheckouts->fields->circRecordList as $checkout) { - if (str_starts_with($checkout->key, $bibKey . ':')){ + if (str_starts_with($checkout->key, $bibKey . ':') && $currentItemLocation == 'CHECKEDOUT'){ $result['message'] = translate([ 'text' => 'A copy of this title already checked out to you, see a staff member to checkout additional copies.', 'isPublicFacing' => true, diff --git a/code/web/release_notes/26.11.00/DIS-2824.yaml b/code/web/release_notes/26.11.00/DIS-2824.yaml new file mode 100644 index 00000000000..55c1f0c419a --- /dev/null +++ b/code/web/release_notes/26.11.00/DIS-2824.yaml @@ -0,0 +1,12 @@ +Jira: DIS-2825 +Type: Enhancement +Developer: Kodi Lein (KL) +Contributing Org: Grove For Libraries +Sponsor: SWAN Library Network +GroveRelease: 26.11.00 +CommunityRelease: 26.11.00 +Component: Symphony ILS +Description: + - Update Scan & Go for Symphony ILS to allow multiple volumes of a periodical to be checked out. +New Settings: +New Permissions: \ No newline at end of file From d82397866046e41827e05870722341f297782b19 Mon Sep 17 00:00:00 2001 From: Kodi Date: Mon, 5 Oct 2026 12:45:06 -0700 Subject: [PATCH 2/4] DIS-2825 --- .../{26.11.00/DIS-2824.yaml => 26.10.00/DIS-2825.yaml} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename code/web/release_notes/{26.11.00/DIS-2824.yaml => 26.10.00/DIS-2825.yaml} (93%) diff --git a/code/web/release_notes/26.11.00/DIS-2824.yaml b/code/web/release_notes/26.10.00/DIS-2825.yaml similarity index 93% rename from code/web/release_notes/26.11.00/DIS-2824.yaml rename to code/web/release_notes/26.10.00/DIS-2825.yaml index 55c1f0c419a..e4dbc667298 100644 --- a/code/web/release_notes/26.11.00/DIS-2824.yaml +++ b/code/web/release_notes/26.10.00/DIS-2825.yaml @@ -3,7 +3,7 @@ Type: Enhancement Developer: Kodi Lein (KL) Contributing Org: Grove For Libraries Sponsor: SWAN Library Network -GroveRelease: 26.11.00 +GroveRelease: 26.10.00 CommunityRelease: 26.11.00 Component: Symphony ILS Description: From ca23a8d9e5e087d98c5b62cb9a4e823fb028ea95 Mon Sep 17 00:00:00 2001 From: Kodi Date: Mon, 5 Oct 2026 14:25:45 -0700 Subject: [PATCH 3/4] DIS-2825: Changes Update to check for volume info If item is a volume (has volume info) and the str_starts_with($checkout->key, $bibKey . ':') check passes, we will also check if the item keys match between the patron checkout info and the info for the item being checked out --- code/web/Drivers/SirsiDynixROA.php | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/code/web/Drivers/SirsiDynixROA.php b/code/web/Drivers/SirsiDynixROA.php index f237625e0fc..61613715b89 100644 --- a/code/web/Drivers/SirsiDynixROA.php +++ b/code/web/Drivers/SirsiDynixROA.php @@ -3952,17 +3952,28 @@ public function checkoutByAPI(User $patron, $barcode, Location $currentLocation) //Check to see if the user already has a copy of the title checked out. $includeFields = urlencode("circRecordList{*,bib{title,author}},holdRecordList{*,bib{title,author},selectedItem{call{*},itemType{*},barcode}}"); $patronHoldsAndCheckouts = $this->getWebServiceResponse('getHolds', $webServiceURL . '/user/patron/key/' . $patron->unique_ils_id . '?includeFields=' . $includeFields, null, $sessionToken); + + //First, check if item being checked out is a volume + $isVolume = false; + $parts = explode(':', $itemKey); + $lookupItemKey = $parts[0] . ':' . $parts[1]; + require_once ROOT_DIR . '/sys/ILS/IlsVolumeInfo.php'; + $volumeInfo = new IlsVolumeInfo(); + $volumeInfo->volumeId = $lookupItemKey; + if ($volumeInfo->find(true)) { + $isVolume = true; + } + if ($patronHoldsAndCheckouts && isset($patronHoldsAndCheckouts->fields)) { foreach ($patronHoldsAndCheckouts->fields->circRecordList as $checkout) { - if (str_starts_with($checkout->key, $bibKey . ':') && $currentItemLocation == 'CHECKEDOUT'){ - $result['message'] = translate([ - 'text' => 'A copy of this title already checked out to you, see a staff member to checkout additional copies.', - 'isPublicFacing' => true, - ]); - $result['api']['message'] = translate([ - 'text' => 'A copy of this title already checked out to you, see a staff member to checkout additional copies.', + if (str_starts_with($checkout->key, $bibKey . ':') && (!$isVolume || $checkout->fields->item->key == $itemKey)) { + $message = translate([ + 'text' => 'A copy of this title is already checked out to you, see a staff member to checkout additional copies.', 'isPublicFacing' => true, ]); + + $result['message'] = $message; + $result['api']['message'] = $message; return $result; } } From 5f29b9115726a7f37eec8513675a5746cd228ed1 Mon Sep 17 00:00:00 2001 From: Kodi Date: Tue, 6 Oct 2026 13:20:15 -0700 Subject: [PATCH 4/4] DIS-2825: item key colon check add check to catch cases where $itemKey may not contain a colon --- code/web/Drivers/SirsiDynixROA.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/code/web/Drivers/SirsiDynixROA.php b/code/web/Drivers/SirsiDynixROA.php index 61613715b89..c5c42a82f59 100644 --- a/code/web/Drivers/SirsiDynixROA.php +++ b/code/web/Drivers/SirsiDynixROA.php @@ -3955,8 +3955,11 @@ public function checkoutByAPI(User $patron, $barcode, Location $currentLocation) //First, check if item being checked out is a volume $isVolume = false; - $parts = explode(':', $itemKey); - $lookupItemKey = $parts[0] . ':' . $parts[1]; + $lookupItemKey = $itemKey; + if (str_contains($itemKey, ':')) { + $parts = explode(':', $itemKey); + $lookupItemKey = $parts[0] . ':' . $parts[1]; + } require_once ROOT_DIR . '/sys/ILS/IlsVolumeInfo.php'; $volumeInfo = new IlsVolumeInfo(); $volumeInfo->volumeId = $lookupItemKey;