fd0bc2204c
This prevents checking out to a patron an item with hold to someone else in the In Processing state via staff interface. Also the checkout error message via SIP is now a more clearer one: "Item is on hold for another patron." Before it was "Item cannot be issued: $confirmation". Also the branch transfer and batch checkout pages are adapted to this new confirmation message as well. To test: 1) Create bib level hold to an item for patron A 2) Check-in that item via SIP2, now the hold state should be "In processing" 3) Apply patch 4) Try to checkout the item to patron B via staff interface and notice we get now confirmation prompt do we really want to do it because it is in processing. In order to not have to setup SIP2 server, alternatively steps 1) and 2) can be done so that you check-in the item in staff interface and make it Waiting, and then with SQL change it to "In processing": UPDATE reserves SET found = "P" WHERE reserve_id = XXX; UPDATE reserves SET waitingdate = NULL WHERE reserve_id = XX UPDATE reserves SET expirationdate = NULL WHERE reserve_id = XXX; Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com> Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com> Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>
245 lines
7.4 KiB
Perl
Executable file
245 lines
7.4 KiB
Perl
Executable file
#!/usr/bin/perl
|
|
|
|
#script to execute branch transfers of books
|
|
|
|
# Copyright 2000-2002 Katipo Communications
|
|
# copyright 2010 BibLibre
|
|
#
|
|
# This file is part of Koha.
|
|
#
|
|
# Koha is free software; you can redistribute it and/or modify it
|
|
# under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation; either version 3 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# Koha is distributed in the hope that it will be useful, but
|
|
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with Koha; if not, see <http://www.gnu.org/licenses>.
|
|
|
|
use Modern::Perl;
|
|
use CGI qw ( -utf8 );
|
|
use C4::Circulation;
|
|
use C4::Output;
|
|
use C4::Reserves;
|
|
use C4::Biblio;
|
|
use C4::Items;
|
|
use C4::Auth qw/:DEFAULT get_session/;
|
|
use C4::Koha;
|
|
use C4::Members;
|
|
use Koha::BiblioFrameworks;
|
|
use Koha::AuthorisedValues;
|
|
use Koha::Holds;
|
|
use Koha::Items;
|
|
use Koha::Patrons;
|
|
|
|
###############################################
|
|
# Getting state
|
|
|
|
my $query = CGI->new;
|
|
|
|
if (!C4::Context->userenv){
|
|
my $sessionID = $query->cookie("CGISESSID");
|
|
my $session;
|
|
$session = get_session($sessionID) if $sessionID;
|
|
if (!$session){
|
|
# no branch set we can't transfer
|
|
print $query->redirect("/cgi-bin/koha/circ/set-library.pl");
|
|
exit;
|
|
}
|
|
}
|
|
|
|
#######################################################################################
|
|
# Make the page .....
|
|
my ($template, $user, $cookie, $flags ) = get_template_and_user(
|
|
{
|
|
template_name => "circ/branchtransfers.tt",
|
|
query => $query,
|
|
type => "intranet",
|
|
flagsrequired => { circulate => "circulate_remaining_permissions" },
|
|
}
|
|
);
|
|
|
|
# Check transfers is allowed from system preference
|
|
if ( C4::Context->preference("IndependentBranchesTransfers") && !C4::Context->IsSuperLibrarian() ) {
|
|
print $query->redirect("/cgi-bin/koha/errors/403.pl");
|
|
exit;
|
|
}
|
|
|
|
my $messages;
|
|
my $found;
|
|
my $reserved;
|
|
my $waiting;
|
|
my $hold_transferred;
|
|
my $hold_processed;
|
|
my $reqmessage;
|
|
my $cancelled;
|
|
my $setwaiting;
|
|
|
|
my $request = $query->param('request') || '';
|
|
my $borrowernumber = $query->param('borrowernumber') || 0;
|
|
my $tobranchcd = $query->param('tobranchcd') || '';
|
|
|
|
my $ignoreRs = 0;
|
|
############
|
|
# Deal with the requests....
|
|
if ( $request eq "KillWaiting" ) {
|
|
my $item = $query->param('itemnumber');
|
|
my $holds = Koha::Holds->search({
|
|
itemnumber => $item,
|
|
borrowernumber => $borrowernumber
|
|
});
|
|
if ( $holds->count ) {
|
|
$holds->next->cancel;
|
|
$cancelled = 1;
|
|
$reqmessage = 1;
|
|
} # FIXME else?
|
|
}
|
|
elsif ( $request eq "SetWaiting" ) {
|
|
my $item = $query->param('itemnumber');
|
|
ModReserveAffect( $item, $borrowernumber );
|
|
$ignoreRs = 1;
|
|
$setwaiting = 1;
|
|
$reqmessage = 1;
|
|
}
|
|
elsif ( $request eq 'KillReserved' ) {
|
|
my $biblionumber = $query->param('biblionumber');
|
|
my $holds = Koha::Holds->search({
|
|
biblionumber => $biblionumber,
|
|
borrowernumber => $borrowernumber
|
|
});
|
|
if ( $holds->count ) {
|
|
$holds->next->cancel;
|
|
$cancelled = 1;
|
|
$reqmessage = 1;
|
|
} # FIXME else?
|
|
}
|
|
|
|
# collect the stack of books already transferred so they can printed...
|
|
my @trsfitemloop;
|
|
my $transferred;
|
|
my $barcode = $query->param('barcode');
|
|
# remove leading/trailing whitespace
|
|
defined $barcode and $barcode =~ s/^\s*|\s*$//g; # FIXME: barcodeInputFilter
|
|
# warn "barcode : $barcode";
|
|
if ($barcode) {
|
|
|
|
( $transferred, $messages ) =
|
|
|
|
transferbook({
|
|
from_branch => C4::Context->userenv->{'branch'},
|
|
to_branch => $tobranchcd,
|
|
barcode => $barcode,
|
|
ignore_reserves => $ignoreRs,
|
|
trigger => 'Manual'
|
|
});
|
|
my $item = Koha::Items->find({ barcode => $barcode });
|
|
$found = $messages->{'ResFound'};
|
|
if ($transferred) {
|
|
my %trsfitem;
|
|
my $frbranchcd = C4::Context->userenv->{'branch'};
|
|
$trsfitem{item} = $item;
|
|
$trsfitem{counter} = 0;
|
|
$trsfitem{frombrcd} = $frbranchcd;
|
|
$trsfitem{tobrcd} = $tobranchcd;
|
|
push( @trsfitemloop, \%trsfitem );
|
|
}
|
|
}
|
|
|
|
foreach ( $query->param ) {
|
|
(next) unless (/bc-(\d*)/);
|
|
my $counter = $1;
|
|
my %trsfitem;
|
|
my $bc = $query->param("bc-$counter");
|
|
my $frbcd = $query->param("fb-$counter");
|
|
my $tobcd = $query->param("tb-$counter");
|
|
$counter++;
|
|
$trsfitem{counter} = $counter;
|
|
$trsfitem{frombrcd} = $frbcd;
|
|
$trsfitem{tobrcd} = $tobcd;
|
|
my $item = Koha::Items->find({ barcode => $bc });
|
|
$trsfitem{item} = $item;
|
|
push( @trsfitemloop, \%trsfitem );
|
|
}
|
|
|
|
my $itemnumber;
|
|
my $biblionumber;
|
|
|
|
#####################
|
|
|
|
if ($found) {
|
|
my $res = $messages->{'ResFound'};
|
|
$itemnumber = $res->{'itemnumber'};
|
|
$borrowernumber = $res->{'borrowernumber'};
|
|
|
|
if ( $res->{'ResFound'} eq "Waiting" ) {
|
|
$waiting = 1;
|
|
} elsif ( $res->{'ResFound'} eq "Transferred" ) {
|
|
$hold_transferred = 1;
|
|
} elsif ( $res->{'ResFound'} eq "Processing" ) {
|
|
$hold_processed = 1;
|
|
} elsif ( $res->{'ResFound'} eq "Reserved" ) {
|
|
$reserved = 1;
|
|
$biblionumber = $res->{'biblionumber'};
|
|
}
|
|
}
|
|
|
|
my @errmsgloop;
|
|
foreach my $code ( keys %$messages ) {
|
|
if ( $code ne 'WasTransfered' ) {
|
|
my %err;
|
|
if ( $code eq 'BadBarcode' ) {
|
|
$err{msg} = $messages->{'BadBarcode'};
|
|
$err{errbadcode} = 1;
|
|
}
|
|
elsif ( $code eq "NotAllowed" ) {
|
|
warn "NotAllowed: $messages->{'NotAllowed'} to branchcode " . $messages->{'NotAllowed'};
|
|
# Do we really want a error log message here? --atz
|
|
$err{errnotallowed} = 1;
|
|
my ( $tbr, $typecode ) = split( /::/, $messages->{'NotAllowed'} );
|
|
$err{tbr} = $tbr;
|
|
$err{code} = $typecode;
|
|
}
|
|
elsif ( $code eq 'WasReturned' ) {
|
|
$err{errwasreturned} = 1;
|
|
$err{borrowernumber} = $messages->{'WasReturned'};
|
|
my $patron = Koha::Patrons->find( $messages->{'WasReturned'} );
|
|
if ( $patron ) { # Just in case...
|
|
$err{patron} = $patron;
|
|
}
|
|
}
|
|
$err{errdesteqholding} = ( $code eq 'DestinationEqualsHolding' );
|
|
push( @errmsgloop, \%err );
|
|
}
|
|
}
|
|
|
|
# use Data::Dumper;
|
|
# warn "FINAL ============= ".Dumper(@trsfitemloop);
|
|
|
|
$template->param(
|
|
found => $found,
|
|
reserved => $reserved,
|
|
waiting => $waiting,
|
|
transferred => $hold_transferred,
|
|
processed => $hold_processed,
|
|
borrowernumber => $borrowernumber,
|
|
itemnumber => $itemnumber,
|
|
barcode => $barcode,
|
|
biblionumber => $biblionumber,
|
|
tobranchcd => $tobranchcd,
|
|
reqmessage => $reqmessage,
|
|
cancelled => $cancelled,
|
|
setwaiting => $setwaiting,
|
|
trsfitemloop => \@trsfitemloop,
|
|
errmsgloop => \@errmsgloop,
|
|
PatronAutoComplete => C4::Context->preference("PatronAutoComplete"),
|
|
);
|
|
|
|
# Checking if there is a Fast Cataloging Framework
|
|
$template->param( fast_cataloging => 1 ) if Koha::BiblioFrameworks->find( 'FA' );
|
|
|
|
output_html_with_http_headers $query, $cookie, $template->output;
|
|
|