#!/usr/bin/perl
-#writen 2/1/00 by chris@katipo.oc.nz
+#written 2/1/00 by chris@katipo.oc.nz
# Copyright 2000-2002 Katipo Communications
# Parts Copyright 2011 Catalyst IT
#
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;
+use Koha::Borrower::Debarments qw(IsDebarred);
+use Koha::Holds;
my $dbh = C4::Context->dbh;
-my $sth;
my $input = new CGI;
my ( $template, $borrowernumber, $cookie, $flags ) = get_template_and_user(
{
$findborrower =~ s|,| |g;
my $borrowernumber_hold = $input->param('borrowernumber') || '';
my $messageborrower;
-my $maxreserves;
my $warnings;
my $messages;
+my $exceeded_maxreserves;
-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{};
}
}
+my @biblionumbers = ();
+my $biblionumbers = $input->param('biblionumbers');
+if ($multihold) {
+ @biblionumbers = split '/', $biblionumbers;
+} else {
+ push @biblionumbers, $input->param('biblionumber');
+}
+
+
# 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;
# 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 =
+ my $reserves_count =
GetReserveCount( $borrowerinfo->{'borrowernumber'} );
- if ( C4::Context->preference('maxreserves') && ($number_reserves >= C4::Context->preference('maxreserves')) ) {
- $warnings = 1;
- $maxreserves = 1;
+ my $new_reserves_count = scalar( @biblionumbers );
+
+ my $maxreserves = C4::Context->preference('maxreserves');
+ if ( $maxreserves
+ && ( $reserves_count + $new_reserves_count > $maxreserves ) )
+ {
+ my $new_reserves_allowed =
+ $maxreserves - $reserves_count > 0
+ ? $maxreserves - $reserves_count
+ : 0;
+ $warnings = 1;
+ $exceeded_maxreserves = 1;
+ $template->param(
+ new_reserves_allowed => $new_reserves_allowed,
+ new_reserves_count => $new_reserves_count,
+ reserves_count => $reserves_count,
+ maxreserves => $maxreserves,
+ );
}
# we check the date expiry of the borrower (only if there is an expiry date, otherwise, set to 1 (warn)
borroweremail => $borrowerinfo->{'email'},
borroweremailpro => $borrowerinfo->{'emailpro'},
borrowercategory => $borrowerinfo->{'category'},
- borrowerreservs => $count_reserv,
cardnumber => $borrowerinfo->{'cardnumber'},
expiry => $expiry,
diffbranch => $diffbranch,
messages => $messages,
- warnings => $warnings
+ warnings => $warnings,
+ restricted => IsDebarred($borrowerinfo->{'borrowernumber'}),
+ amount_outstanding => GetMemberAccountRecords($borrowerinfo->{borrowernumber}),
);
}
# FIXME launch another time GetMember perhaps until
my $borrowerinfo = GetMember( borrowernumber => $borrowernumber_hold );
-my @biblionumbers = ();
-my $biblionumbers = $input->param('biblionumbers');
-if ($multihold) {
- @biblionumbers = split '/', $biblionumbers;
-} else {
- push @biblionumbers, $input->param('biblionumber');
-}
-
my $itemdata_enumchron = 0;
my @biblioloop = ();
foreach my $biblionumber (@biblionumbers) {
my $dat = GetBiblioData($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;
+ $exceeded_maxreserves = 1;
}
elsif ( $canReserve eq 'ageRestricted' ) {
$template->param( $canReserve => 1 );
# adding a fixed value for priority options
my $fixedRank = $count+1;
- my @branchcodes;
my %itemnumbers_of_biblioitem;
my @itemnumbers;
my $num_override = 0;
my $hiddencount = 0;
- $biblioitem->{description} =
- $itemtypes->{ $biblioitem->{itemtype} }{description};
- if($biblioitem->{biblioitemnumber} ne $biblionumber){
- $biblioitem->{hostitemsflag}=1;
- }
+ if ( $biblioitem->{biblioitemnumber} ne $biblionumber ) {
+ $biblioitem->{hostitemsflag} = 1;
+ }
+
$biblioloopiter{description} = $biblioitem->{description};
- $biblioloopiter{itypename} = $biblioitem->{description};
- $biblioloopiter{imageurl} =
- getitemtypeimagelocation('intranet', $itemtypes->{$biblioitem->{itemtype}}{imageurl});
+ $biblioloopiter{itypename} = $biblioitem->{description};
+ if ( $biblioitem->{itemtype} ) {
+
+ $biblioitem->{description} =
+ $itemtypes->{ $biblioitem->{itemtype} }{description};
+
+ $biblioloopiter{imageurl} =
+ getitemtypeimagelocation( 'intranet',
+ $itemtypes->{ $biblioitem->{itemtype} }{imageurl} );
+ }
foreach my $itemnumber ( @{ $itemnumbers_of_biblioitem{$biblioitemnumber} } ) {
my $item = $iteminfos_of->{$itemnumber};
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'};
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 (
!$item->{cantreserve}
+ && !$exceeded_maxreserves
&& IsAvailableForItemLevelRequest($item, $borrowerinfo)
&& CanItemBeReserved(
$borrowerinfo->{borrowernumber}, $itemnumber
# existingreserves building
my @reserveloop;
- $reserves = GetReservesFromBiblionumber({ biblionumber => $biblionumber, all_dates => 1 });
- foreach my $res ( sort {
- my $a_found = $a->{found} || '';
- my $b_found = $a->{found} || '';
+ my @reserves = Koha::Holds->search( { biblionumber => $biblionumber }, { order_by => 'priority' } );
+ foreach my $res (
+ sort {
+ my $a_found = $a->found() || '';
+ my $b_found = $a->found() || '';
$a_found cmp $b_found;
- } @$reserves ) {
+ } @reserves
+ )
+ {
my %reserve;
my @optionloop;
for ( my $i = 1 ; $i <= $totalcount ; $i++ ) {
push(
- @optionloop,
- {
- num => $i,
- selected => ( $i == $res->{priority} ),
- }
- );
+ @optionloop,
+ {
+ num => $i,
+ selected => ( $i == $res->priority() ),
+ }
+ );
}
- if ( defined $res->{'found'} && ($res->{'found'} eq 'W' || $res->{'found'} eq 'T' )) {
- my $item = $res->{'itemnumber'};
- $item = GetBiblioFromItemNumber($item,undef);
- $reserve{'wait'}= 1;
- $reserve{'holdingbranch'}=$item->{'holdingbranch'};
- $reserve{'biblionumber'}=$item->{'biblionumber'};
- $reserve{'barcodenumber'} = $item->{'barcode'};
- $reserve{'wbrcode'} = $res->{'branchcode'};
- $reserve{'itemnumber'} = $res->{'itemnumber'};
- $reserve{'wbrname'} = $branches->{$res->{'branchcode'}}->{'branchname'};
- if($reserve{'holdingbranch'} eq $reserve{'wbrcode'}){
+ if ( $res->is_found() ) {
+ $reserve{'wait'} = 1;
+ $reserve{'holdingbranch'} = $res->item()->holdingbranch();
+ $reserve{'biblionumber'} = $res->item()->biblionumber();
+ $reserve{'barcodenumber'} = $res->item()->barcode();
+ $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} ) {
+ 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{'intransit'} = 1 if $res->{'found'} eq 'T';
- } elsif ($res->{priority} > 0) {
- if (defined($res->{itemnumber})) {
- my $item = GetItem($res->{itemnumber});
- $reserve{'itemnumber'} = $res->{'itemnumber'};
- $reserve{'barcodenumber'} = $item->{'barcode'};
+ $reserve{'found'} = $res->is_found();
+ $reserve{'intransit'} = $res->is_in_transit();
+ }
+ elsif ( $res->priority() > 0 ) {
+ if ( my $item = $res->item() ) {
+ $reserve{'itemnumber'} = $item->id();
+ $reserve{'barcodenumber'} = $item->barcode();
$reserve{'item_level_hold'} = 1;
}
}
# get borrowers reserve info
- my $reserveborrowerinfo = GetMember( borrowernumber => $res->{'borrowernumber'} );
- if (C4::Context->preference('HidePatronName')){
- $reserve{'hidename'} = 1;
- $reserve{'cardnumber'} = $reserveborrowerinfo->{'cardnumber'};
- }
- $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{'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'};
- $reserve{'priority'} = $res->{'priority'};
- $reserve{'lowestPriority'} = $res->{'lowestPriority'};
- $reserve{'optionloop'} = \@optionloop;
- $reserve{'suspend'} = $res->{'suspend'};
- $reserve{'suspend_until'} = $res->{'suspend_until'};
- $reserve{'reserve_id'} = $res->{'reserve_id'};
+ if ( C4::Context->preference('HidePatronName') ) {
+ $reserve{'hidename'} = 1;
+ $reserve{'cardnumber'} = $res->borrower()->cardnumber();
+ }
+ $reserve{'expirationdate'} = output_pref( { dt => dt_from_string( $res->expirationdate ), dateonly => 1 } )
+ unless ( !defined( $res->expirationdate ) || $res->expirationdate eq '0000-00-00' );
+ $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{'firstname'} = $res->borrower()->firstname();
+ $reserve{'surname'} = $res->borrower()->surname();
+ $reserve{'notes'} = $res->reservenotes();
+ $reserve{'waiting_date'} = $res->waitingdate();
+ $reserve{'waiting_until'} = $res->is_waiting() ? $res->waiting_expires_on() : undef;
+ $reserve{'ccode'} = $res->item() ? $res->item()->ccode() : undef;
+ $reserve{'barcode'} = $res->item() ? $res->item()->barcode() : undef;
+ $reserve{'priority'} = $res->priority();
+ $reserve{'lowestPriority'} = $res->lowestPriority();
+ $reserve{'optionloop'} = \@optionloop;
+ $reserve{'suspend'} = $res->suspend();
+ $reserve{'suspend_until'} = $res->suspend_until();
+ $reserve{'reserve_id'} = $res->reserve_id();
if ( C4::Context->preference('IndependentBranches') && $flags->{'superlibrarian'} != 1 ) {
- $reserve{'branchloop'} = [ GetBranchDetail($res->{'branchcode'}) ];
- } else {
- $reserve{'branchloop'} = GetBranchesLoop($res->{'branchcode'});
+ $reserve{'branchloop'} = [ GetBranchDetail( $res->branchcode() ) ];
+ }
+ else {
+ $reserve{'branchloop'} = GetBranchesLoop( $res->branchcode() );
}
push( @reserveloop, \%reserve );
$template->param( biblioloop => \@biblioloop );
$template->param( biblionumbers => $biblionumbers );
-$template->param( maxreserves => $maxreserves );
+$template->param( exceeded_maxreserves => $exceeded_maxreserves );
if ($multihold) {
$template->param( multi_hold => 1 );