Koha/circ/branchtransfers.pl
Joonas Kylmälä fd0bc2204c Bug 25690: Make CanBookBeIssued return In Processing state as needing confirmation
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>
2021-03-04 16:18:42 +01:00

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;