X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=reserve%2Frequest.pl;h=b96447f8cc52a99287c54a13dd2c947534ae3972;hb=17657b6094bbe7d52822e2729cca6bae1bfe8b43;hp=c3c7a36b42d8b41e1c84324790c886b4cd8ef009;hpb=d1cea14fae6525b7478548aa19108871395e198d;p=koha.git diff --git a/reserve/request.pl b/reserve/request.pl index c3c7a36b42..b96447f8cc 100755 --- a/reserve/request.pl +++ b/reserve/request.pl @@ -3,6 +3,7 @@ #writen 2/1/00 by chris@katipo.oc.nz # Copyright 2000-2002 Katipo Communications +# Parts Copyright 2011 Catalyst IT # # This file is part of Koha. # @@ -27,7 +28,7 @@ script to place reserves/requests use strict; use warnings; -use C4::Branch; # GetBranches get_branchinfos_of +use C4::Branch; use CGI; use List::MoreUtils qw/uniq/; use Date::Calc qw/Date_to_Days/; @@ -41,6 +42,7 @@ use C4::Circulation; use C4::Dates qw/format_date/; use C4::Members; use C4::Search; # enabled_staff_search_views +use Koha::DateUtils; my $dbh = C4::Context->dbh; my $sth; @@ -62,11 +64,11 @@ my $showallitems = $input->param('showallitems'); # get Branches and Itemtypes my $branches = GetBranches(); my $itemtypes = GetItemTypes(); - + my $default = C4::Context->userenv->{branch}; my @values; my %label_of; - + foreach my $branchcode (sort keys %{$branches} ) { push @values, $branchcode; $label_of{$branchcode} = $branches->{$branchcode}->{branchname}; @@ -85,7 +87,7 @@ my $CGIbranch = CGI::scrolling_list( my $findborrower = $input->param('findborrower'); $findborrower = '' unless defined $findborrower; $findborrower =~ s|,| |g; -my $cardnumber = $input->param('cardnumber') || ''; +my $borrowernumber_hold = $input->param('borrowernumber') || ''; my $borrowerslist; my $messageborrower; my $warnings; @@ -93,14 +95,13 @@ my $messages; my $date = C4::Dates->today('iso'); my $action = $input->param('action'); +$action ||= q{}; if ( $action eq 'move' ) { my $where = $input->param('where'); my $borrowernumber = $input->param('borrowernumber'); my $biblionumber = $input->param('biblionumber'); - AlterPriority( $where, $borrowernumber, $biblionumber ); - } elsif ( $action eq 'cancel' ) { my $borrowernumber = $input->param('borrowernumber'); my $biblionumber = $input->param('biblionumber'); @@ -112,26 +113,24 @@ if ( $action eq 'move' ) { } if ($findborrower) { - my ( $count, $borrowers ) = - SearchMember($findborrower, 'cardnumber', 'web' ); + my $borrowers = Search($findborrower, 'cardnumber'); - my @borrowers = @$borrowers; - - if ( $#borrowers == -1 ) { - $input->param( 'findborrower', '' ); + if ($borrowers && @$borrowers) { + if ( @$borrowers == 1 ) { + $borrowernumber_hold = $borrowers->[0]->{'borrowernumber'}; + } + else { + $borrowerslist = $borrowers; + } + } else { $messageborrower = "'$findborrower'"; } - elsif ( $#borrowers == 0 ) { - $input->param( 'cardnumber', $borrowers[0]->{'cardnumber'} ); - $cardnumber = $borrowers[0]->{'cardnumber'}; - } - else { - $borrowerslist = \@borrowers; - } } -if ($cardnumber) { - my $borrowerinfo = GetMemberDetails( 0, $cardnumber ); +# If we have the borrowernumber because we've performed an action, then we +# don't want to try to place another reserve. +if ($borrowernumber_hold && !$action) { + my $borrowerinfo = GetMember( borrowernumber => $borrowernumber_hold ); my $diffbranch; my @getreservloop; my $count_reserv = 0; @@ -143,7 +142,7 @@ if ($cardnumber) { my $number_reserves = GetReserveCount( $borrowerinfo->{'borrowernumber'} ); - if ( C4::Context->preference('maxreserves') && $number_reserves >= C4::Context->preference('maxreserves') ) { + if ( C4::Context->preference('maxreserves') && ($number_reserves >= C4::Context->preference('maxreserves')) ) { $warnings = 1; $maxreserves = 1; } @@ -155,7 +154,6 @@ if ($cardnumber) { Date_to_Days(split /-/,$date) > Date_to_Days(split /-/,$expiry_date)) { $messages = $expiry = 1; } - # check if the borrower make the reserv in a different branch if ( $borrowerinfo->{'branchcode'} ne C4::Context->userenv->{'branch'} ) { @@ -164,24 +162,25 @@ if ($cardnumber) { } $template->param( - borrowernumber => $borrowerinfo->{'borrowernumber'}, - borrowersurname => $borrowerinfo->{'surname'}, - borrowerfirstname => $borrowerinfo->{'firstname'}, - borrowerstreetaddress => $borrowerinfo->{'address'}, - borrowercity => $borrowerinfo->{'city'}, - borrowerphone => $borrowerinfo->{'phone'}, - borrowermobile => $borrowerinfo->{'mobile'}, - borrowerfax => $borrowerinfo->{'fax'}, - borrowerphonepro => $borrowerinfo->{'phonepro'}, - borroweremail => $borrowerinfo->{'email'}, - borroweremailpro => $borrowerinfo->{'emailpro'}, - borrowercategory => $borrowerinfo->{'category'}, - borrowerreservs => $count_reserv, - maxreserves => $maxreserves, - expiry => $expiry, - diffbranch => $diffbranch, - messages => $messages, - warnings => $warnings + borrowernumber => $borrowerinfo->{'borrowernumber'}, + borrowersurname => $borrowerinfo->{'surname'}, + borrowerfirstname => $borrowerinfo->{'firstname'}, + borrowerstreetaddress => $borrowerinfo->{'address'}, + borrowercity => $borrowerinfo->{'city'}, + borrowerphone => $borrowerinfo->{'phone'}, + borrowermobile => $borrowerinfo->{'mobile'}, + borrowerfax => $borrowerinfo->{'fax'}, + borrowerphonepro => $borrowerinfo->{'phonepro'}, + borroweremail => $borrowerinfo->{'email'}, + borroweremailpro => $borrowerinfo->{'emailpro'}, + borrowercategory => $borrowerinfo->{'category'}, + borrowerreservs => $count_reserv, + cardnumber => $borrowerinfo->{'cardnumber'}, + maxreserves => $maxreserves, + expiry => $expiry, + diffbranch => $diffbranch, + messages => $messages, + warnings => $warnings ); } @@ -194,24 +193,24 @@ if ($borrowerslist) { foreach my $borrower ( sort { - $a->{surname} - . $a->{firstname} cmp $b->{surname} - . $b->{firstname} + uc($a->{surname} + . $a->{firstname}) cmp uc($b->{surname} + . $b->{firstname}) } @{$borrowerslist} ) { - push @values, $borrower->{cardnumber}; + push @values, $borrower->{borrowernumber}; - $labels{ $borrower->{cardnumber} } = sprintf( + $labels{ $borrower->{borrowernumber} } = sprintf( '%s, %s ... (%s - %s) ... %s', - $borrower->{surname}, $borrower->{firstname}, - $borrower->{cardnumber}, $borrower->{categorycode}, - $borrower->{address}, + $borrower->{surname} ||'', $borrower->{firstname} || '', + $borrower->{cardnumber} || '', $borrower->{categorycode} || '', + $borrower->{address} || '', ); } $CGIselectborrower = CGI::scrolling_list( - -name => 'cardnumber', + -name => 'borrowernumber', -values => \@values, -labels => \%labels, -size => 7, @@ -219,8 +218,8 @@ if ($borrowerslist) { ); } -# FIXME launch another time GetMemberDetails perhaps until -my $borrowerinfo = GetMemberDetails( 0, $cardnumber ); +# FIXME launch another time GetMember perhaps until +my $borrowerinfo = GetMember( borrowernumber => $borrowernumber_hold ); my @biblionumbers = (); my $biblionumbers = $input->param('biblionumbers'); @@ -230,6 +229,7 @@ if ($multihold) { push @biblionumbers, $input->param('biblionumber'); } +my $itemdata_enumchron = 0; my @biblioloop = (); foreach my $biblionumber (@biblionumbers) { @@ -238,7 +238,7 @@ foreach my $biblionumber (@biblionumbers) { my $dat = GetBiblioData($biblionumber); - if ( not CanBookBeReserved($borrowerinfo->{borrowernumber}, $biblionumber) ) { + unless ( CanBookBeReserved($borrowerinfo->{borrowernumber}, $biblionumber) ) { $warnings = 1; $maxreserves = 1; } @@ -265,11 +265,11 @@ foreach my $biblionumber (@biblionumbers) { warnings => $warnings, maxreserves=>$maxreserves ); - - + + # FIXME think @optionloop, is maybe obsolete, or must be switchable by a systeme preference fixed rank or not # make priorities options - + my @optionloop; for ( 1 .. $count + 1 ) { push( @@ -286,82 +286,96 @@ foreach my $biblionumber (@biblionumbers) { my @branchcodes; my %itemnumbers_of_biblioitem; my @itemnumbers; - + ## $items is array of 'item' table numbers if (my $items = get_itemnumbers_of($biblionumber)->{$biblionumber}){ @itemnumbers = @$items; } - else { + my @hostitems = get_hostitemnumbers_of($biblionumber); + if (@hostitems){ + $template->param('hostitemsflag' => 1); + push(@itemnumbers, @hostitems); + } + + if (!@itemnumbers) { $template->param('noitems' => 1); $biblioloopiter{noitems} = 1; } - + ## Hash of item number to 'item' table fields my $iteminfos_of = GetItemInfosOf(@itemnumbers); - + ## Here we go backwards again to create hash of biblioitemnumber to itemnumbers, ## when by definition all of the itemnumber have the same biblioitemnumber foreach my $itemnumber (@itemnumbers) { my $biblioitemnumber = $iteminfos_of->{$itemnumber}->{biblioitemnumber}; push( @{ $itemnumbers_of_biblioitem{$biblioitemnumber} }, $itemnumber ); } - + ## Should be same as biblionumber my @biblioitemnumbers = keys %itemnumbers_of_biblioitem; - + my $notforloan_label_of = get_notforloan_label_of(); - + ## Hash of biblioitemnumber to 'biblioitem' table records my $biblioiteminfos_of = GetBiblioItemInfosOf(@biblioitemnumbers); - + my @bibitemloop; - + foreach my $biblioitemnumber (@biblioitemnumbers) { my $biblioitem = $biblioiteminfos_of->{$biblioitemnumber}; my $num_available = 0; my $num_override = 0; my $hiddencount = 0; - + $biblioitem->{description} = $itemtypes->{ $biblioitem->{itemtype} }{description}; + if($biblioitem->{biblioitemnumber} ne $biblionumber){ + $biblioitem->{hostitemsflag}=1; + } $biblioloopiter{description} = $biblioitem->{description}; $biblioloopiter{itypename} = $biblioitem->{description}; $biblioloopiter{imageurl} = getitemtypeimagelocation('intranet', $itemtypes->{$biblioitem->{itemtype}}{imageurl}); - + foreach my $itemnumber ( @{ $itemnumbers_of_biblioitem{$biblioitemnumber} } ) { my $item = $iteminfos_of->{$itemnumber}; - + unless (C4::Context->preference('item-level_itypes')) { $item->{itype} = $biblioitem->{itemtype}; } - + $item->{itypename} = $itemtypes->{ $item->{itype} }{description}; $item->{imageurl} = getitemtypeimagelocation( 'intranet', $itemtypes->{ $item->{itype} }{imageurl} ); $item->{homebranchname} = $branches->{ $item->{homebranch} }{branchname}; - + # if the holdingbranch is different than the homebranch, we show the # holdingbranch of the document too if ( $item->{homebranch} ne $item->{holdingbranch} ) { $item->{holdingbranchname} = $branches->{ $item->{holdingbranch} }{branchname}; } - + + if($item->{biblionumber} ne $biblionumber){ + $item->{hostitemsflag}=1; + $item->{hosttitle} = GetBiblioData($item->{biblionumber})->{title}; + } + # add information $item->{itemcallnumber} = $item->{itemcallnumber}; - + # if the item is currently on loan, we display its return date and # change the background color my $issues= GetItemIssue($itemnumber); if ( $issues->{'date_due'} ) { - $item->{date_due} = format_date($issues->{'date_due'}); + $item->{date_due} = format_sqldatetime($issues->{date_due}); $item->{backgroundcolor} = 'onloan'; } - + # checking reserve my ($reservedate,$reservedfor,$expectedAt) = GetReservesFromItemnumber($itemnumber); - my $ItemBorrowerReserveInfo = GetMemberDetails( $reservedfor, 0); - + my $ItemBorrowerReserveInfo = GetMember( borrowernumber => $reservedfor ); + if ( defined $reservedate ) { $item->{backgroundcolor} = 'reserved'; $item->{reservedate} = format_date($reservedate); @@ -369,19 +383,19 @@ foreach my $biblionumber (@biblionumbers) { $item->{ReservedForSurname} = $ItemBorrowerReserveInfo->{'surname'}; $item->{ReservedForFirstname} = $ItemBorrowerReserveInfo->{'firstname'}; $item->{ExpectedAtLibrary} = $branches->{$expectedAt}{branchname}; - + } - + # Management of the notforloan document if ( $item->{notforloan} ) { $item->{backgroundcolor} = 'other'; $item->{notforloanvalue} = $notforloan_label_of->{ $item->{notforloan} }; } - + # Management of lost or long overdue items if ( $item->{itemlost} ) { - + # FIXME localized strings should never be in Perl code $item->{message} = $item->{itemlost} == 1 ? "(lost)" @@ -393,11 +407,11 @@ foreach my $biblionumber (@biblionumbers) { $hiddencount++; } } - + # Check the transit status my ( $transfertwhen, $transfertfrom, $transfertto ) = GetTransfers($itemnumber); - + if ( defined $transfertwhen && $transfertwhen ne '' ) { $item->{transfertwhen} = format_date($transfertwhen); $item->{transfertfrom} = @@ -405,13 +419,13 @@ foreach my $biblionumber (@biblionumbers) { $item->{transfertto} = $branches->{$transfertto}{branchname}; $item->{nocancel} = 1; } - + # If there is no loan, return and transfer, we show a checkbox. $item->{notforloan} = $item->{notforloan} || 0; - + # if independent branches is on we need to check if the person can reserve # for branches they arent logged in to - if ( C4::Context->preference("IndependantBranches") ) { + if ( C4::Context->preference("IndependantBranches") ) { if (! C4::Context->preference("canreservefromotherbranches")){ # cant reserve items so need to check if item homebranch and userenv branch match if not we cant reserve my $userenv = C4::Context->userenv; @@ -420,45 +434,56 @@ foreach my $biblionumber (@biblionumbers) { } } } - + my $branch = C4::Circulation::_GetCircControlBranch($item, $borrowerinfo); my $branchitemrule = GetBranchItemRule( $branch, $item->{'itype'} ); my $policy_holdallowed = 1; - + $item->{'holdallowed'} = $branchitemrule->{'holdallowed'}; - + if ( $branchitemrule->{'holdallowed'} == 0 || - ( $branchitemrule->{'holdallowed'} == 1 && $borrowerinfo->{'branchcode'} ne $item->{'homebranch'} ) ) { + ( $branchitemrule->{'holdallowed'} == 1 && + $borrowerinfo->{'branchcode'} ne $item->{'homebranch'} ) ) { $policy_holdallowed = 0; } - if (IsAvailableForItemLevelRequest($itemnumber) and not $item->{cantreserve} and CanItemBeReserved($borrowerinfo->{borrowernumber}, $itemnumber) ) { - if ( $policy_holdallowed ) { - $item->{available} = 1; - $num_available++; - } - } elsif (C4::Context->preference( 'AllowHoldPolicyOverride' ) ) { - $item->{override} = 1; - $num_override++; + if ( + $policy_holdallowed + && !$item->{cantreserve} + && IsAvailableForItemLevelRequest($itemnumber) + && CanItemBeReserved( + $borrowerinfo->{borrowernumber}, $itemnumber + ) + ) + { + $item->{available} = 1; + $num_available++; } - # If AllowHoldPolicyOverride is set, it should override EVERY restriction, not just branch item rules - if (C4::Context->preference( 'AllowHoldPolicyOverride' ) ) { + elsif ( C4::Context->preference('AllowHoldPolicyOverride') ) { + +# If AllowHoldPolicyOverride is set, it should override EVERY restriction, not just branch item rules $item->{override} = 1; $num_override++; - } + } # If none of the conditions hold true, then neither override nor available is set and the item cannot be checked - + # FIXME: move this to a pm my $sth2 = $dbh->prepare("SELECT * FROM reserves WHERE borrowernumber=? AND itemnumber=? AND found='W'"); $sth2->execute($item->{ReservedForBorrowernumber},$item->{itemnumber}); while (my $wait_hashref = $sth2->fetchrow_hashref) { $item->{waitingdate} = format_date($wait_hashref->{waitingdate}); } + + # Show serial enumeration when needed + if ($item->{enumchron}) { + $itemdata_enumchron = 1; + } + push @{ $biblioitem->{itemloop} }, $item; } - + if ( $num_override == scalar( @{ $biblioitem->{itemloop} } ) ) { # That is, if all items require an override $template->param( override_required => 1 ); } elsif ( $num_available == 0 ) { @@ -468,17 +493,17 @@ foreach my $biblionumber (@biblionumbers) { $biblioloopiter{none_avail} = 1; } $template->param( hiddencount => $hiddencount); - + push @bibitemloop, $biblioitem; } # existingreserves building my @reserveloop; ( $count, $reserves ) = GetReservesFromBiblionumber($biblionumber,1); - foreach my $res ( sort { + foreach my $res ( sort { my $a_found = $a->{found} || ''; my $b_found = $a->{found} || ''; - $a_found cmp $b_found; + $a_found cmp $b_found; } @$reserves ) { my %reserve; my @optionloop; @@ -491,11 +516,11 @@ foreach my $biblionumber (@biblionumbers) { } ); } - + if ( defined $res->{'found'} && $res->{'found'} eq 'W' || $res->{'found'} eq 'T' ) { my $item = $res->{'itemnumber'}; $item = GetBiblioFromItemNumber($item,undef); - $reserve{'wait'}= 1; + $reserve{'wait'}= 1; $reserve{'holdingbranch'}=$item->{'holdingbranch'}; $reserve{'biblionumber'}=$item->{'biblionumber'}; $reserve{'barcodenumber'} = $item->{'barcode'}; @@ -516,21 +541,21 @@ foreach my $biblionumber (@biblionumbers) { $reserve{'item_level_hold'} = 1; } } - + # get borrowers reserve info - my $reserveborrowerinfo = GetMemberDetails( $res->{'borrowernumber'}, 0); + my $reserveborrowerinfo = GetMember( borrowernumber => $res->{'borrowernumber'} ); if (C4::Context->preference('HidePatronName')){ $reserve{'hidename'} = 1; $reserve{'cardnumber'} = $reserveborrowerinfo->{'cardnumber'}; } - $reserve{'expirationdate'} = format_date( $res->{'expirationdate'} ) + $reserve{'expirationdate'} = format_date( $res->{'expirationdate'} ) unless ( !defined($res->{'expirationdate'}) || $res->{'expirationdate'} eq '0000-00-00' ); $reserve{'date'} = format_date( $res->{'reservedate'} ); $reserve{'borrowernumber'} = $res->{'borrowernumber'}; $reserve{'biblionumber'} = $res->{'biblionumber'}; $reserve{'borrowernumber'} = $res->{'borrowernumber'}; $reserve{'firstname'} = $reserveborrowerinfo->{'firstname'}; - $reserve{'surname'} = $reserveborrowerinfo->{'surname'}; + $reserve{'surname'} = $reserveborrowerinfo->{'surname'}; $reserve{'notes'} = $res->{'reservenotes'}; $reserve{'wait'} = ( ( defined $res->{'found'} and $res->{'found'} eq 'W' ) or ( $res->{'priority'} eq '0' ) ); @@ -543,28 +568,28 @@ foreach my $biblionumber (@biblionumbers) { $reserve{'lowestPriority'} = $res->{'lowestPriority'}; $reserve{'branchloop'} = GetBranchesLoop($res->{'branchcode'}); $reserve{'optionloop'} = \@optionloop; - + push( @reserveloop, \%reserve ); } - + # get the time for the form name... my $time = time(); - + $template->param( CGIbranch => $CGIbranch, time => $time, fixedRank => $fixedRank, ); - + # display infos $template->param( optionloop => \@optionloop, bibitemloop => \@bibitemloop, + itemdata_enumchron => $itemdata_enumchron, date => $date, biblionumber => $biblionumber, findborrower => $findborrower, - cardnumber => $cardnumber, title => $dat->{title}, author => $dat->{author}, holdsview => 1, @@ -586,7 +611,6 @@ foreach my $biblionumber (@biblionumbers) { if (@reserveloop) { $template->param( reserveloop => \@reserveloop ); } - push @biblioloop, \%biblioloopiter; } @@ -602,6 +626,6 @@ if ($multihold) { if ( C4::Context->preference( 'AllowHoldDateInFuture' ) ) { $template->param( reserve_in_future => 1 ); } - + # printout the page output_html_with_http_headers $input, $cookie, $template->output;