X-Git-Url: http://koha-dev.rot13.org:8081/gitweb/?a=blobdiff_plain;f=reserve%2Frequest.pl;h=a4563f34bb1289f8680f6736a4c1266330d4098c;hb=9d6d641d1f8b77271800f43bc027b651f9aea52b;hp=b1e8745969bdc395facc3abad4389816689038b9;hpb=27c80187ba55e801787a591d0d867921617d8339;p=srvgit diff --git a/reserve/request.pl b/reserve/request.pl index b1e8745969..a4563f34bb 100755 --- a/reserve/request.pl +++ b/reserve/request.pl @@ -29,23 +29,21 @@ script to place reserves/requests use Modern::Perl; use CGI qw ( -utf8 ); -use List::MoreUtils qw/uniq/; -use Date::Calc qw/Date_to_Days/; -use C4::Output; -use C4::Auth; -use C4::Reserves; -use C4::Biblio; -use C4::Items; -use C4::Koha; -use C4::Serials; -use C4::Circulation; -use Koha::DateUtils; +use List::MoreUtils qw( uniq ); +use Date::Calc qw( Date_to_Days ); +use C4::Output qw( output_html_with_http_headers ); +use C4::Auth qw( get_template_and_user ); +use C4::Reserves qw( RevertWaitingStatus AlterPriority ToggleLowestPriority ToggleSuspend CanBookBeReserved GetMaxPatronHoldsForRecord ItemsAnyAvailableAndNotRestricted CanItemBeReserved IsAvailableForItemLevelRequest ); +use C4::Items qw( get_hostitemnumbers_of ); +use C4::Koha qw( getitemtypeimagelocation ); +use C4::Serials qw( CountSubscriptionFromBiblionumber ); +use C4::Circulation qw( GetTransfers _GetCircControlBranch GetBranchItemRule ); +use Koha::DateUtils qw( dt_from_string output_pref ); use C4::Utils::DataTables::Members; -use C4::Members; -use C4::Search; # enabled_staff_search_views +use C4::Search qw( enabled_staff_search_views ); use Koha::Biblios; -use Koha::DateUtils; +use Koha::DateUtils qw( dt_from_string output_pref ); use Koha::Checkouts; use Koha::Holds; use Koha::CirculationRules; @@ -56,19 +54,18 @@ use Koha::Patrons; use Koha::Clubs; my $dbh = C4::Context->dbh; -my $input = new CGI; +my $input = CGI->new; my ( $template, $borrowernumber, $cookie, $flags ) = get_template_and_user( { template_name => "reserve/request.tt", query => $input, type => "intranet", - authnotrequired => 0, flagsrequired => { reserveforothers => 'place_holds' }, } ); my $showallitems = $input->param('showallitems'); -my $pickup = $input->param('pickup') || C4::Context->userenv->{'branch'}; +my $pickup = $input->param('pickup'); my $itemtypes = { map { $_->{itemtype} => $_ } @{ Koha::ItemTypes->search_with_localization->unblessed } }; @@ -170,7 +167,9 @@ if ( $biblionumbers ) { } my $multi_hold = @biblionumbers > 1; -$template->param(multi_hold => $multi_hold); +$template->param( + multi_hold => $multi_hold, +); # If we have the borrowernumber because we've performed an action, then we # don't want to try to place another reserve. @@ -186,6 +185,8 @@ if ($borrowernumber_hold && !$action) { my $new_reserves_count = scalar( @biblionumbers ); my $maxreserves = C4::Context->preference('maxreserves'); + $template->param( maxreserves => $maxreserves ); + if ( $maxreserves && ( $reserves_count + $new_reserves_count > $maxreserves ) ) { @@ -206,7 +207,7 @@ if ($borrowernumber_hold && !$action) { # we check the date expiry of the borrower (only if there is an expiry date, otherwise, set to 1 (warn) my $expiry_date = $patron->dateexpiry; my $expiry = 0; # flag set if patron account has expired - if ($expiry_date and $expiry_date ne '0000-00-00' and + if ($expiry_date and Date_to_Days(split /-/,$date) > Date_to_Days(split /-/,$expiry_date)) { $expiry = 1; } @@ -251,7 +252,7 @@ if ($club_hold && !$borrowernumber_hold && !$action) { } my $expiry_date = $enrollment->patron->dateexpiry; $member->{expiry} = 0; # flag set if patron account has expired - if ($expiry_date and $expiry_date ne '0000-00-00' and + if ($expiry_date and Date_to_Days(split /-/,$date) > Date_to_Days(split /-/,$expiry_date)) { $member->{expiry} = 1; } @@ -271,6 +272,10 @@ if ($club_hold && !$borrowernumber_hold && !$action) { ); } +unless ( $club_hold or $borrowernumber_hold ) { + $template->param( clubcount => Koha::Clubs->search->count ); +} + $template->param( messageborrower => $messageborrower, messageclub => $messageclub @@ -279,6 +284,13 @@ $template->param( # FIXME launch another time GetMember perhaps until (Joubu: Why?) my $patron = Koha::Patrons->find( $borrowernumber_hold ); +if ( $patron && $multi_hold ) { + my @multi_pickup_locations = + Koha::Biblios->search( { biblionumber => \@biblionumbers } ) + ->pickup_locations( { patron => $patron } ); + $template->param( multi_pickup_locations => \@multi_pickup_locations ); +} + my $logged_in_patron = Koha::Patrons->find( $borrowernumber ); my $wants_check; @@ -288,6 +300,7 @@ if ($patron) { my $itemdata_enumchron = 0; my $itemdata_ccode = 0; my @biblioloop = (); +my $no_reserves_allowed = 0; foreach my $biblionumber (@biblionumbers) { next unless $biblionumber =~ m|^\d+$|; @@ -303,6 +316,9 @@ foreach my $biblionumber (@biblionumbers) { #All is OK and we can continue } + elsif ( $canReserve->{status} eq 'noReservesAllowed' || $canReserve->{status} eq 'notReservable' ) { + $no_reserves_allowed = 1; + } elsif ( $canReserve->{status} eq 'tooManyReserves' ) { $exceeded_maxreserves = 1; $template->param( maxreserves => $canReserve->{limit} ); @@ -315,6 +331,10 @@ foreach my $biblionumber (@biblionumbers) { $template->param( $canReserve->{status} => 1 ); $biblioloopiter{ $canReserve->{status} } = 1; } + elsif ( $canReserve->{status} eq 'alreadypossession' ) { + $template->param( $canReserve->{status} => 1); + $biblioloopiter{ $canReserve->{status} } = 1; + } else { $biblioloopiter{ $canReserve->{status} } = 1; } @@ -343,16 +363,6 @@ foreach my $biblionumber (@biblionumbers) { $biblioloopiter{remaining_holds_for_record} = $max_holds_for_record; $template->param( max_holds_for_record => $max_holds_for_record ); $template->param( remaining_holds_for_record => $remaining_holds_for_record ); - - { # alreadypossession - # Check to see if patron is allowed to place holds on records where the - # patron already has an item from that record checked out - if ( !C4::Context->preference('AllowHoldsOnPatronsPossessions') - && CheckIfIssuedToPatron( $patron->borrowernumber, $biblionumber ) ) - { - $template->param( alreadypossession => 1, ); - } - } } @@ -572,19 +582,19 @@ foreach my $biblionumber (@biblionumbers) { && IsAvailableForItemLevelRequest($item_object, $patron, undef, $items_any_available) ) { - $item->{available} = 1; - $num_available++; - if($branchitemrule->{'hold_fulfillment_policy'} eq 'any' ) { - $item->{pickup_locations} = 'Any library'; - $item->{pickup_locations_code} = 'all'; - } else { - my $arr_locations = Koha::Items->find($itemnumber) - ->pickup_locations( { patron => $patron } ); - - $item->{pickup_locations} = join( ', ', - map { $_->unblessed->{branchname} } @$arr_locations); - $item->{pickup_locations_code} = join( ',', - map { $_->unblessed->{branchcode} } @$arr_locations); + # Send the pickup locations count to the UI, the pickup locations will be pulled using the API + my $pickup_locations = $item_object->pickup_locations({ patron => $patron }); + $item->{pickup_locations_count} = $pickup_locations->count; + if ( $item->{pickup_locations_count} > 0 ) { + $num_available++; + $item->{available} = 1; + # pass the holding branch for use as default + my $default_pickup_location = $pickup_locations->search({ branchcode => $item->{holdingbranch} })->next; + $item->{default_pickup_location} = $default_pickup_location; + } + else { + $item->{available} = 0; + $item->{not_holdable} = "no_valid_pickup_location"; } push( @available_itemtypes, $item->{itype} ); @@ -664,20 +674,10 @@ foreach my $biblionumber (@biblionumbers) { $reserve{'wbrcode'} = $res->branchcode(); $reserve{'itemnumber'} = $res->itemnumber(); $reserve{'wbrname'} = $res->branch()->branchname(); - - if ( $reserve{'holdingbranch'} eq $reserve{'wbrcode'} ) { - - # Just because the holdingbranch matches the reserve branch doesn't mean the item - # has arrived at the destination, check for an open transfer for the item as well - my ( $transfertwhen, $transfertfrom, $transferto ) = - C4::Circulation::GetTransfers( $res->itemnumber() ); - if ( not $transferto or $transferto ne $res->branchcode() ) { - $reserve{'atdestination'} = 1; - } - } - - # set found to 1 if reserve is waiting for patron pickup + $reserve{'atdestination'} = $res->is_at_destination(); + $reserve{'desk_name'} = ( $res->desk() ) ? $res->desk()->desk_name() : '' ; $reserve{'found'} = $res->is_found(); + $reserve{'inprocessing'} = $res->is_in_processing(); $reserve{'intransit'} = $res->is_in_transit(); } elsif ( $res->priority() > 0 ) { @@ -705,6 +705,7 @@ foreach my $biblionumber (@biblionumbers) { $reserve{'reserve_id'} = $res->reserve_id(); $reserve{itemtype} = $res->itemtype(); $reserve{branchcode} = $res->branchcode(); + $reserve{non_priority} = $res->non_priority(); $reserve{object} = $res; push( @reserveloop, \%reserve ); @@ -741,15 +742,25 @@ foreach my $biblionumber (@biblionumbers) { $template->param( reserveloop => \@reserveloop ); } + if ( $patron ) { + # Add the valid pickup locations + my @pickup_locations = $biblio->pickup_locations({ patron => $patron }); + $biblioloopiter{pickup_locations} = \@pickup_locations; + $biblioloopiter{pickup_locations_codes} = [ map { $_->branchcode } @pickup_locations ]; + } + push @biblioloop, \%biblioloopiter; } $template->param( biblioloop => \@biblioloop ); $template->param( biblionumbers => $biblionumbers ); +$template->param( no_reserves_allowed => $no_reserves_allowed ); $template->param( exceeded_maxreserves => $exceeded_maxreserves ); $template->param( exceeded_holds_per_record => $exceeded_holds_per_record ); $template->param( subscriptionsnumber => CountSubscriptionFromBiblionumber($biblionumber)); -$template->param( pickup => $pickup ); + +# pass the userenv branch if no pickup location selected +$template->param( pickup => $pickup || C4::Context->userenv->{branch} ); if ( C4::Context->preference( 'AllowHoldDateInFuture' ) ) { $template->param( reserve_in_future => 1 );