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 170-175 sub article_request_type { Link Here
170
    return $issuing_rule->article_requests || q{}
171
    return $issuing_rule->article_requests || q{}
171
}
172
}
172
173
174
=head3 holds_placed_before_today
175
176
=cut
177
178
sub holds_placed_before_today {
179
    my ( $self ) = @_;
180
    my $attributes = { order_by => 'priority' };
181
    my $dtf = Koha::Database->new->schema->storage->datetime_parser;
182
    my $params = {
183
        itemnumber => $self->itemnumber,
184
        suspend => 0,
185
        -or => [
186
            reservedate => { '<=' => $dtf->format_date(dt_from_string) },
187
            waitingdate => { '!=' => undef },
188
        ],
189
    };
190
    my $hold_rs = $self->_result->reserves->search( $params, $attributes );
191
    return Koha::Holds->_new_from_dbic($hold_rs);
192
}
193
173
=head3 type
194
=head3 type
174
195
175
=cut
196
=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 36-41 use Date::Calc qw( Link Here
36
36
37
use C4::Koha;
37
use C4::Koha;
38
use C4::Reserves;
38
use C4::Reserves;
39
use Koha::Items;
39
use Koha::Libraries;
40
use Koha::Libraries;
40
41
41
my $input = new CGI;
42
my $input = new CGI;
Lines 99-107 while ( my $library = $libraries->next ) { Link Here
99
            $getransf{'subtitle'} = GetRecordValue('subtitle', $record, GetFrameworkCode($gettitle->{'biblionumber'}));
100
            $getransf{'subtitle'} = GetRecordValue('subtitle', $record, GetFrameworkCode($gettitle->{'biblionumber'}));
100
101
101
            # we check if we have a reserv for this transfer
102
            # we check if we have a reserv for this transfer
102
            my @checkreserv = GetReservesFromItemnumber($num->{'itemnumber'});
103
            my $item = Koha::Items->find( $num->{itemnumber} );
103
            if ( $checkreserv[0] ) {
104
            my $holds = $item->holds_placed_before_today;
104
                my $getborrower = C4::Members::GetMember( borrowernumber => $checkreserv[1] );
105
            if ( my $first_hold = $holds->next ) {
106
                my $getborrower = C4::Members::GetMember( borrowernumber => $first_hold->borrowernumber );
105
                $getransf{'borrowernum'}       = $getborrower->{'borrowernumber'};
107
                $getransf{'borrowernum'}       = $getborrower->{'borrowernumber'};
106
                $getransf{'borrowername'}      = $getborrower->{'surname'};
108
                $getransf{'borrowername'}      = $getborrower->{'surname'};
107
                $getransf{'borrowerfirstname'} = $getborrower->{'firstname'};
109
                $getransf{'borrowerfirstname'} = $getborrower->{'firstname'};
(-)a/opac/opac-reserve.pl (-9 / +10 lines)
Lines 33-38 use C4::Members; Link Here
33
use C4::Overdues;
33
use C4::Overdues;
34
use C4::Debug;
34
use C4::Debug;
35
use Koha::DateUtils;
35
use Koha::DateUtils;
36
use Koha::Items;
36
use Koha::Libraries;
37
use Koha::Libraries;
37
use Koha::Patrons;
38
use Koha::Patrons;
38
use Date::Calc qw/Today Date_to_Days/;
39
use Date::Calc qw/Today Date_to_Days/;
Lines 448-468 foreach my $biblioNum (@biblionumbers) { Link Here
448
        }
449
        }
449
450
450
        # checking reserve
451
        # checking reserve
451
        my ($reservedate,$reservedfor,$expectedAt,undef,$wait) = GetReservesFromItemnumber($itemNum);
452
        my $item = Koha::Items->find( $itemNum );
452
        my $ItemBorrowerReserveInfo = GetMember( borrowernumber => $reservedfor );
453
        my $holds = $item->holds_placed_before_today;
453
454
454
        # the item could be reserved for this borrower vi a host record, flag this
455
        # the item could be reserved for this borrower vi a host record, flag this
455
        $reservedfor //= '';
456
        my $reservedfor = q||;
456
457
457
        if ( defined $reservedate ) {
458
        if ( my $first_hold = $holds->next ) {
459
            my $ItemBorrowerReserveInfo = GetMember( borrowernumber => $first_hold->borrowernumber );
458
            $itemLoopIter->{backgroundcolor} = 'reserved';
460
            $itemLoopIter->{backgroundcolor} = 'reserved';
459
            $itemLoopIter->{reservedate}     = output_pref({ dt => dt_from_string($reservedate), dateonly => 1 });
461
            $itemLoopIter->{reservedate}     = output_pref({ dt => dt_from_string($first_hold->reservedate), dateonly => 1 }); # FIXME Should be formatted in the template
460
            $itemLoopIter->{ReservedForBorrowernumber} = $reservedfor;
462
            $itemLoopIter->{ReservedForBorrowernumber} = $first_hold->borrowernumber;
461
            $itemLoopIter->{ReservedForSurname}        = $ItemBorrowerReserveInfo->{'surname'};
463
            $itemLoopIter->{ReservedForSurname}        = $ItemBorrowerReserveInfo->{'surname'};
462
            $itemLoopIter->{ReservedForFirstname}      = $ItemBorrowerReserveInfo->{'firstname'};
464
            $itemLoopIter->{ReservedForFirstname}      = $ItemBorrowerReserveInfo->{'firstname'};
463
            $itemLoopIter->{ExpectedAtLibrary}         = $expectedAt;
465
            $itemLoopIter->{ExpectedAtLibrary}         = $first_hold->branchcode;
464
            #waiting status
466
            $itemLoopIter->{waitingdate} = $first_hold->waitingdate;
465
            $itemLoopIter->{waitingdate} = $wait;
466
        }
467
        }
467
468
468
        $itemLoopIter->{notforloan} = $itemInfo->{notforloan};
469
        $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 386-402 foreach my $biblionumber (@biblionumbers) { Link Here
386
            }
387
            }
387
388
388
            # checking reserve
389
            # checking reserve
389
            my ($reservedate,$reservedfor,$expectedAt,$reserve_id,$wait) = GetReservesFromItemnumber($itemnumber);
390
            my $holds = Koha::Items->find( $itemnumber )->holds_placed_before_today;
390
            if ( defined $reservedate ) {
391
            if ( my $first_hold = $holds->next ) {
391
                my $ItemBorrowerReserveInfo = GetMember( borrowernumber => $reservedfor );
392
                my $ItemBorrowerReserveInfo = GetMember( borrowernumber => $first_hold->borrowernumber );
392
393
393
                $item->{backgroundcolor} = 'reserved';
394
                $item->{backgroundcolor} = 'reserved';
394
                $item->{reservedate}     = output_pref({ dt => dt_from_string( $reservedate ), dateonly => 1 });
395
                $item->{reservedate}     = output_pref({ dt => dt_from_string( $first_hold->reservedate ), dateonly => 1 }); # FIXME Should be formatted in the template
395
                $item->{ReservedForBorrowernumber}     = $reservedfor;
396
                $item->{ReservedForBorrowernumber}     = $first_hold->borrowernumber;
396
                $item->{ReservedForSurname}     = $ItemBorrowerReserveInfo->{'surname'};
397
                $item->{ReservedForSurname}     = $ItemBorrowerReserveInfo->{'surname'};
397
                $item->{ReservedForFirstname}     = $ItemBorrowerReserveInfo->{'firstname'};
398
                $item->{ReservedForFirstname}     = $ItemBorrowerReserveInfo->{'firstname'};
398
                $item->{ExpectedAtLibrary}     = $expectedAt;
399
                $item->{ExpectedAtLibrary}     = $first_hold->branchcode;
399
                $item->{waitingdate} = $wait;
400
                $item->{waitingdate} = $first_hold->waitingdate;
400
            }
401
            }
401
402
402
            # Management of the notforloan document
403
            # 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 396-403 is( Link Here
396
my $letter = ReserveSlip($branch_1, $requesters{$branch_1}, $bibnum);
396
my $letter = ReserveSlip($branch_1, $requesters{$branch_1}, $bibnum);
397
ok(defined($letter), 'can successfully generate hold slip (bug 10949)');
397
ok(defined($letter), 'can successfully generate hold slip (bug 10949)');
398
398
399
# Tests for bug 9788: Does GetReservesFromItemnumber return a future wait?
399
# Tests for bug 9788: Does Koha::Item->holds_placed_before_today return a future wait?
400
# 9788a: GetReservesFromItemnumber does not return future next available hold
400
# 9788a: holds_placed_before_today does not return future next available hold
401
$dbh->do("DELETE FROM reserves WHERE biblionumber=?",undef,($bibnum));
401
$dbh->do("DELETE FROM reserves WHERE biblionumber=?",undef,($bibnum));
402
t::lib::Mocks::mock_preference('ConfirmFutureHolds', 2);
402
t::lib::Mocks::mock_preference('ConfirmFutureHolds', 2);
403
t::lib::Mocks::mock_preference('AllowHoldDateInFuture', 1);
403
t::lib::Mocks::mock_preference('AllowHoldDateInFuture', 1);
Lines 407-425 $resdate=output_pref($resdate); Link Here
407
AddReserve($branch_1,  $requesters{$branch_1}, $bibnum,
407
AddReserve($branch_1,  $requesters{$branch_1}, $bibnum,
408
           $bibitems,  1, $resdate, $expdate, $notes,
408
           $bibitems,  1, $resdate, $expdate, $notes,
409
           $title,      $checkitem, $found);
409
           $title,      $checkitem, $found);
410
my @results= GetReservesFromItemnumber($itemnumber);
410
my $item = Koha::Items->find( $itemnumber );
411
is(defined $results[3]?1:0, 0, 'GetReservesFromItemnumber does not return a future next available hold');
411
$holds = $item->holds_placed_before_today;
412
# 9788b: GetReservesFromItemnumber does not return future item level hold
412
my $dtf = Koha::Database->new->schema->storage->datetime_parser;
413
my $future_holds = $holds->search({ reservedate => { '>' => $dtf->format_date( dt_from_string ) } } );
414
is( $future_holds->count, 0, 'holds_placed_before_today does not return a future next available hold');
415
# 9788b: holds_placed_before_today does not return future item level hold
413
$dbh->do("DELETE FROM reserves WHERE biblionumber=?",undef,($bibnum));
416
$dbh->do("DELETE FROM reserves WHERE biblionumber=?",undef,($bibnum));
414
AddReserve($branch_1,  $requesters{$branch_1}, $bibnum,
417
AddReserve($branch_1,  $requesters{$branch_1}, $bibnum,
415
           $bibitems,  1, $resdate, $expdate, $notes,
418
           $bibitems,  1, $resdate, $expdate, $notes,
416
           $title,      $itemnumber, $found); #item level hold
419
           $title,      $itemnumber, $found); #item level hold
417
@results= GetReservesFromItemnumber($itemnumber);
420
$future_holds = $holds->search({ reservedate => { '>' => $dtf->format_date( dt_from_string ) } } );
418
is(defined $results[3]?1:0, 0, 'GetReservesFromItemnumber does not return a future item level hold');
421
is( $future_holds->count, 0, 'holds_placed_before_today does not return a future item level hold' );
419
# 9788c: GetReservesFromItemnumber returns future wait (confirmed future hold)
422
# 9788c: holds_placed_before_today returns future wait (confirmed future hold)
420
ModReserveAffect( $itemnumber,  $requesters{$branch_1} , 0); #confirm hold
423
ModReserveAffect( $itemnumber,  $requesters{$branch_1} , 0); #confirm hold
421
@results= GetReservesFromItemnumber($itemnumber);
424
$future_holds = $holds->search({ reservedate => { '>' => $dtf->format_date( dt_from_string ) } } );
422
is(defined $results[3]?1:0, 1, 'GetReservesFromItemnumber returns a future wait (confirmed future hold)');
425
is( $future_holds->count, 1, 'holds_placed_before_today returns a future wait (confirmed future hold)' );
423
# End of tests for bug 9788
426
# End of tests for bug 9788
424
427
425
$dbh->do("DELETE FROM reserves WHERE biblionumber=?",undef,($bibnum));
428
$dbh->do("DELETE FROM reserves WHERE biblionumber=?",undef,($bibnum));
Lines 539-545 is( C4::Reserves::CanBookBeReserved($borrowernumber, $biblionumber) , 'OK', "Res Link Here
539
####### EO Bug 13113 <<<
542
####### EO Bug 13113 <<<
540
       ####
543
       ####
541
544
542
my $item = GetItem($itemnumber);
545
$item = GetItem($itemnumber);
543
546
544
ok( C4::Reserves::IsAvailableForItemLevelRequest($item, $borrower), "Reserving a book on item level" );
547
ok( C4::Reserves::IsAvailableForItemLevelRequest($item, $borrower), "Reserving a book on item level" );
545
548
546
- 

Return to bug 17737