'11' => \&handle_checkout,
'17' => \&handle_item_info,
'23' => \&handle_patron_status,
+ '29' => \&handle_renew,
'37' => \&handle_payment,
'63' => \&handle_patron_info,
'XS' => \&handle_end_session
};
}
+
sub handle_checkout {
my ($session, $message) = @_;
+ my ($msg, $details) = checkout_renew_common($session, $message);
+
+ # No modifications required
+ return $msg;
+}
+
+sub handle_renew {
+ my ($session, $message) = @_;
+
+ my ($msg, $details) = checkout_renew_common($session, $message, 1);
+
+ # No modifications required
+ return $msg;
+}
+
+sub checkout_renew_common {
+ my ($session, $message, $is_renewal) = @_;
+ my $config = $session->config;
+
my $patron_barcode = $SC->get_field_value($message, 'AA');
my $item_barcode = $SC->get_field_value($message, 'AB');
my $fee_ack = $SC->get_field_value($message, 'BO');
- my $config = $session->config;
my $item_details = OpenILS::Application::SIP2::Item->get_item_details(
$session, barcode => $item_barcode
$session, barcode => $patron_barcode
);
- return {
- code => '12',
+ my $code = $is_renewal ? '30' : '12';
+
+ return ({
+ code => $code,
fixed_fields => [
0, # checkout ok
$SC->sipbool(0), # renewal ok
{AA => $patron_barcode},
{AB => $item_barcode}
]
- } unless ($item_details && $patron_details);
+ }) unless ($item_details && $patron_details);
my $circ_details = OpenILS::Application::SIP2::Checkout->checkout(
$session,
patron_barcode => $patron_barcode,
item_barcode => $item_barcode,
- fee_ack => $fee_ack
+ fee_ack => $fee_ack,
+ is_renew => $is_renewal
);
my $magnetic = $item_details->{magnetic_media};
&& $circ->renewal_remaining > 0;
}
- return {
- code => '12',
+ return ({
+ code => $code,
fixed_fields => [
$circ ? 1 : 0, # checkout ok
$SC->sipbool($can_renew), # renewal ok
$circ ? {BK => $circ->id} : (),
$deposit ? {BV => $deposit} : (),
]
- };
+ }, $circ_details);
}
sub handle_checkin {
my ($session, $message) = @_;
my $config = $session->config;
+ my @fixed_fields = @{$message->{fixed_fields} || []};
+
my $item_barcode = $SC->get_field_value($message, 'AB');
my $current_loc = $SC->get_field_value($message, 'AP');
+ my $return_date = $fixed_fields[2];
my $item_details = OpenILS::Application::SIP2::Item->get_item_details(
$session, barcode => $item_barcode
$session,
item_barcode => $item_barcode,
current_loc => $current_loc,
- item_details => $item_details
+ item_details => $item_details,
+ return_date => $return_date
);
my $screen_msg = $checkin_details->{screen_msg};
for (0, 1) { # 2 checkin requests max
- $override =
- $class->perform_checkin($session, $details, $override, %params);
+ $override = perform_checkin($session, $details, $override, %params);
last unless $override;
}
# Returns 0 if there's nothing left to do (final success / error)
# Updates $details along the way.
sub perform_checkin {
- my ($class, $session, $details, $override, %params) = @_;
+ my ($session, $details, $override, %params) = @_;
my $config = $session->config;
my $item_details = $params{item_details};
hold_as_transit => $config->{checkin_hold_as_transit}
};
+ if (my $backdate = $params{return_date}) {
+ $backdate =~ s/(\d{4})(\d{2})(\d{2}).*/$1-$2-$3/; # YYYYMMDD => ISO
+ $logger->info("Checking in with backdate $backdate");
+ $args->{backdate} = $backdate;
+ }
+
$args->{circ_lib} =
$SC->org_id_from_sn($session, $params{corrent_loc})
|| $session->editor->requestor->ws_ou;
$usr->card->barcode if $usr && $usr->card;
}
- $class->handle_hold($session, $details, $payload, %params);
+ handle_hold($session, $details, $payload, %params);
if ($textcode eq 'NO_CHANGE' || $textcode eq 'SUCCESS') {
}
sub handle_hold {
- my ($class, $session, $details, $payload, %params) = @_;
+ my ($session, $details, $payload, %params) = @_;
my $hold = $payload->{remote_hold} || $payload->{hold};
for (0, 1) { # 2 checkout requests max
- $override = $class->perform_checkout(
- $session, $circ_details, $override, %params);
+ $override =
+ perform_checkout($session, $circ_details, $override, %params);
last unless $override;
}
# Returns 0 if there's nothing left to do (final success / error)
# Updates $circ_details along the way.
sub perform_checkout {
- my ($class, $session, $circ_details, $override, %params) = @_;
+ my ($session, $circ_details, $override, %params) = @_;
my $config = $session->config;
my $args = {
copy_barcode => $params{item_barcode},
+ # During renewal, the circ API will confirm the specified
+ # patron has the specified item checked out before renewing.
patron_barcode => $params{patron_barcode}
};