View | Details | Raw Unified | Return to bug 17737
Collapse All | Expand All

(-)a/Koha/Item.pm (+21 lines)
Lines 22-27 use Modern::Perl; Link Here
22
use Carp;
22
use Carp;
23
23
24
use Koha::Database;
24
use Koha::Database;
25
use Koha::DateUtils qw( dt_from_string );
25
26
26
use C4::Context;
27
use C4::Context;
27
use Koha::IssuingRules;
28
use Koha::IssuingRules;
Lines 184-189 sub article_request_type { Link Here
184
    return $issuing_rule->article_requests || q{}
185
    return $issuing_rule->article_requests || q{}
185
}
186
}
186
187
188
=head3 holds_placed_before_today
189
190
=cut
191
192
sub holds_placed_before_today {
193
    my ( $self ) = @_;
194
    my $attributes = { order_by => 'priority' };
195
    my $dtf = Koha::Database->new->schema->storage->datetime_parser;
196
    my $params = {
197
        itemnumber => $self->itemnumber,
198
        suspend => 0,
199
        -or => [
200
            reservedate => { '<=' => $dtf->format_date(dt_from_string) },
201
            waitingdate => { '!=' => undef },
202
        ],
203
    };
204
    my $hold_rs = $self->_result->reserves->search( $params, $attributes );
205
    return Koha::Holds->_new_from_dbic($hold_rs);
206
}
207
187
=head3 type
208
=head3 type
188
209
189
=cut
210
=cut
(-)a/catalogue/detail.pl (-10 / +12 lines)
Lines 43-48 use C4::CourseReserves qw(GetItemCourseReservesInfo); Link Here
43
use C4::Acquisition qw(GetOrdersByBiblionumber);
43
use C4::Acquisition qw(GetOrdersByBiblionumber);
44
use Koha::AuthorisedValues;
44
use Koha::AuthorisedValues;
45
use Koha::Biblios;
45
use Koha::Biblios;
46
use Koha::Items;
46
use Koha::Patrons;
47
use Koha::Patrons;
47
use Koha::Virtualshelves;
48
use Koha::Virtualshelves;
48
49
Lines 251-274 foreach my $item (@items) { Link Here
251
        $itemfields{$_} = 1 if ( $item->{$_} );
252
        $itemfields{$_} = 1 if ( $item->{$_} );
252
    }
253
    }
253
254
254
    # checking for holds
255
    my ($reservedate,$reservedfor,$expectedAt,undef,$wait) = GetReservesFromItemnumber($item->{itemnumber});
256
    my $ItemBorrowerReserveInfo = C4::Members::GetMember( borrowernumber => $reservedfor);
257
    
258
    if (C4::Context->preference('HidePatronName')){
255
    if (C4::Context->preference('HidePatronName')){
259
	$item->{'hidepatronname'} = 1;
256
        $item->{'hidepatronname'} = 1;
260
    }
257
    }
261
258
262
    if ( defined $reservedate ) {
259
260
    # checking for holds
261
    my $item_object = Koha::Items->find( $item->{itemnumber} );
262
    my $holds = $item_object->holds_placed_before_today;
263
    if ( my $first_hold = $holds->next ) {
264
        my $ItemBorrowerReserveInfo = C4::Members::GetMember( borrowernumber => $first_hold->borrowernumber); # FIXME could be improved
263
        $item->{backgroundcolor} = 'reserved';
265
        $item->{backgroundcolor} = 'reserved';
264
        $item->{reservedate}     = $reservedate;
266
        $item->{reservedate}     = $first_hold->reservedate;
265
        $item->{ReservedForBorrowernumber}     = $reservedfor;
267
        $item->{ReservedForBorrowernumber}     = $first_hold->borrowernumber;
266
        $item->{ReservedForSurname}     = $ItemBorrowerReserveInfo->{'surname'};
268
        $item->{ReservedForSurname}     = $ItemBorrowerReserveInfo->{'surname'};
267
        $item->{ReservedForFirstname}   = $ItemBorrowerReserveInfo->{'firstname'};
269
        $item->{ReservedForFirstname}   = $ItemBorrowerReserveInfo->{'firstname'};
268
        $item->{ExpectedAtLibrary}      = $expectedAt;
270
        $item->{ExpectedAtLibrary}      = $first_hold->branchcode;
269
        $item->{Reservedcardnumber}             = $ItemBorrowerReserveInfo->{'cardnumber'};
271
        $item->{Reservedcardnumber}             = $ItemBorrowerReserveInfo->{'cardnumber'};
270
        # Check waiting status
272
        # Check waiting status
271
        $item->{waitingdate} = $wait;
273
        $item->{waitingdate} = $first_hold->waitingdate;
272
    }
274
    }
273
275
274
276
(-)a/circ/transferstoreceive.pl (-3 / +5 lines)
Lines 35-40 use Date::Calc qw( Link Here
35
35
36
use C4::Koha;
36
use C4::Koha;
37
use C4::Reserves;
37
use C4::Reserves;
38
use Koha::Items;
38
use Koha::Libraries;
39
use Koha::Libraries;
39
use Koha::DateUtils;
40
use Koha::DateUtils;
40
use Koha::BiblioFrameworks;
41
use Koha::BiblioFrameworks;
Lines 100-108 while ( my $library = $libraries->next ) { Link Here
100
            $getransf{'subtitle'} = GetRecordValue('subtitle', $record, GetFrameworkCode($gettitle->{'biblionumber'}));
101
            $getransf{'subtitle'} = GetRecordValue('subtitle', $record, GetFrameworkCode($gettitle->{'biblionumber'}));
101
102
102
            # we check if we have a reserv for this transfer
103
            # we check if we have a reserv for this transfer
103
            my @checkreserv = GetReservesFromItemnumber($num->{'itemnumber'});
104
            my $item = Koha::Items->find( $num->{itemnumber} );
104
            if ( $checkreserv[0] ) {
105
            my $holds = $item->holds_placed_before_today;
105
                my $getborrower = C4::Members::GetMember( borrowernumber => $checkreserv[1] );
106
            if ( my $first_hold = $holds->next ) {
107
                my $getborrower = C4::Members::GetMember( borrowernumber => $first_hold->borrowernumber );
106
                $getransf{'borrowernum'}       = $getborrower->{'borrowernumber'};
108
                $getransf{'borrowernum'}       = $getborrower->{'borrowernumber'};
107
                $getransf{'borrowername'}      = $getborrower->{'surname'};
109
                $getransf{'borrowername'}      = $getborrower->{'surname'};
108
                $getransf{'borrowerfirstname'} = $getborrower->{'firstname'};
110
                $getransf{'borrowerfirstname'} = $getborrower->{'firstname'};
(-)a/opac/opac-reserve.pl (-9 / +10 lines)
Lines 34-39 use C4::Overdues; Link Here
34
use C4::Debug;
34
use C4::Debug;
35
use Koha::AuthorisedValues;
35
use Koha::AuthorisedValues;
36
use Koha::DateUtils;
36
use Koha::DateUtils;
37
use Koha::Items;
37
use Koha::Libraries;
38
use Koha::Libraries;
38
use Koha::Patrons;
39
use Koha::Patrons;
39
use Date::Calc qw/Today Date_to_Days/;
40
use Date::Calc qw/Today Date_to_Days/;
Lines 470-490 foreach my $biblioNum (@biblionumbers) { Link Here
470
        }
471
        }
471
472
472
        # checking reserve
473
        # checking reserve
473
        my ($reservedate,$reservedfor,$expectedAt,undef,$wait) = GetReservesFromItemnumber($itemNum);
474
        my $item = Koha::Items->find( $itemNum );
474
        my $ItemBorrowerReserveInfo = GetMember( borrowernumber => $reservedfor );
475
        my $holds = $item->holds_placed_before_today;
475
476
476
        # the item could be reserved for this borrower vi a host record, flag this
477
        # the item could be reserved for this borrower vi a host record, flag this
477
        $reservedfor //= '';
478
        my $reservedfor = q||;
478
479
479
        if ( defined $reservedate ) {
480
        if ( my $first_hold = $holds->next ) {
481
            my $ItemBorrowerReserveInfo = GetMember( borrowernumber => $first_hold->borrowernumber );
480
            $itemLoopIter->{backgroundcolor} = 'reserved';
482
            $itemLoopIter->{backgroundcolor} = 'reserved';
481
            $itemLoopIter->{reservedate}     = output_pref({ dt => dt_from_string($reservedate), dateonly => 1 });
483
            $itemLoopIter->{reservedate}     = output_pref({ dt => dt_from_string($first_hold->reservedate), dateonly => 1 }); # FIXME Should be formatted in the template
482
            $itemLoopIter->{ReservedForBorrowernumber} = $reservedfor;
484
            $itemLoopIter->{ReservedForBorrowernumber} = $first_hold->borrowernumber;
483
            $itemLoopIter->{ReservedForSurname}        = $ItemBorrowerReserveInfo->{'surname'};
485
            $itemLoopIter->{ReservedForSurname}        = $ItemBorrowerReserveInfo->{'surname'};
484
            $itemLoopIter->{ReservedForFirstname}      = $ItemBorrowerReserveInfo->{'firstname'};
486
            $itemLoopIter->{ReservedForFirstname}      = $ItemBorrowerReserveInfo->{'firstname'};
485
            $itemLoopIter->{ExpectedAtLibrary}         = $expectedAt;
487
            $itemLoopIter->{ExpectedAtLibrary}         = $first_hold->branchcode;
486
            #waiting status
488
            $itemLoopIter->{waitingdate} = $first_hold->waitingdate;
487
            $itemLoopIter->{waitingdate} = $wait;
488
        }
489
        }
489
490
490
        $itemLoopIter->{notforloan} = $itemInfo->{notforloan};
491
        $itemLoopIter->{notforloan} = $itemInfo->{notforloan};
(-)a/reserve/request.pl (-7 / +8 lines)
Lines 44-49 use C4::Members; Link Here
44
use C4::Search;		# enabled_staff_search_views
44
use C4::Search;		# enabled_staff_search_views
45
use Koha::DateUtils;
45
use Koha::DateUtils;
46
use Koha::Holds;
46
use Koha::Holds;
47
use Koha::Items;
47
use Koha::Libraries;
48
use Koha::Libraries;
48
use Koha::Patrons;
49
use Koha::Patrons;
49
50
Lines 388-404 foreach my $biblionumber (@biblionumbers) { Link Here
388
            }
389
            }
389
390
390
            # checking reserve
391
            # checking reserve
391
            my ($reservedate,$reservedfor,$expectedAt,$reserve_id,$wait) = GetReservesFromItemnumber($itemnumber);
392
            my $holds = Koha::Items->find( $itemnumber )->holds_placed_before_today;
392
            if ( defined $reservedate ) {
393
            if ( my $first_hold = $holds->next ) {
393
                my $ItemBorrowerReserveInfo = GetMember( borrowernumber => $reservedfor );
394
                my $ItemBorrowerReserveInfo = GetMember( borrowernumber => $first_hold->borrowernumber );
394
395
395
                $item->{backgroundcolor} = 'reserved';
396
                $item->{backgroundcolor} = 'reserved';
396
                $item->{reservedate}     = output_pref({ dt => dt_from_string( $reservedate ), dateonly => 1 });
397
                $item->{reservedate}     = output_pref({ dt => dt_from_string( $first_hold->reservedate ), dateonly => 1 }); # FIXME Should be formatted in the template
397
                $item->{ReservedForBorrowernumber}     = $reservedfor;
398
                $item->{ReservedForBorrowernumber}     = $first_hold->borrowernumber;
398
                $item->{ReservedForSurname}     = $ItemBorrowerReserveInfo->{'surname'};
399
                $item->{ReservedForSurname}     = $ItemBorrowerReserveInfo->{'surname'};
399
                $item->{ReservedForFirstname}     = $ItemBorrowerReserveInfo->{'firstname'};
400
                $item->{ReservedForFirstname}     = $ItemBorrowerReserveInfo->{'firstname'};
400
                $item->{ExpectedAtLibrary}     = $expectedAt;
401
                $item->{ExpectedAtLibrary}     = $first_hold->branchcode;
401
                $item->{waitingdate} = $wait;
402
                $item->{waitingdate} = $first_hold->waitingdate;
402
            }
403
            }
403
404
404
            # Management of the notforloan document
405
            # Management of the notforloan document
(-)a/t/db_dependent/Holds.t (-6 / +16 lines)
Lines 94-104 is( $holds->next->priority, 3, "Reserve 3 has a priority of 3" ); Link Here
94
is( $holds->next->priority, 4, "Reserve 4 has a priority of 4" );
94
is( $holds->next->priority, 4, "Reserve 4 has a priority of 4" );
95
is( $holds->next->priority, 5, "Reserve 5 has a priority of 5" );
95
is( $holds->next->priority, 5, "Reserve 5 has a priority of 5" );
96
96
97
my ( $reservedate, $borrowernumber, $branch_1code, $reserve_id ) = GetReservesFromItemnumber($itemnumber);
97
my $item = Koha::Items->find( $itemnumber );
98
is( $reservedate, output_pref({ dt => dt_from_string, dateformat => 'iso', dateonly => 1 }), "GetReservesFromItemnumber should return a valid reserve date");
98
$holds = $item->holds_placed_before_today;
99
is( $borrowernumber, $borrowernumbers[0], "GetReservesFromItemnumber should return a valid borrowernumber");
99
my $first_hold = $holds->next;
100
is( $branch_1code, $branch_1, "GetReservesFromItemnumber should return a valid branchcode");
100
my $reservedate = $first_hold->reservedate;
101
ok($reserve_id, "Test GetReservesFromItemnumber()");
101
my $borrowernumber = $first_hold->borrowernumber;
102
my $branch_1code = $first_hold->branchcode;
103
my $reserve_id = $first_hold->reserve_id;
104
is( $reservedate, output_pref({ dt => dt_from_string, dateformat => 'iso', dateonly => 1 }), "holds_placed_today should return a valid reserve date");
105
is( $borrowernumber, $borrowernumbers[0], "holds_placed_today should return a valid borrowernumber");
106
is( $branch_1code, $branch_1, "holds_placed_today should return a valid branchcode");
107
ok($reserve_id, "Test holds_placed_today()");
102
108
103
my $hold = Koha::Holds->find( $reserve_id );
109
my $hold = Koha::Holds->find( $reserve_id );
104
ok( $hold, "Koha::Holds found the hold" );
110
ok( $hold, "Koha::Holds found the hold" );
Lines 126-133 CancelReserve({ 'reserve_id' => $reserve_id }); Link Here
126
$holds = $biblio->holds;
132
$holds = $biblio->holds;
127
is( $holds->count, $borrowers_count - 1, "Test CancelReserve()" );
133
is( $holds->count, $borrowers_count - 1, "Test CancelReserve()" );
128
134
135
$holds = $item->holds_placed_before_today;
136
$first_hold = $holds->next;
137
$borrowernumber = $first_hold->borrowernumber;
138
$branch_1code = $first_hold->branchcode;
139
$reserve_id = $first_hold->reserve_id;
129
140
130
( $reservedate, $borrowernumber, $branch_1code, $reserve_id ) = GetReservesFromItemnumber($itemnumber);
131
ModReserve({
141
ModReserve({
132
    reserve_id    => $reserve_id,
142
    reserve_id    => $reserve_id,
133
    rank          => '4',
143
    rank          => '4',
(-)a/t/db_dependent/Reserves.t (-12 / +14 lines)
Lines 404-411 is( Link Here
404
my $letter = ReserveSlip($branch_1, $requesters{$branch_1}, $bibnum);
404
my $letter = ReserveSlip($branch_1, $requesters{$branch_1}, $bibnum);
405
ok(defined($letter), 'can successfully generate hold slip (bug 10949)');
405
ok(defined($letter), 'can successfully generate hold slip (bug 10949)');
406
406
407
# Tests for bug 9788: Does GetReservesFromItemnumber return a future wait?
407
# Tests for bug 9788: Does Koha::Item->holds_placed_before_today return a future wait?
408
# 9788a: GetReservesFromItemnumber does not return future next available hold
408
# 9788a: holds_placed_before_today does not return future next available hold
409
$dbh->do("DELETE FROM reserves WHERE biblionumber=?",undef,($bibnum));
409
$dbh->do("DELETE FROM reserves WHERE biblionumber=?",undef,($bibnum));
410
t::lib::Mocks::mock_preference('ConfirmFutureHolds', 2);
410
t::lib::Mocks::mock_preference('ConfirmFutureHolds', 2);
411
t::lib::Mocks::mock_preference('AllowHoldDateInFuture', 1);
411
t::lib::Mocks::mock_preference('AllowHoldDateInFuture', 1);
Lines 415-433 $resdate=output_pref($resdate); Link Here
415
AddReserve($branch_1,  $requesters{$branch_1}, $bibnum,
415
AddReserve($branch_1,  $requesters{$branch_1}, $bibnum,
416
           $bibitems,  1, $resdate, $expdate, $notes,
416
           $bibitems,  1, $resdate, $expdate, $notes,
417
           $title,      $checkitem, $found);
417
           $title,      $checkitem, $found);
418
my @results= GetReservesFromItemnumber($itemnumber);
418
my $item = Koha::Items->find( $itemnumber );
419
is(defined $results[3]?1:0, 0, 'GetReservesFromItemnumber does not return a future next available hold');
419
$holds = $item->holds_placed_before_today;
420
# 9788b: GetReservesFromItemnumber does not return future item level hold
420
my $dtf = Koha::Database->new->schema->storage->datetime_parser;
421
my $future_holds = $holds->search({ reservedate => { '>' => $dtf->format_date( dt_from_string ) } } );
422
is( $future_holds->count, 0, 'holds_placed_before_today does not return a future next available hold');
423
# 9788b: holds_placed_before_today does not return future item level hold
421
$dbh->do("DELETE FROM reserves WHERE biblionumber=?",undef,($bibnum));
424
$dbh->do("DELETE FROM reserves WHERE biblionumber=?",undef,($bibnum));
422
AddReserve($branch_1,  $requesters{$branch_1}, $bibnum,
425
AddReserve($branch_1,  $requesters{$branch_1}, $bibnum,
423
           $bibitems,  1, $resdate, $expdate, $notes,
426
           $bibitems,  1, $resdate, $expdate, $notes,
424
           $title,      $itemnumber, $found); #item level hold
427
           $title,      $itemnumber, $found); #item level hold
425
@results= GetReservesFromItemnumber($itemnumber);
428
$future_holds = $holds->search({ reservedate => { '>' => $dtf->format_date( dt_from_string ) } } );
426
is(defined $results[3]?1:0, 0, 'GetReservesFromItemnumber does not return a future item level hold');
429
is( $future_holds->count, 0, 'holds_placed_before_today does not return a future item level hold' );
427
# 9788c: GetReservesFromItemnumber returns future wait (confirmed future hold)
430
# 9788c: holds_placed_before_today returns future wait (confirmed future hold)
428
ModReserveAffect( $itemnumber,  $requesters{$branch_1} , 0); #confirm hold
431
ModReserveAffect( $itemnumber,  $requesters{$branch_1} , 0); #confirm hold
429
@results= GetReservesFromItemnumber($itemnumber);
432
$future_holds = $holds->search({ reservedate => { '>' => $dtf->format_date( dt_from_string ) } } );
430
is(defined $results[3]?1:0, 1, 'GetReservesFromItemnumber returns a future wait (confirmed future hold)');
433
is( $future_holds->count, 1, 'holds_placed_before_today returns a future wait (confirmed future hold)' );
431
# End of tests for bug 9788
434
# End of tests for bug 9788
432
435
433
$dbh->do("DELETE FROM reserves WHERE biblionumber=?",undef,($bibnum));
436
$dbh->do("DELETE FROM reserves WHERE biblionumber=?",undef,($bibnum));
Lines 547-553 is( C4::Reserves::CanBookBeReserved($borrowernumber, $biblionumber) , 'OK', "Res Link Here
547
####### EO Bug 13113 <<<
550
####### EO Bug 13113 <<<
548
       ####
551
       ####
549
552
550
my $item = GetItem($itemnumber);
553
$item = GetItem($itemnumber);
551
554
552
ok( C4::Reserves::IsAvailableForItemLevelRequest($item, $borrower), "Reserving a book on item level" );
555
ok( C4::Reserves::IsAvailableForItemLevelRequest($item, $borrower), "Reserving a book on item level" );
553
556
554
- 

Return to bug 17737