#
# 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 2 of the License, or (at your option) any later
-# version.
+# 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.
+# 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# You should have received a copy of the GNU General Public License
+# along with Koha; if not, see <http://www.gnu.org/licenses>.
=head1 request.pl
use strict;
use warnings;
use C4::Branch;
-use CGI;
+use CGI qw ( -utf8 );
use List::MoreUtils qw/uniq/;
use Date::Calc qw/Date_to_Days/;
use C4::Output;
use C4::Items;
use C4::Koha;
use C4::Circulation;
-use C4::Dates qw/format_date/;
+use Koha::DateUtils;
+use C4::Utils::DataTables::Members;
use C4::Members;
use C4::Search; # enabled_staff_search_views
use Koha::DateUtils;
my $input = new CGI;
my ( $template, $borrowernumber, $cookie, $flags ) = get_template_and_user(
{
- template_name => "reserve/request.tmpl",
+ template_name => "reserve/request.tt",
query => $input,
type => "intranet",
authnotrequired => 0,
my $borrowernumber_hold = $input->param('borrowernumber') || '';
my $messageborrower;
my $maxreserves;
+my $warnings;
+my $messages;
-my $date = C4::Dates->today('iso');
+my $date = output_pref({ dt => dt_from_string, dateformat => 'iso', dateonly => 1 });
my $action = $input->param('action');
$action ||= q{};
}
if ($findborrower) {
- my $borrowers = Search($findborrower, 'cardnumber');
-
- if ($borrowers && @$borrowers) {
- if ( @$borrowers == 1 ) {
- $borrowernumber_hold = $borrowers->[0]->{'borrowernumber'};
- }
- else {
- $template->param( borrower_list => sort_borrowerlist($borrowers));
- }
+ my $borrower = C4::Members::GetMember( cardnumber => $findborrower );
+ if ( $borrower ) {
+ $borrowernumber_hold = $borrower->{borrowernumber};
} else {
- $messageborrower = "'$findborrower'";
+ my $dt_params = { iDisplayLength => -1 };
+ my $results = C4::Utils::DataTables::Members::search(
+ {
+ searchmember => $findborrower,
+ dt_params => $dt_params,
+ }
+ );
+ my $borrowers = $results->{patrons};
+ if ( scalar @$borrowers == 1 ) {
+ $borrowernumber_hold = $borrowers->[0]->{borrowernumber};
+ } elsif ( @$borrowers ) {
+ $template->param( borrowers => $borrowers );
+ } else {
+ $messageborrower = "'$findborrower'";
+ }
}
}
my @getreservloop;
my $count_reserv = 0;
-# we check the reserves of the borrower, and if he can reserv a document
-# FIXME At this time we have a simple count of reservs, but, later, we could improve the infos "title" ...
+ # we check the reserves of the borrower, and if he can reserv a document
+ # FIXME At this time we have a simple count of reservs, but, later, we could improve the infos "title" ...
my $number_reserves =
GetReserveCount( $borrowerinfo->{'borrowernumber'} );
if ( C4::Context->preference('maxreserves') && ($number_reserves >= C4::Context->preference('maxreserves')) ) {
+ $warnings = 1;
$maxreserves = 1;
}
my $expiry_date = $borrowerinfo->{dateexpiry};
my $expiry = 0; # flag set if patron account has expired
if ($expiry_date and $expiry_date ne '0000-00-00' and
- Date_to_Days(split /-/,$date) > Date_to_Days(split /-/,$expiry_date)) {
+ Date_to_Days(split /-/,$date) > Date_to_Days(split /-/,$expiry_date)) {
$expiry = 1;
}
cardnumber => $borrowerinfo->{'cardnumber'},
expiry => $expiry,
diffbranch => $diffbranch,
+ messages => $messages,
+ warnings => $warnings,
+ amount_outstanding => GetMemberAccountRecords($borrowerinfo->{borrowernumber}),
);
}
my $dat = GetBiblioData($biblionumber);
- unless ( CanBookBeReserved($borrowerinfo->{borrowernumber}, $biblionumber) ) {
+ my $canReserve = CanBookBeReserved( $borrowerinfo->{borrowernumber}, $biblionumber );
+ $canReserve //= '';
+ if ( $canReserve eq 'OK' ) {
+
+ #All is OK and we can continue
+ }
+ elsif ( $canReserve eq 'tooManyReserves' ) {
$maxreserves = 1;
}
+ elsif ( $canReserve eq 'ageRestricted' ) {
+ $template->param( $canReserve => 1 );
+ $biblioloopiter{$canReserve} = 1;
+ }
+ else {
+ $biblioloopiter{$canReserve} = 1;
+ }
my $alreadypossession;
if (not C4::Context->preference('AllowHoldsOnPatronsPossessions') and CheckIfIssuedToPatron($borrowerinfo->{borrowernumber},$biblionumber)) {
}
# get existing reserves .....
- my ( $count, $reserves ) = GetReservesFromBiblionumber($biblionumber,1);
+ my $reserves = GetReservesFromBiblionumber({ biblionumber => $biblionumber, all_dates => 1 });
+ my $count = scalar( @$reserves );
my $totalcount = $count;
my $holds_count = 0;
my $alreadyreserved = 0;
foreach my $res (@$reserves) {
- if ( defined $res->{found} && $res->{found} eq 'W' ) {
+ if ( defined $res->{found} ) { # found can be 'W' or 'T'
$count--;
}
$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_sqldatetime($issues->{date_due});
+ $item->{date_due} = $issues->{date_due_sql};
$item->{backgroundcolor} = 'onloan';
}
# checking reserve
- my ($reservedate,$reservedfor,$expectedAt,$reserve_id,$wait) = GetReservesFromItemnumber($itemnumber,1); #alldates parameter to include future holds/waits
- my $ItemBorrowerReserveInfo = GetMember( borrowernumber => $reservedfor );
-
+ my ($reservedate,$reservedfor,$expectedAt,$reserve_id,$wait) = GetReservesFromItemnumber($itemnumber);
if ( defined $reservedate ) {
+ my $ItemBorrowerReserveInfo = GetMember( borrowernumber => $reservedfor );
+
$item->{backgroundcolor} = 'reserved';
- $item->{reservedate} = format_date($reservedate);
+ $item->{reservedate} = output_pref({ dt => dt_from_string( $reservedate ), dateonly => 1 });
$item->{ReservedForBorrowernumber} = $reservedfor;
$item->{ReservedForSurname} = $ItemBorrowerReserveInfo->{'surname'};
$item->{ReservedForFirstname} = $ItemBorrowerReserveInfo->{'firstname'};
$item->{ExpectedAtLibrary} = $branches->{$expectedAt}{branchname};
- $item->{waitingdate} = format_date($wait) if $wait;
+ $item->{waitingdate} = $wait;
}
# Management of the notforloan document
GetTransfers($itemnumber);
if ( defined $transfertwhen && $transfertwhen ne '' ) {
- $item->{transfertwhen} = format_date($transfertwhen);
+ $item->{transfertwhen} = output_pref({ dt => dt_from_string( $transfertwhen ), dateonly => 1 });
$item->{transfertfrom} =
$branches->{$transfertfrom}{branchname};
$item->{transfertto} = $branches->{$transfertto}{branchname};
}
# If there is no loan, return and transfer, we show a checkbox.
- $item->{notforloan} = $item->{notforloan} || 0;
+ $item->{notforloan} ||= 0;
# if independent branches is on we need to check if the person can reserve
# for branches they arent logged in to
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'} ) ) {
- $policy_holdallowed = 0;
- }
-
if (
- $policy_holdallowed
- && !$item->{cantreserve}
- && IsAvailableForItemLevelRequest($itemnumber)
+ !$item->{cantreserve}
+ && IsAvailableForItemLevelRequest($item, $borrowerinfo)
&& CanItemBeReserved(
$borrowerinfo->{borrowernumber}, $itemnumber
- )
+ ) eq 'OK'
)
{
$item->{available} = 1;
$num_available++;
}
elsif ( C4::Context->preference('AllowHoldPolicyOverride') ) {
-
-# If AllowHoldPolicyOverride is set, it should override EVERY restriction, not just branch item rules
+ # If AllowHoldPolicyOverride is set, it should override EVERY restriction, not just branch item rules
$item->{override} = 1;
$num_override++;
}
# existingreserves building
my @reserveloop;
- ( $count, $reserves ) = GetReservesFromBiblionumber($biblionumber,1);
+ $reserves = GetReservesFromBiblionumber({ biblionumber => $biblionumber, all_dates => 1 });
foreach my $res ( sort {
my $a_found = $a->{found} || '';
my $b_found = $a->{found} || '';
$reserve{'itemnumber'} = $res->{'itemnumber'};
$reserve{'wbrname'} = $branches->{$res->{'branchcode'}}->{'branchname'};
if($reserve{'holdingbranch'} eq $reserve{'wbrcode'}){
- $reserve{'atdestination'} = 1;
+ # 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{'found'} = 1 if $res->{'found'} eq 'W';
$reserve{'hidename'} = 1;
$reserve{'cardnumber'} = $reserveborrowerinfo->{'cardnumber'};
}
- $reserve{'expirationdate'} = format_date( $res->{'expirationdate'} )
+ $reserve{'expirationdate'} = output_pref({ dt => dt_from_string( $res->{'expirationdate'} ), dateonly => 1 })
unless ( !defined($res->{'expirationdate'}) || $res->{'expirationdate'} eq '0000-00-00' );
- $reserve{'date'} = format_date( $res->{'reservedate'} );
+ $reserve{'date'} = output_pref({ dt => dt_from_string( $res->{'reservedate'} ), dateonly => 1 });
$reserve{'borrowernumber'} = $res->{'borrowernumber'};
$reserve{'biblionumber'} = $res->{'biblionumber'};
$reserve{'borrowernumber'} = $res->{'borrowernumber'};
$reserve{'notes'} = $res->{'reservenotes'};
$reserve{'wait'} =
( ( defined $res->{'found'} and $res->{'found'} eq 'W' ) or ( $res->{'priority'} eq '0' ) );
- $reserve{'constrainttypea'} = ( $res->{'constrainttype'} eq 'a' );
- $reserve{'constrainttypeo'} = ( $res->{'constrainttype'} eq 'o' );
$reserve{'voldesc'} = $res->{'volumeddesc'};
$reserve{'ccode'} = $res->{'ccode'};
$reserve{'barcode'} = $res->{'barcode'};