X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=opac%2Fopac-reserve.pl;h=f1fe2ffbb68c709a517a32145ab9c36f213112e2;hb=7afddcb157a8d8e27cfdee3cdbeb0eae483aa24c;hp=277b2fe8c4453daf84ca8b347ecb82ea5add8acb;hpb=43694867676ed627759a302ade7d666ab029490b;p=koha.git diff --git a/opac/opac-reserve.pl b/opac/opac-reserve.pl index 277b2fe8c4..f1fe2ffbb6 100755 --- a/opac/opac-reserve.pl +++ b/opac/opac-reserve.pl @@ -18,8 +18,8 @@ # You should have received a copy of the GNU General Public License # along with Koha; if not, see . -use strict; -use warnings; +use Modern::Perl; + use CGI qw ( -utf8 ); use C4::Auth; # checkauth, getborrowernumber. use C4::Koha; @@ -30,13 +30,13 @@ use C4::Items; use C4::Output; use C4::Context; use C4::Members; -use C4::Branch; # GetBranches use C4::Overdues; use C4::Debug; use Koha::DateUtils; -use Koha::Borrower::Debarments qw(IsDebarred); +use Koha::Libraries; +use Koha::Patrons; use Date::Calc qw/Today Date_to_Days/; -# use Data::Dumper; +use List::MoreUtils qw/uniq/; my $maxreserves = C4::Context->preference("maxreserves"); @@ -70,12 +70,13 @@ sub get_out { } # get borrower information .... -my ( $borr ) = GetMemberDetails( $borrowernumber ); +my ( $borr ) = GetMember( borrowernumber => $borrowernumber ); +my $patron = Koha::Patrons->find( $borrowernumber ); # check if this user can place a reserve, -1 means use sys pref, 0 means dont block, 1 means block -if ( $borr->{'BlockExpiredPatronOpacActions'} ) { +if ( $patron->category->effective_BlockExpiredPatronOpacActions ) { - if ( $borr->{'is_expired'} ) { + if ( $patron->is_expired ) { # cannot reserve, their card has expired and the rules set mean this is not allowed $template->param( message => 1, expired_patron => 1 ); @@ -84,11 +85,11 @@ if ( $borr->{'BlockExpiredPatronOpacActions'} ) { } # Pass through any reserve charge -if ($borr->{reservefee} > 0){ - $template->param( RESERVE_CHARGE => sprintf("%.2f",$borr->{reservefee})); +my $reservefee = $patron->category->reservefee; +if ( $reservefee > 0){ + $template->param( RESERVE_CHARGE => sprintf("%.2f",$reservefee)); } -# get branches and itemtypes -my $branches = GetBranches(); + my $itemTypes = GetItemTypes(); # There are two ways of calling this script, with a single biblio num @@ -123,12 +124,8 @@ if (($#biblionumbers < 0) && (! $query->param('place_reserve'))) { # pass the pickup branch along.... my $branch = $query->param('branch') || $borr->{'branchcode'} || C4::Context->userenv->{branch} || '' ; -($branches->{$branch}) or $branch = ""; # Confirm branch is real $template->param( branch => $branch ); -# make branch selection options... -my $branchloop = GetBranchesLoop($branch); - # Is the person allowed to choose their branch my $OPACChooseBranch = (C4::Context->preference("OPACAllowUserToChooseBranch")) ? 1 : 0; @@ -228,7 +225,7 @@ if ( $query->param('place_reserve') ) { my $canreserve = 0; - my $singleBranchMode = C4::Context->preference("singleBranchMode"); + my $singleBranchMode = Koha::Libraries->search->count == 1; if ( $singleBranchMode || !$OPACChooseBranch ) { # single branch mode or disabled user choosing $branch = $borr->{'branchcode'}; @@ -281,15 +278,16 @@ if ( $query->param('place_reserve') ) { $canreserve = 0; } + my $itemtype = $query->param('itemtype') || undef; + $itemtype = undef if $itemNum; + # Here we actually do the reserveration. Stage 3. if ($canreserve) { my $reserve_id = AddReserve( - $branch, $borrowernumber, - $biblioNum, - [$biblioNum], $rank, - $startdate, $expiration_date, - $notes, $biblioData->{title}, - $itemNum, $found + $branch, $borrowernumber, $biblioNum, + [$biblioNum], $rank, $startdate, + $expiration_date, $notes, $biblioData->{title}, + $itemNum, $found, $itemtype, ); $failed_holds++ unless $reserve_id; ++$reserve_cnt; @@ -308,8 +306,9 @@ if ( $query->param('place_reserve') ) { my $noreserves = 0; my $maxoutstanding = C4::Context->preference("maxoutstanding"); $template->param( noreserve => 1 ) unless $maxoutstanding; -if ( $borr->{'amountoutstanding'} && ($borr->{'amountoutstanding'} > $maxoutstanding) ) { - my $amount = sprintf "%.02f", $borr->{'amountoutstanding'}; +my ( $amountoutstanding ) = GetMemberAccountRecords($borrowernumber); +if ( $amountoutstanding && ($amountoutstanding > $maxoutstanding) ) { + my $amount = sprintf "%.02f", $amountoutstanding; $template->param( message => 1 ); $noreserves = 1; $template->param( too_much_oweing => $amount ); @@ -331,7 +330,7 @@ if ( $borr->{lost} && ($borr->{lost} == 1) ) { ); } -if ( IsDebarred($borrowernumber) ) { +if ( Koha::Patrons->find( $borrowernumber )->is_debarred ) { $noreserves = 1; $template->param( message => 1, @@ -357,17 +356,6 @@ unless ( $noreserves ) { } } -foreach my $res (@reserves) { - foreach my $biblionumber (@biblionumbers) { - if ( $res->{'biblionumber'} == $biblionumber && $res->{'borrowernumber'} == $borrowernumber) { -# $template->param( message => 1 ); -# $noreserves = 1; -# $template->param( already_reserved => 1 ); - $biblioDataHash{$biblionumber}->{already_reserved} = 1; - } - } -} - unless ($noreserves) { $template->param( select_item_types => 1 ); } @@ -392,7 +380,7 @@ foreach my $biblioNum (@biblionumbers) { my $record = GetMarcBiblio($biblioNum); # Init the bib item with the choices for branch pickup - my %biblioLoopIter = ( branchloop => $branchloop ); + my %biblioLoopIter; # Get relevant biblio data. my $biblioData = $biblioDataHash{$biblioNum}; @@ -435,20 +423,20 @@ foreach my $biblioNum (@biblionumbers) { $itemLoopIter->{itemnumber} = $itemNum; $itemLoopIter->{barcode} = $itemInfo->{barcode}; - $itemLoopIter->{homeBranchName} = $branches->{$itemInfo->{homebranch}}{branchname}; + $itemLoopIter->{homeBranchName} = $itemInfo->{homebranch}; $itemLoopIter->{callNumber} = $itemInfo->{itemcallnumber}; $itemLoopIter->{enumchron} = $itemInfo->{enumchron}; $itemLoopIter->{copynumber} = $itemInfo->{copynumber}; if ($itemLevelTypes) { $itemLoopIter->{translated_description} = $itemInfo->{translated_description}; + $itemLoopIter->{itype} = $itemInfo->{itype}; $itemLoopIter->{imageurl} = $itemInfo->{imageurl}; } # If the holdingbranch is different than the homebranch, we show the # holdingbranch of the document too. if ( $itemInfo->{homebranch} ne $itemInfo->{holdingbranch} ) { - $itemLoopIter->{holdingBranchName} = - $branches->{ $itemInfo->{holdingbranch} }{branchname}; + $itemLoopIter->{holdingBranchName} = $itemInfo->{holdingbranch}; } # If the item is currently on loan, we display its return date and @@ -461,13 +449,10 @@ foreach my $biblioNum (@biblionumbers) { # checking reserve my ($reservedate,$reservedfor,$expectedAt,undef,$wait) = GetReservesFromItemnumber($itemNum); - my $ItemBorrowerReserveInfo = GetMemberDetails( $reservedfor, 0); + my $ItemBorrowerReserveInfo = GetMember( borrowernumber => $reservedfor ); # the item could be reserved for this borrower vi a host record, flag this $reservedfor //= ''; - if ($reservedfor eq $borrowernumber){ - $itemLoopIter->{already_reserved} = 1; - } if ( defined $reservedate ) { $itemLoopIter->{backgroundcolor} = 'reserved'; @@ -506,18 +491,17 @@ foreach my $biblioNum (@biblionumbers) { GetTransfers($itemNum); if ( $transfertwhen && ($transfertwhen ne '') ) { $itemLoopIter->{transfertwhen} = output_pref({ dt => dt_from_string($transfertwhen), dateonly => 1 }); - $itemLoopIter->{transfertfrom} = - $branches->{$transfertfrom}{branchname}; - $itemLoopIter->{transfertto} = $branches->{$transfertto}{branchname}; + $itemLoopIter->{transfertfrom} = $transfertfrom; + $itemLoopIter->{transfertto} = $transfertto; $itemLoopIter->{nocancel} = 1; } - # if the items belongs to a host record, show link to host record - if ($itemInfo->{biblionumber} ne $biblioNum){ - $biblioLoopIter{hostitemsflag} = 1; - $itemLoopIter->{hostbiblionumber} = $itemInfo->{biblionumber}; - $itemLoopIter->{hosttitle} = GetBiblioData($itemInfo->{biblionumber})->{title}; - } + # if the items belongs to a host record, show link to host record + if ( $itemInfo->{biblionumber} ne $biblioNum ) { + $biblioLoopIter{hostitemsflag} = 1; + $itemLoopIter->{hostbiblionumber} = $itemInfo->{biblionumber}; + $itemLoopIter->{hosttitle} = GetBiblioData( $itemInfo->{biblionumber} )->{title}; + } # If there is no loan, return and transfer, we show a checkbox. $itemLoopIter->{notforloan} = $itemLoopIter->{notforloan} || 0; @@ -566,11 +550,30 @@ foreach my $biblioNum (@biblionumbers) { $biblioLoopIter{holdable} &&= CanBookBeReserved($borrowernumber,$biblioNum) eq 'OK'; + # For multiple holds per record, if a patron has previously placed a hold, + # the patron can only place more holds of the same type. That is, if the + # patron placed a record level hold, all the holds the patron places must + # be record level. If the patron placed an item level hold, all holds + # the patron places must be item level + my $forced_hold_level = Koha::Holds->search( + { + borrowernumber => $borrowernumber, + biblionumber => $biblioNum, + found => undef, + } + )->forced_hold_level(); + if ($forced_hold_level) { + $biblioLoopIter{force_hold} = 1 if $forced_hold_level eq 'item'; + $biblioLoopIter{itemholdable} = 0 if $forced_hold_level eq 'record'; + } + + push @$biblioLoop, \%biblioLoopIter; $anyholdable = 1 if $biblioLoopIter{holdable}; } + if ( $numBibsAvailable == 0 || $anyholdable == 0) { $template->param( none_available => 1 ); }