Fix a problem with open-ils.circ.holds.retrieve_all_from_title
authorLebbeous Fogle-Weekley <lebbeous@esilibrary.com>
Fri, 20 May 2011 14:17:05 +0000 (10:17 -0400)
committerLebbeous Fogle-Weekley <lebbeous@esilibrary.com>
Fri, 20 May 2011 14:17:05 +0000 (10:17 -0400)
Anoop Atre spotted this bug that's triggered by selecting "View Holds"
from "Actions for Selected Record" in the catalog seen through the staff
client.

Said method would error out like this:

[2011-05-20 10:04:03] open-ils.circ [ERR
:31866:CStoreEditor.pm:109:13058333633194115] editor[0|1] request error
open-ils.cstore.direct.serial.issuance.id_list.atomic :
{"subscription":[]} : Exception:
OpenSRF::DomainObject::oilsMethodException 2011-05-20T10:04:03
OpenILS::Utils::CStoreEditor
/openils/lib/perl5/OpenILS/Utils/CStoreEditor.pm:412 <500>  Severe query
error -- see error log for more details

because when trying to gather issuance-type holds, it didn't properly test
whether there actually were any subscriptions and issuances related to
the bib record in question.

Signed-off-by: Lebbeous Fogle-Weekley <lebbeous@esilibrary.com>
Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Holds.pm

index 03f947f..734936f 100644 (file)
@@ -2750,7 +2750,7 @@ sub all_rec_holds {
     $args->{fulfillment_time} = undef; #  we don't want to see old fulfilled holds
        $args->{cancel_time} = undef;
 
-       my $resp = { volume_holds => [], copy_holds => [], metarecord_holds => [] };
+       my $resp = { volume_holds => [], copy_holds => [], metarecord_holds => [], issuance_holds => [] };
 
     my $mr_map = $e->search_metabib_metarecord_source_map({source => $title_id})->[0];
     if($mr_map) {
@@ -2778,15 +2778,22 @@ sub all_rec_holds {
 
     my $subs = $e->search_serial_subscription(
         { record_entry => $title_id }, {idlist=>1});
-    my $issuances = $e->search_serial_issuance(
-        { subscription => $subs }, {idlist=>1});
 
-    $resp->{issuance_holds} = $e->search_action_hold_request(
-        {
-                       hold_type => OILS_HOLD_TYPE_ISSUANCE,
-            target => $issuances,
-            %$args
-        }, {idlist=>1} );
+    if (@$subs) {
+        my $issuances = $e->search_serial_issuance(
+            {subscription => $subs}, {idlist=>1}
+        );
+
+        if ($issuances) {
+            $resp->{issuance_holds} = $e->search_action_hold_request(
+                {
+                    hold_type => OILS_HOLD_TYPE_ISSUANCE,
+                    target => $issuances,
+                    %$args
+                }, {idlist=>1}
+            );
+        }
+    }
 
        my $vols = $e->search_asset_call_number(
                { record => $title_id, deleted => 'f' }, {idlist=>1});