[open-ils-commits] r14970 - trunk/Open-ILS/src/perlmods/OpenILS/Application/Circ (erickson)

svn at svn.open-ils.org svn at svn.open-ils.org
Thu Nov 19 10:13:00 EST 2009


Author: erickson
Date: 2009-11-19 10:12:58 -0500 (Thu, 19 Nov 2009)
New Revision: 14970

Modified:
   trunk/Open-ILS/src/perlmods/OpenILS/Application/Circ/Holds.pm
Log:
clear holds shelf processor.  see sig for description of process

Modified: trunk/Open-ILS/src/perlmods/OpenILS/Application/Circ/Holds.pm
===================================================================
--- trunk/Open-ILS/src/perlmods/OpenILS/Application/Circ/Holds.pm	2009-11-19 07:14:01 UTC (rev 14969)
+++ trunk/Open-ILS/src/perlmods/OpenILS/Application/Circ/Holds.pm	2009-11-19 15:12:58 UTC (rev 14970)
@@ -2023,21 +2023,109 @@
 __PACKAGE__->register_method(
 	method => 'clear_shelf_process',
     stream => 1,
-	api_name => 'open-ils.circ.hold.clear_shelf.process'
+	api_name => 'open-ils.circ.hold.clear_shelf.process',
+    signature => {
+        desc => q/
+            1. Find all holds that have expired on the holds shelf
+            2. Cancel the holds
+            3. If a clear-shelf status is configured, put targeted copies into this status
+            4. Divide copies into 3 groups: items to transit, items to reshelve, and items
+                that are needed for holds.  No subsequent action is taken on the holds
+                or items after grouping.
+        /
+    }
 );
 
 sub clear_shelf_process {
-	my($self, $client, $auth) = @_;
+	my($self, $client, $auth, $org_id) = @_;
 
 	my $e = new_editor(authtoken=>$auth, xact => 1);
 	$e->checkauth or return $e->die_event;
-	$e->allowed('UPDATE_HOLD') or return $e->die_event;
 
-    # Find holds that expired on the holds shelf
+    $org_id ||= $e->requestor->ws_ou;
+	$e->allowed('UPDATE_HOLD', $org_id) or return $e->die_event;
 
-    # Cancel the expired holds
-    
-    #  ...
+    my $copy_status = $U->ou_ancestor_setting_value($org_id, 'circ.holds.clear_shelf.copy_status');
+
+    # Find holds on the shelf that have been there too long
+    my $hold_ids = $e->search_action_hold_request(
+        {   shelf_expire_time => {'<' => 'now'},
+            pickup_lib => $org_id,
+            cancel_time => undef,
+            fulfillment_time => undef,
+            shelf_time => {'!=' => undef}
+        },
+        { idlist => 1 }
+    );
+
+
+    my @holds;
+    for my $hold_id (@$hold_ids) {
+
+        $logger->info("Clear shelf processing hold $hold_id");
+        
+        my $hold = $e->retrieve_action_hold_request([
+            $hold_id, {   
+                flesh => 1,
+                flesh_fields => {ahr => ['current_copy']}
+            }
+        ]);
+
+        $hold->cancel_time('now');
+        $hold->cancel_cause(2); # Hold Shelf expiration
+        $e->update_action_hold_request($hold) or return $e->die_event;
+
+        my $copy = $hold->current_copy;
+
+        if($copy_status) {
+            # if a clear-shelf copy status is defined, update the copy
+            $copy->status($copy_status);
+            $copy->edit_date('now');
+            $copy->editor($e->requestor->id);
+            $e->update_asset_copy($copy) or return $e->die_event;
+        }
+
+        my ($alt_hold) = __PACKAGE__->find_nearest_permitted_hold($e, $copy, $e->requestor, 1);
+
+        if($alt_hold) {
+
+            # copy is needed for a hold
+            $client->respond({action => 'hold', copy => $copy, hold_id => $hold->id});
+
+        } elsif($copy->circ_lib != $e->requestor->ws_ou) {
+
+            # copy needs to transit
+            $client->respond({action => 'transit', copy => $copy, hold_id => $hold->id});
+
+        } else {
+
+            # copy needs to go back to the shelf
+            $client->respond({action => 'shelf', copy => $copy, hold_id => $hold->id});
+        }
+
+        push(@holds, $hold);
+    }
+
+    $e->commit;
+
+    # tell the client we're done
+    $client->resopnd_complete;
+
+    # fire off the hold cancelation trigger
+    my $trigger = OpenSRF::AppSession->connect('open-ils.trigger');
+
+    for my $hold (@holds) {
+
+        my $req = $trigger->request(
+            'open-ils.trigger.event.autocreate', 
+            'hold_request.cancel.expire_holds_shelf', 
+            $hold, $org_id);
+
+        # wait for response so don't flood the service
+        $req->recv;
+    }
+
+    $trigger->disconnect;
 }
 
 



More information about the open-ils-commits mailing list