Bug 13517 - Show waiting date on reserve/request.pl

The holds table should show the waiting date for a hold in s similar
manner to the way it does on catalogue/detail.pl In addition, if the
ReservesMaxPickUpDelay syspref is set, we should display the date
when the waiting hold expires.

Test Plan:
1) Apply this patch
2) Set ReservesMaxPickUpDelay to 7
3) Find a waiting hold
4) Browse to reserve/request.pl for that record
5) Notice the "Item waiting" message now has "since <waitingdate>"
6) Notice the expiration field now has the date of <waitingdate> + 7 days

Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com>

Signed-off-by: Cathi Wiggins <CWIGGINS@ci.arcadia.ca.us>

Signed-off-by: Megan Wianecki <mwianecki@mplmain.mtpl.org>

Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>

Signed-off-by: Jesse Weaver <jweaver@bywatersolutions.com>
This commit is contained in:
Kyle Hall 2015-03-18 08:50:21 -04:00 committed by Jesse Weaver
parent bd4a683052
commit 4a584d528d
3 changed files with 119 additions and 64 deletions

View file

@ -22,11 +22,13 @@ use Modern::Perl;
use Carp;
use C4::Context qw(preference);
use Koha::Branches;
use Koha::Biblios;
use Koha::Items;
use Koha::DateUtils qw(dt_from_string);
use Koha::Borrowers;
use Koha::Biblios;
use Koha::Branches;
use Koha::Items;
use base qw(Koha::Object);
=head1 NAME
@ -63,6 +65,20 @@ sub waiting_expires_on {
return $dt;
}
=head3 is_found
Returns true if hold is a waiting or in transit
=cut
sub is_found {
my ($self) = @_;
return 0 unless $self->found();
return 1 if $self->found() eq 'W';
return 1 if $self->found() eq 'T';
}
=head3 is_waiting
Returns true if hold is a waiting hold
@ -76,6 +92,19 @@ sub is_waiting {
return $found && $found eq 'W';
}
=head3 is_in_transit
Returns true if hold is a in_transit hold
=cut
sub is_in_transit {
my ($self) = @_;
return 0 unless $self->found();
return $self->found() eq 'T';
}
=head3 biblio
Returns the related Koha::Biblio object for this hold
@ -118,6 +147,20 @@ sub branch {
return $self->{_branch};
}
=head3 borrower
Returns the related Koha::Borrower object for this Hold
=cut
sub borrower {
my ($self) = @_;
$self->{_borrower} ||= Koha::Borrowers->find( $self->borrowernumber() );
return $self->{_borrower};
}
=head3 type
=cut

View file

@ -742,12 +742,18 @@ function checkMultiHold() {
</td>
<td>[% reserveloo.notes %]</td>
<td>[% reserveloo.date %]</td>
<td>[% reserveloo.expirationdate %]</td>
<td>
[% IF reserveloo.waiting_until %]
[% reserveloo.waiting_until | $KohaDates %]
[% ELSE %]
[% reserveloo.expirationdate %]
[% END %]
</td>
<td>
[% IF ( reserveloo.wait ) %]
[% IF ( reserveloo.atdestination ) %]
[% IF ( reserveloo.found ) %]
Item waiting at <b> [% reserveloo.wbrname %]</b> <input type="hidden" name="pickup" value="[% reserveloo.wbrcode %]" />
Item waiting at <b> [% reserveloo.wbrname %]</b> <input type="hidden" name="pickup" value="[% reserveloo.wbrcode %]" /> since [% reserveloo.waiting_date | $KohaDates %]
[% ELSE %]
Waiting to be pulled <input type="hidden" name="pickup" value="[% reserveloo.wbrcode %]" />
[% END %]

View file

@ -45,6 +45,7 @@ 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;
@ -486,85 +487,90 @@ foreach my $biblionumber (@biblionumbers) {
# 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'} = 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'} = $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{'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{'wait'} = $res->is_waiting();
$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 );