1 package OpenILS::Application::Circ::Transit;
2 use base 'OpenSRF::Application';
3 use strict; use warnings;
4 use OpenSRF::EX qw(:try);
7 use OpenSRF::Utils::Cache;
8 use Digest::MD5 qw(md5_hex);
9 use OpenILS::Utils::ScriptRunner;
10 use OpenILS::Application::AppUtils;
11 use OpenILS::Application::Circ::Holds;
12 use OpenSRF::Utils::Logger qw(:logger);
14 my $U = "OpenILS::Application::AppUtils";
15 my $holdcode = "OpenILS::Application::Circ::Holds";
16 $Data::Dumper::Indent = 0;
20 __PACKAGE__->register_method(
21 method => "copy_transit_receive",
22 api_name => "open-ils.circ.copy_transit.receive",
24 Closes out a copy transit
25 Requestor needs the COPY_TRANSIT_RECEIVE permission
26 @param authtoken The login session key
27 @param params An object of named params including
28 copyid - the id of the copy in quest
29 barcode - the barcode of the copy in question
30 If copyid is not sent, this is used.
31 @return A ROUTE_ITEM if the copy is destined for a different location.
32 A SUCCESS event on success. Other events on error.
35 sub copy_transit_receive {
36 my( $self, $client, $authtoken, $params ) = @_;
37 my %params = %$params;
38 my( $evt, $copy, $requestor );
39 ($requestor, $evt) = $U->checksesperm($authtoken, 'COPY_TRANSIT_RECEIVE');
41 ($copy, $evt) = $U->fetch_copy($params{copyid});
42 ($copy, $evt) = $U->fetch_copy_by_barcode($params{barcode}) unless $copy;
44 my $session = $U->start_db_session();
45 $evt = $self->transit_receive( $copy, $requestor, $session );
46 $U->commit_db_session($session) if $U->event_equals($evt,'SUCCESS');
50 # ------------------------------------------------------------------------------
51 # If the transit destination is different than the requestor's lib,
52 # a ROUTE_TO event is returned with the org set.
54 # ------------------------------------------------------------------------------
56 my ( $class, $copy, $requestor, $session ) = @_;
59 my( $transit, $hold_transit, $evt );
60 my $copyid = $copy->id;
62 my $status_name = $U->copy_status_to_name($copy->status);
63 $logger->debug("Attempting transit receive on copy $copyid. Copy status is $status_name");
66 ($transit, $evt) = $U->fetch_open_transit_by_copy($copyid);
69 if( $transit->dest != $requestor->home_ou ) {
70 $logger->activity("Fowarding transit on copy which is destined ".
71 "for a different location. copy=$copyid,current ".
72 "location=".$requestor->home_ou.",destination location=".$transit->dest);
74 return OpenILS::Event->new('ROUTE_ITEM', org => $transit->dest );
77 # The transit is received, set the receive time
78 $transit->dest_recv_time('now');
79 my $r = $session->request(
80 'open-ils.storage.direct.action.transit_copy.update', $transit )->gather(1);
81 return $U->DB_UPDATE_FAILED($transit) unless $r;
84 my ($ht) = $U->fetch_hold_transit( $transit->id );
88 $logger->info("Hold transit found: ".$hold_transit->id.". Setting copy status to 'on holds shelf'");
89 $copy->status($U->copy_status_from_name('on holds shelf')->id);
94 $logger->info("Hold transit not found, recovering original copy status");
95 $copy->status( $transit->copy_status );
99 return $evt if ( $evt =
100 $U->update_copy( copy => $copy, editor => $requestor->id, session => $session ));
102 return OpenILS::Event->new('SUCCESS', ishold => $ishold, payload => $copy);
108 __PACKAGE__->register_method(
109 method => "copy_transit_create",
110 api_name => "open-ils.circ.copy_transit.create",
112 Creates a new copy transit. Requestor must have the
113 CREATE_COPY_TRANSIT permission.
114 @param authtoken The login session key
115 @param params A param object containing the following keys:
117 destination - the id of the org destination. If not defined,
118 defaults to the copy's circ_lib
119 @return SUCCESS event on success, other event on error
122 sub copy_transit_create {
124 my( $self, $client, $authtoken, $params ) = @_;
125 my %params = %$params;
127 my( $requestor, $evt ) =
128 $U->checksesperm( $authtoken, 'CREATE_COPY_TRANSIT' );
132 ($copy,$evt) = $U->fetch_copy($params{copyid});
135 my $session = $params{session} || $U->start_db_session();
136 my $source = $requestor->home_ou;
137 my $dest = $params{destination} || $copy->circ_lib;
138 my $transit = Fieldmapper::action::transit_copy->new;
140 $logger->activity("User ". $requestor->id ." creating a ".
141 " new copy transit for copy ".$copy->id." to org $dest");
143 $transit->source($source);
144 $transit->dest($dest);
145 $transit->target_copy($copy->id);
146 $transit->source_send_time("now");
147 $transit->copy_status($copy->status);
149 $logger->debug("Creating new copy_transit in DB");
151 my $s = $session->request(
152 "open-ils.storage.direct.action.transit_copy.create", $transit )->gather(1);
153 return $U->DB_UPDATE_FAILED($transit) unless $s;
155 my $stat = $U->copy_status_from_name('in transit');
157 $copy->status($stat->id);
158 return $evt if ($evt = $U->update_copy(
159 copy => $copy, editor => $requestor->id, session => $session ));
161 $U->commit_db_session($session) unless $params{session};
163 return OpenILS::Event->new('SUCCESS',
164 payload => { copy => $copy, transit => $transit } );