X-Git-Url: http://koha-dev.rot13.org:8081/gitweb/?a=blobdiff_plain;f=opac%2Fopac-reserve.pl;h=4e4d4406c00ae2d24e8cd76128a65a310139ce22;hb=4a99852ccf8643c3f1b81f97587825aaccf61ad8;hp=abb9841e0c4dcd6f89268821c0d8d042df159c82;hpb=874175063194b2365ac69b2c8114f08749dabbd2;p=koha_gimpoz diff --git a/opac/opac-reserve.pl b/opac/opac-reserve.pl index abb9841e0c..4e4d4406c0 100755 --- a/opac/opac-reserve.pl +++ b/opac/opac-reserve.pl @@ -18,18 +18,20 @@ use strict; use warnings; use CGI; -use C4::Biblio; -use C4::Items; use C4::Auth; # checkauth, getborrowernumber. use C4::Koha; use C4::Circulation; use C4::Reserves; +use C4::Biblio; +use C4::Items; use C4::Output; use C4::Dates qw/format_date/; use C4::Context; use C4::Members; use C4::Branch; # GetBranches +use C4::Overdues; use C4::Debug; +use Koha::DateUtils; # use Data::Dumper; my $MAXIMUM_NUMBER_OF_RESERVES = C4::Context->preference("maxreserves"); @@ -45,7 +47,7 @@ my ( $template, $borrowernumber, $cookie ) = get_template_and_user( debug => 1, } ); - +my $OPACDisplayRequestPriority = (C4::Context->preference("OPACDisplayRequestPriority")) ? 1 : 0; sub get_out ($$$) { output_html_with_http_headers(shift,shift,shift); # $query, $cookie, $template->output; exit; @@ -54,6 +56,10 @@ sub get_out ($$$) { # get borrower information .... my ( $borr ) = GetMemberDetails( $borrowernumber ); +# Pass through any reserve charge +if ($borr->{reservefee} > 0){ + $template->param( RESERVE_CHARGE => sprintf("%.2f",$borr->{reservefee})); +} # get branches and itemtypes my $branches = GetBranches(); my $itemTypes = GetItemTypes(); @@ -88,7 +94,7 @@ if (($#biblionumbers < 0) && (! $query->param('place_reserve'))) { } # pass the pickup branch along.... -my $branch = $query->param('branch') || C4::Context->userenv->{branch} || '' ; +my $branch = $query->param('branch') || $borr->{'branchcode'} || C4::Context->userenv->{branch} || '' ; ($branches->{$branch}) or $branch = ""; # Confirm branch is real $template->param( branch => $branch ); @@ -96,15 +102,10 @@ $template->param( branch => $branch ); my $CGIbranchloop = GetBranchesLoop($branch); $template->param( CGIbranch => $CGIbranchloop ); -#Debug -#output_html_with_http_headers($query,$cookie," @biblionumbers \n"); -#exit; -#my %bibdata; -#my $rank; -#my $biblionumber; -#my $bibdata; -#my %itemhash; -#my $forloan; +# Is the person allowed to choose their branch +my $OPACChooseBranch = (C4::Context->preference("OPACAllowUserToChooseBranch")) ? 1 : 0; + +$template->param( choose_branch => $OPACChooseBranch); # # @@ -124,6 +125,20 @@ foreach my $biblioNumber (@biblionumbers) { $biblioDataHash{$biblioNumber} = $biblioData; my @itemInfos = GetItemsInfo($biblioNumber); + + my $marcrecord= GetMarcBiblio($biblioNumber); + + # flag indicating existence of at least one item linked via a host record + my $hostitemsflag; + # adding items linked via host biblios + my @hostitemInfos = GetHostItemsInfo($marcrecord); + if (@hostitemInfos){ + $hostitemsflag =1; + push (@itemInfos,@hostitemInfos); + } + + + $biblioData->{itemInfos} = \@itemInfos; foreach my $itemInfo (@itemInfos) { $itemInfoHash{$itemInfo->{itemnumber}} = $itemInfo; @@ -150,8 +165,8 @@ foreach my $biblioNumber (@biblionumbers) { # # if ( $query->param('place_reserve') ) { - my $notes = $query->param('notes'); + my $canreserve=0; # List is composed of alternating biblio/item/branch my $selectedItems = $query->param('selecteditems'); @@ -167,8 +182,9 @@ if ( $query->param('place_reserve') ) { my $branch = $query->param('branch'); $selectedItems = "$bib/$item/$branch/"; } - - my @selectedItems = split /\//, $selectedItems; + + $selectedItems =~ s!/$!!; + my @selectedItems = split /\//, $selectedItems, -1; # Make sure there is a biblionum/itemnum/branch triplet for each item. # The itemnum can be 'any', meaning next available. @@ -183,14 +199,22 @@ if ( $query->param('place_reserve') ) { my $itemNum = shift(@selectedItems); my $branch = shift(@selectedItems); # i.e., branch code, not name - my $singleBranchMode = $template->param('singleBranchMode'); - if ($singleBranchMode) { + my $singleBranchMode = C4::Context->preference("singleBranchMode"); + if ($singleBranchMode || ! $OPACChooseBranch) { # single branch mode or disabled user choosing $branch = $borr->{'branchcode'}; } + #item may belong to a host biblio, if yes change biblioNum to hosts bilbionumber + if ($itemNum ne '') { + my $hostbiblioNum = GetBiblionumberFromItemnumber($itemNum); + if ($hostbiblioNum ne $biblioNum) { + $biblioNum = $hostbiblioNum; + } + } + my $biblioData = $biblioDataHash{$biblioNum}; my $found; - + # Check for user supplied reserve date my $startdate; if ( @@ -199,11 +223,14 @@ if ( $query->param('place_reserve') ) { ) { $startdate = $query->param("reserve_date_$biblioNum"); } + + my $expiration_date = $query->param("expiration_date_$biblioNum"); # If a specific item was selected and the pickup branch is the same as the # holdingbranch, force the value $rank and $found. my $rank = $biblioData->{rank}; if ($itemNum ne ''){ + $canreserve = 1 if CanItemBeReserved($borrowernumber,$itemNum); $rank = '0' unless C4::Context->preference('ReservesNeedReturns'); my $item = GetItem($itemNum); if ( $item->{'holdingbranch'} eq $branch ){ @@ -211,13 +238,14 @@ if ( $query->param('place_reserve') ) { } } else { + $canreserve = 1 if CanBookBeReserved($borrowernumber,$biblioNum); # Inserts a null into the 'itemnumber' field of 'reserves' table. $itemNum = undef; } - + # Here we actually do the reserveration. Stage 3. - AddReserve($branch, $borrowernumber, $biblioNum, 'a', [$biblioNum], $rank, $startdate, $notes, - $biblioData->{'title'}, $itemNum, $found); + AddReserve($branch, $borrowernumber, $biblioNum, 'a', [$biblioNum], $rank, $startdate, $expiration_date, $notes, + $biblioData->{'title'}, $itemNum, $found) if ($canreserve); } print $query->redirect("/cgi-bin/koha/opac-user.pl#opac-user-holds"); @@ -252,7 +280,7 @@ if ( $borr->{lost} && ($borr->{lost} eq 1) ) { lost => 1 ); } -if ( $borr->{debarred} && ($borr->{debarred} eq 1) ) { +if ( CheckBorrowerDebarred($borrowernumber) ) { $noreserves = 1; $template->param( message => 1, @@ -262,7 +290,7 @@ if ( $borr->{debarred} && ($borr->{debarred} eq 1) ) { my @reserves = GetReservesFromBorrowernumber( $borrowernumber ); $template->param( RESERVES => \@reserves ); -if ( scalar(@reserves) >= $MAXIMUM_NUMBER_OF_RESERVES ) { +if ( $MAXIMUM_NUMBER_OF_RESERVES && (scalar(@reserves) >= $MAXIMUM_NUMBER_OF_RESERVES) ) { $template->param( message => 1 ); $noreserves = 1; $template->param( too_many_reserves => scalar(@reserves)); @@ -294,13 +322,13 @@ my $notforloan_label_of = get_notforloan_label_of(); my $biblioLoop = []; my $numBibsAvailable = 0; my $itemdata_enumchron = 0; +my $anyholdable; my $itemLevelTypes = C4::Context->preference('item-level_itypes'); -$template->param('item-level_itypes' => $itemLevelTypes); +$template->param('item_level_itypes' => $itemLevelTypes); foreach my $biblioNum (@biblionumbers) { my $record = GetMarcBiblio($biblioNum); - my $subtitle = C4::Biblio::get_koha_field_from_marc('bibliosubtitle', 'subtitle', $record, ''); # Init the bib item with the choices for branch pickup my %biblioLoopIter = ( branchChoicesLoop => $CGIbranchloop ); @@ -313,7 +341,7 @@ foreach my $biblioNum (@biblionumbers) { $biblioLoopIter{biblionumber} = $biblioData->{biblionumber}; $biblioLoopIter{title} = $biblioData->{title}; - $biblioLoopIter{subtitle} = $subtitle; + $biblioLoopIter{subtitle} = GetRecordValue('subtitle', $record, GetFrameworkCode($biblioData->{biblionumber})); $biblioLoopIter{author} = $biblioData->{author}; $biblioLoopIter{rank} = $biblioData->{rank}; $biblioLoopIter{reservecount} = $biblioData->{reservecount}; @@ -331,19 +359,17 @@ foreach my $biblioNum (@biblionumbers) { my $fee = GetReserveFee(undef, $borrowernumber, $itemInfo->{'biblionumber'}, 'a', ( $itemInfo->{'biblioitemnumber'} ) ); $itemInfo->{'reservefee'} = sprintf "%.02f", ($fee ? $fee : 0.0); - + if ($itemLevelTypes && $itemInfo->{itype}) { $itemInfo->{description} = $itemTypes->{$itemInfo->{itype}}{description}; $itemInfo->{imageurl} = getitemtypeimagesrc() . "/". $itemTypes->{$itemInfo->{itype}}{imageurl}; } - + if (!$itemInfo->{'notforloan'} && !($itemInfo->{'itemnotforloan'} > 0)) { $biblioLoopIter{forloan} = 1; } } - $biblioLoopIter{itemTypeDescription} = $itemTypes->{$biblioData->{itemtype}}{description}; - $biblioLoopIter{itemLoop} = []; my $numCopiesAvailable = 0; foreach my $itemInfo (@{$biblioData->{itemInfos}}) { @@ -372,7 +398,7 @@ foreach my $biblioNum (@biblionumbers) { # change the background color. my $issues= GetItemIssue($itemNum); if ( $issues->{'date_due'} ) { - $itemLoopIter->{dateDue} = format_date($issues->{'date_due'}); + $itemLoopIter->{dateDue} = format_sqlduedatetime($issues->{date_due}); $itemLoopIter->{backgroundcolor} = 'onloan'; } @@ -380,6 +406,11 @@ foreach my $biblioNum (@biblionumbers) { my ($reservedate,$reservedfor,$expectedAt) = GetReservesFromItemnumber($itemNum); my $ItemBorrowerReserveInfo = GetMemberDetails( $reservedfor, 0); + # the item could be reserved for this borrower vi a host record, flag this + if ($reservedfor eq $borrowernumber){ + $itemLoopIter->{already_reserved} = 1; + } + if ( defined $reservedate ) { $itemLoopIter->{backgroundcolor} = 'reserved'; $itemLoopIter->{reservedate} = format_date($reservedate); @@ -421,10 +452,19 @@ foreach my $biblioNum (@biblionumbers) { $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 there is no loan, return and transfer, we show a checkbox. $itemLoopIter->{notforloan} = $itemLoopIter->{notforloan} || 0; - my $branchitemrule = GetBranchItemRule( $borr->{'branchcode'}, $itemInfo->{'itype'} ); + my $branch = C4::Circulation::_GetCircControlBranch($itemLoopIter, $borr); + + my $branchitemrule = GetBranchItemRule( $branch, $itemInfo->{'itype'} ); my $policy_holdallowed = 1; if ( $branchitemrule->{'holdallowed'} == 0 || @@ -432,7 +472,7 @@ foreach my $biblioNum (@biblionumbers) { $policy_holdallowed = 0; } - if (IsAvailableForItemLevelRequest($itemNum) and $policy_holdallowed) { + if (IsAvailableForItemLevelRequest($itemNum) and $policy_holdallowed and CanItemBeReserved($borrowernumber,$itemNum) and ($itemLoopIter->{already_reserved} ne 1)) { $itemLoopIter->{available} = 1; $numCopiesAvailable++; } @@ -445,54 +485,61 @@ foreach my $biblioNum (@biblionumbers) { $itemLoopIter->{waitingdate} = format_date($wait_hashref->{waitingdate}); } $itemLoopIter->{imageurl} = getitemtypeimagelocation( 'opac', $itemTypes->{ $itemInfo->{itype} }{imageurl} ); - + # Show serial enumeration when needed - if ($itemLoopIter->{enumchron}) { - $itemdata_enumchron = 1; - } - $template->param( itemdata_enumchron => $itemdata_enumchron ); - + if ($itemLoopIter->{enumchron}) { + $itemdata_enumchron = 1; + } + push @{$biblioLoopIter{itemLoop}}, $itemLoopIter; } + $template->param( itemdata_enumchron => $itemdata_enumchron ); if ($numCopiesAvailable > 0) { $numBibsAvailable++; $biblioLoopIter{bib_available} = 1; $biblioLoopIter{holdable} = 1; + $anyholdable = 1; } if ($biblioLoopIter{already_reserved}) { $biblioLoopIter{holdable} = undef; + $anyholdable = undef; + } + if(not CanBookBeReserved($borrowernumber,$biblioNum)){ + $biblioLoopIter{holdable} = undef; + $anyholdable = undef; } push @$biblioLoop, \%biblioLoopIter; } -if ( $numBibsAvailable == 0 ) { - $template->param( none_available => 1, message => 1 ); +if ( $numBibsAvailable == 0 || !$anyholdable) { + $template->param( none_available => 1 ); } -my $itemTableColspan = 5; -if (!$template->param('OPACItemHolds')) { +my $itemTableColspan = 7; +if (! $template->{VARS}->{'OPACItemHolds'}) { $itemTableColspan--; } -if ($template->param('singleBranchMode')) { +if (! $template->{VARS}->{'singleBranchMode'}) { $itemTableColspan--; } $template->param(itemtable_colspan => $itemTableColspan); # display infos $template->param(bibitemloop => $biblioLoop); - +$template->param( showpriority=>1 ) if $OPACDisplayRequestPriority; # can set reserve date in future if ( C4::Context->preference( 'AllowHoldDateInFuture' ) && C4::Context->preference( 'OPACAllowHoldDateInFuture' ) ) { $template->param( - reserve_in_future => 1, - DHTMLcalendar_dateformat => C4::Dates->DHTMLcalendar(), - ); + reserve_in_future => 1, + ); } +$template->param( DHTMLcalendar_dateformat => C4::Dates->DHTMLcalendar() ); + output_html_with_http_headers $query, $cookie, $template->output;