use Koha::Acquisition::Currencies;
use Koha::Biblio::Metadata;
use Koha::Biblio::Metadatas;
+use Koha::Holds;
use Koha::SearchEngine;
use Koha::Libraries;
}
# We delete any existing holds
+ my $biblio = Koha::Biblios->find( $biblionumber );
+ my $holds = $biblio->holds;
require C4::Reserves;
- my $reserves = C4::Reserves::GetReservesFromBiblionumber({ biblionumber => $biblionumber });
- foreach my $res ( @$reserves ) {
- C4::Reserves::CancelReserve({ reserve_id => $res->{'reserve_id'} });
+ while ( my $hold = $holds->next ) {
+ C4::Reserves::CancelReserve({ reserve_id => $hold->reserve_id }); # TODO Replace with $hold->cancel
}
# Delete in Zebra. Be careful NOT to move this line after _koha_delete_biblio
use C4::Circulation;
use C4::Accounts;
use C4::Biblio;
-use C4::Reserves qw(AddReserve GetReservesFromBiblionumber GetReservesFromBorrowernumber CanBookBeReserved CanItemBeReserved IsAvailableForItemLevelRequest);
+use C4::Reserves qw(AddReserve GetReservesFromBorrowernumber CanBookBeReserved CanItemBeReserved IsAvailableForItemLevelRequest);
use C4::Context;
use C4::AuthoritiesMarc;
use XML::Simple;
use C4::Auth;
use C4::Members::Attributes qw(GetBorrowerAttributes);
+use Koha::Biblios;
use Koha::Libraries;
=head1 NAME
# Get most of the needed data
my $biblioitemnumber = $biblioitem->{'biblioitemnumber'};
- my $reserves = GetReservesFromBiblionumber({ biblionumber => $biblionumber });
+ my $biblio = Koha::Biblios->find( $biblionumber );
+ my $holds = $biblio->holds_placed_before_today->unblessed;
my $issues = GetBiblioIssues($biblionumber);
my $items = GetItemsByBiblioitemnumber($biblioitemnumber);
# Hashref building...
$biblioitem->{'items'}->{'item'} = $items;
- $biblioitem->{'reserves'}->{'reserve'} = $reserves;
+ $biblioitem->{'reserves'}->{'reserve'} = $holds;
$biblioitem->{'issues'}->{'issue'} = $issues;
push @records, $biblioitem;
use C4::Members;
use C4::Reserves;
use Koha::Database;
+use Koha::Biblios;
=encoding UTF-8
);
=cut
-sub priority_sort {
- defined $a->{priority} or return -1;
- defined $b->{priority} or return 1;
- return $a->{priority} <=> $b->{priority};
-}
-
sub new {
my ($class, $item_id) = @_;
my $type = ref($class) || $class;
}
my $borrower = GetMember(borrowernumber=>$issue->{'borrowernumber'});
$item->{patron} = $borrower->{'cardnumber'};
- my $reserves = GetReservesFromBiblionumber({ biblionumber => $item->{biblionumber} });
- $item->{hold_queue} = [ sort priority_sort @$reserves ];
+ my $biblio = Koha::Biblios->find( $item->{biblionumber } );
+ my $holds = $biblio->holds_placed_before_today->unblessed;
+ $item->{hold_queue} = $holds;
$item->{hold_shelf} = [( grep { defined $_->{found} and $_->{found} eq 'W' } @{$item->{hold_queue}} )];
$item->{pending_queue} = [( grep {(! defined $_->{found}) or $_->{found} ne 'W' } @{$item->{hold_queue}} )];
$self = $item;
use CGI qw ( -utf8 );
use C4::Output;
use C4::Suggestions;
-use C4::Reserves qw/GetReservesFromBiblionumber/;
use Koha::Acquisition::Bookseller;
use Koha::Biblios;
use Koha::DateUtils;
+use Koha::Biblios;
use JSON;
$line{invoice} = $invoice->{invoicenumber};
$line{holds} = 0;
my @itemnumbers = GetItemnumbersFromOrder( $order->{ordernumber} );
- for my $itemnumber ( @itemnumbers ) {
- my $holds = GetReservesFromBiblionumber({ biblionumber => $line{biblionumber}, itemnumber => $itemnumber });
- $line{holds} += scalar( @$holds );
- }
+ my $biblio = Koha::Biblios->find( $order->{ordernumber} );
+ $line{holds} = $biblio->holds_placed_before_today->search(
+ {
+ itemnumber => { -in => \@itemnumbers },
+ }
+ )->count;
$line{budget} = GetBudgetByOrderNumber( $line{ordernumber} );
$line{tax_value} = $line{tax_value_on_receiving};
my $count_deletedorders_using_biblio = scalar @deletedorders_using_biblio ;
$template->param (countdeletedorders => $count_deletedorders_using_biblio);
-my $holds = C4::Reserves::GetReservesFromBiblionumber({ biblionumber => $biblionumber, all_dates => 1 });
-my $holdcount = scalar( @$holds );
-$template->param( holdcount => scalar ( @$holds ) );
+my $biblio = Koha::Biblios->find( $biblionumber );
+my $holds = $biblio->holds;
+$template->param( holdcount => $holds->count );
output_html_with_http_headers $query, $cookie, $template->output;
my $count_deletedorders_using_biblio = scalar @deletedorders_using_biblio ;
$template->param (countdeletedorders => $count_deletedorders_using_biblio);
-my $holds = C4::Reserves::GetReservesFromBiblionumber({ biblionumber => $biblionumber, all_dates => 1 });
-my $holdcount = scalar( @$holds );
-$template->param( holdcount => scalar ( @$holds ) );
+$biblio = Koha::Biblios->find( $biblionumber );
+my $holds = $biblio->holds;
+$template->param( holdcount => $holds->count );
output_html_with_http_headers $query, $cookie, $template->output;
use C4::CourseReserves qw(GetItemCourseReservesInfo);
use C4::Acquisition qw(GetOrdersByBiblionumber);
use Koha::AuthorisedValues;
+use Koha::Biblios;
use Koha::Patrons;
use Koha::Virtualshelves;
}
#we only need to pass the number of holds to the template
-my $holds = C4::Reserves::GetReservesFromBiblionumber({ biblionumber => $biblionumber, all_dates => 1 });
-$template->param( holdcount => scalar ( @$holds ) );
+my $biblio = Koha::Biblios->find( $biblionumber );
+my $holds = $biblio->holds;
+$template->param( holdcount => $holds->count );
my $StaffDetailItemSelection = C4::Context->preference('StaffDetailItemSelection');
if ($StaffDetailItemSelection) {
my $count_deletedorders_using_biblio = scalar @deletedorders_using_biblio ;
$template->param (countdeletedorders => $count_deletedorders_using_biblio);
-my $holds= C4::Reserves::GetReservesFromBiblionumber({ biblionumber => $biblionumber, all_dates => 1 });
-my $holdcount = scalar( @$holds );
-$template->param( holdcount => scalar ( @$holds ) );
+$biblio = Koha::Biblios->find( $biblionumber );
+my $holds = $biblio->holds;
+$template->param( holdcount => $holds->count );
output_html_with_http_headers $query, $cookie, $template->output;
my $count_deletedorders_using_biblio = scalar @deletedorders_using_biblio ;
$template->param (countdeletedorders => $count_deletedorders_using_biblio);
-my $holds= C4::Reserves::GetReservesFromBiblionumber({ biblionumber => $biblionumber, all_dates => 1 });
-my $holdcount = scalar( @$holds );
-$template->param( holdcount => scalar ( @$holds ) );
+$biblio = Koha::Biblios->find( $biblionumber );
+my $holds = $biblio->holds;
+$template->param( holdcount => $holds->count );
output_html_with_http_headers $query, $cookie, $template->output;
use C4::Serials;
use C4::Members; # to use GetMember
use C4::Search; # enabled_staff_search_views
-use C4::Reserves qw(GetReservesFromBiblionumber);
use Koha::Acquisition::Booksellers;
use Koha::AuthorisedValues;
+use Koha::Biblios;
use Koha::DateUtils;
use Koha::Items;
use Koha::Patrons;
my $count_deletedorders_using_biblio = scalar @deletedorders_using_biblio ;
$template->param (countdeletedorders => $count_deletedorders_using_biblio);
-my $holds = GetReservesFromBiblionumber({ biblionumber => $biblionumber, all_dates => 1 });
-my $holdcount = scalar( @$holds );
-$template->param( holdcount => scalar ( @$holds ) );
+my $biblio = Koha::Biblios->find( $biblionumber );
+my $holds = $biblio->holds;
+$template->param( holdcount => $holds->count );
output_html_with_http_headers $query, $cookie, $template->output;
<tbody>
[% FOR biblio IN records %]
<tr>
- <td><input type="checkbox" name="record_id" id="record_id_[% biblio.biblionumber %]" value="[% biblio.biblionumber %]" data-items="[% biblio.itemnumbers.size %]" data-issues="[% biblio.issues_count %]" data-reserves="[% biblio.reserves.size %]" /></td>
+ <td><input type="checkbox" name="record_id" id="record_id_[% biblio.biblionumber %]" value="[% biblio.biblionumber %]" data-items="[% biblio.itemnumbers.size %]" data-issues="[% biblio.issues_count %]" data-reserves="[% biblio.holds_count %]" /></td>
<td><label for="record_id_[% biblio.biblionumber %]">[% biblio.biblionumber %]</label></td>
<td>[% INCLUDE 'biblio-default-view.inc' biblionumber=biblio.biblionumber %][% biblio.title %][% IF ( biblio.subtitle ) %][% FOREACH subtitle IN biblio.subtitle %] [% subtitle.subfield |html %][% END %][% END %]</a></td>
<td><a href="/cgi-bin/koha/catalogue/moredetail.pl?biblionumber=[% biblio.biblionumber %]">[% biblio.itemnumbers.size %]</a></td>
- <td><a href="/cgi-bin/koha/reserve/request.pl?biblionumber=[% biblio.biblionumber %]">[% biblio.reserves.size %]</a></td>
+ <td><a href="/cgi-bin/koha/reserve/request.pl?biblionumber=[% biblio.biblionumber %]">[% biblio.holds_count %]</a></td>
<td><a href="/cgi-bin/koha/catalogue/issuehistory.pl?biblionumber=[% biblio.biblionumber %]">[% biblio.issues_count %]</a></td>
</tr>
[% END %]
use C4::CourseReserves qw(GetItemCourseReservesInfo);
use Koha::RecordProcessor;
use Koha::AuthorisedValues;
+use Koha::Biblios;
use Koha::Virtualshelves;
use Koha::Ratings;
use Koha::Reviews;
}
my $has_hold;
if ( $show_holds_count || $show_priority) {
- my $reserves = GetReservesFromBiblionumber({ biblionumber => $biblionumber, all_dates => 1 });
- $template->param( holds_count => scalar( @$reserves ) ) if $show_holds_count;
- foreach (@$reserves) {
- $item_reserves{ $_->{itemnumber} }++ if $_->{itemnumber};
- if ($show_priority && $_->{borrowernumber} == $borrowernumber) {
+ my $biblio = Koha::Biblios->find( $biblionumber );
+ my $holds = $biblio->holds;
+ $template->param( holds_count => $holds->count );
+ while ( my $hold = $holds->new ) {
+ $item_reserves{ $hold->itemnumber }++ if $hold->itemnumber;
+ if ($show_priority && $hold->borrowernumber == $borrowernumber) {
$has_hold = 1;
- $_->{itemnumber}
- ? ($priority{ $_->{itemnumber} } = $_->{priority})
- : ($template->param( priority => $_->{priority} ));
+ $hold->itemnumber
+ ? ($priority{ $hold->itemnumber } = $hold->priority)
+ : ($template->param( priority => $hold->priority ));
}
}
}
}
# Compute the priority rank.
- my $reserves = GetReservesFromBiblionumber({ biblionumber => $biblioNumber, all_dates => 1 });
- my $rank = scalar( @$reserves );
+ my $biblio = Koha::Biblios->find( $biblioNumber );
+ my $holds = $biblio->holds;
+ my $rank = $holds->count;
$biblioData->{reservecount} = 1; # new reserve
- foreach my $res (@{$reserves}) {
- my $found = $res->{found};
- if ( $found && $found eq 'W' ) {
+ while ( my $hold = $holds->next ) {
+ if ( $hold->is_waiting ) {
$rank--;
}
else {
use C4::Items;
use C4::Serials;
use URI::Escape;
+
+use Koha::Biblios;
use Koha::Libraries;
my $query = new CGI;
if($ok){
# get biblio information....
- my $biblio = $subs->{'biblionumber'};
- my ($count2,@bibitems) = GetBiblioItemByBiblioNumber($biblio);
+ my $biblionumber = $subs->{'biblionumber'};
+ my ($count2,@bibitems) = GetBiblioItemByBiblioNumber($biblionumber);
my @itemresults = GetItemsInfo( $subs->{biblionumber} );
my $branch = $itemresults[0]->{'holdingbranch'};
my $branchname = Koha::Libraries->find($branch)->branchname;
if (C4::Context->preference('RoutingListAddReserves')){
# get existing reserves .....
- my $reserves = GetReservesFromBiblionumber({ biblionumber => $biblio });
- my $count = scalar( @$reserves );
- my $totalcount = $count;
- foreach my $res (@$reserves) {
- if ($res->{'found'} eq 'W') {
- $count--;
- }
- }
+
+ my $biblio = Koha::Biblios->find( $biblionumber );
+ my $holds = $biblio->holds_placed_before_today;
+ my $count = $holds->count;
+ while ( my $hold = $holds->next ) {
+ $count-- if $hold->is_waiting;
+ }
my $notes;
my $title = $subs->{'bibliotitle'};
for my $routing ( @routinglist ) {
my $sth = $dbh->prepare('SELECT * FROM reserves WHERE biblionumber = ? AND borrowernumber = ? LIMIT 1');
- $sth->execute($biblio,$routing->{borrowernumber});
+ $sth->execute($biblionumber,$routing->{borrowernumber});
my $reserve = $sth->fetchrow_hashref;
if($routing->{borrowernumber} == $reserve->{borrowernumber}){
ModReserve({
rank => $routing->{ranking},
- biblionumber => $biblio,
+ biblionumber => $biblionumber,
borrowernumber => $routing->{borrowernumber},
branchcode => $branch
});
} else {
- AddReserve($branch,$routing->{borrowernumber},$biblio,\@bibitems,$routing->{ranking}, undef, undef, $notes,$title);
+ AddReserve($branch,$routing->{borrowernumber},$biblionumber,\@bibitems,$routing->{ranking}, undef, undef, $notes,$title);
}
}
}
use C4::Calendar;
use Koha::Database;
use Koha::DateUtils qw( dt_from_string output_pref );
+use Koha::Biblios;
use Koha::Holds;
BEGIN {
);
}
-my $reserves = GetReservesFromBiblionumber({ biblionumber => $biblionumber });
-is( scalar(@$reserves), $borrowers_count, "Test GetReserves()" );
-
-is( $reserves->[0]->{priority}, 1, "Reserve 1 has a priority of 1" );
-is( $reserves->[1]->{priority}, 2, "Reserve 2 has a priority of 2" );
-is( $reserves->[2]->{priority}, 3, "Reserve 3 has a priority of 3" );
-is( $reserves->[3]->{priority}, 4, "Reserve 4 has a priority of 4" );
-is( $reserves->[4]->{priority}, 5, "Reserve 5 has a priority of 5" );
+my $biblio = Koha::Biblios->find( $biblionumber );
+my $holds = $biblio->holds;
+is( $holds->count, $borrowers_count, 'Test GetReserves()' );
+is( $holds->next->priority, 1, "Reserve 1 has a priority of 1" );
+is( $holds->next->priority, 2, "Reserve 2 has a priority of 2" );
+is( $holds->next->priority, 3, "Reserve 3 has a priority of 3" );
+is( $holds->next->priority, 4, "Reserve 4 has a priority of 4" );
+is( $holds->next->priority, 5, "Reserve 5 has a priority of 5" );
my ( $reservedate, $borrowernumber, $branch_1code, $reserve_id ) = GetReservesFromItemnumber($itemnumber);
is( $reservedate, output_pref({ dt => dt_from_string, dateformat => 'iso', dateonly => 1 }), "GetReservesFromItemnumber should return a valid reserve date");
CancelReserve({ 'reserve_id' => $reserve_id });
-$reserves = GetReservesFromBiblionumber({ biblionumber => $biblionumber });
-is( scalar(@$reserves), $borrowers_count - 1, "Test CancelReserve()" );
+$holds = $biblio->holds;
+is( $holds->count, $borrowers_count - 1, "Test CancelReserve()" );
( $reservedate, $borrowernumber, $branch_1code, $reserve_id ) = GetReservesFromItemnumber($itemnumber);
ok( $reserve->{'reserve_id'} eq $reserve2->{'reserve_id'}, "Test GetReserveInfo()" );
-$reserves = GetReservesFromBiblionumber({ biblionumber => $biblionumber, all_dates => 1 });
-$reserve = $reserves->[1];
-AlterPriority( 'top', $reserve->{'reserve_id'} );
+$holds = $biblio->holds;
+my $hold = $holds->next;
+AlterPriority( 'top', $hold->reserve_id );
$reserve = GetReserve( $reserve->{'reserve_id'} );
is( $reserve->{'priority'}, '1', "Test AlterPriority(), move to top" );
my ( $sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst ) = localtime(time);
$year += 1900;
$mon += 1;
-$reserves = $dbh->selectall_arrayref('SELECT * FROM reserves', { Slice => {} });
+my $reserves = $dbh->selectall_arrayref('SELECT * FROM reserves', { Slice => {} });
$reserve = $reserves->[0];
my $calendar = C4::Calendar->new(branchcode => $reserve->{branchcode});
$calendar->insert_single_holiday(
use Modern::Perl;
-use Test::More tests => 72;
+use Test::More tests => 71;
use Test::MockModule;
use Test::Warn;
ModReserveAffect($itemnum_cpl, $requesters{$branch_3}, 0);
# Now it should have different priorities.
-my $title_reserves = GetReservesFromBiblionumber({biblionumber => $bibnum2});
-# Sort by reserve number in case the database gives us oddly ordered results
-my @reserves = sort { $a->{reserve_id} <=> $b->{reserve_id} } @$title_reserves;
-is($reserves[0]{priority}, 0, 'Item is correctly waiting');
-is($reserves[1]{priority}, 1, 'Item is correctly priority 1');
-is($reserves[2]{priority}, 2, 'Item is correctly priority 2');
-
-@reserves = Koha::Holds->search({ borrowernumber => $requesters{$branch_3} })->waiting();
+my $biblio = Koha::Biblios->find( $bibnum2 );
+my $holds = $biblio->holds({}, { order_by => 'reserve_id' });;
+is($holds->next->priority, 0, 'Item is correctly waiting');
+is($holds->next->priority, 1, 'Item is correctly priority 1');
+is($holds->next->priority, 2, 'Item is correctly priority 2');
+
+my @reserves = Koha::Holds->search({ borrowernumber => $requesters{$branch_3} })->waiting();
is( @reserves, 1, 'GetWaiting got only the waiting reserve' );
is( $reserves[0]->borrowernumber(), $requesters{$branch_3}, 'GetWaiting got the reserve for the correct borrower' );
$requesters{$branch_3},
'for generous library, its items fill first hold request in line (bug 10272)');
-my $reserves = GetReservesFromBiblionumber({biblionumber => $biblionumber});
-isa_ok($reserves, 'ARRAY');
-is(scalar @$reserves, 1, "Only one reserves for this biblio");
-my $reserve_id = $reserves->[0]->{reserve_id};
+$biblio = Koha::Biblios->find( $biblionumber );
+$holds = $biblio->holds;
+is($holds->count, 1, "Only one reserves for this biblio");
+my $reserve_id = $holds->next->reserve_id;
$reserve = GetReserve($reserve_id);
isa_ok($reserve, 'HASH', "GetReserve return");
use t::lib::Mocks qw(mock_preference);
use POSIX qw(strftime);
use Data::Dumper;
+use Koha::Biblios;
use Koha::Libraries;
# ---------- Add 1 old_reserves
AddReserve( $branchcode, $borrowernumber1, $biblionumber1, '', 1, undef, undef, '', 'Title', undef, undef );
- my $reserves1 = GetReservesFromBiblionumber( { biblionumber => $biblionumber1 } );
- my $reserve_id1 = $reserves1->[0]->{reserve_id};
- my $reserve1 = CancelReserve( { reserve_id => $reserve_id1 } );
+ my $biblio = Koha::Biblios->find( $biblionumber1 );
+ my $holds = $biblio->holds;
+ CancelReserve( { reserve_id => $holds->next->reserve_id } );
# ---------- Add 1 aqbudgets
$query = '
use C4::AuthoritiesMarc;
use C4::Biblio;
+use Koha::Biblios;
+
my $input = new CGI;
my $dbh = C4::Context->dbh;
my $op = $input->param('op') // q|form|;
for my $record_id ( uniq @record_ids ) {
if ( $recordtype eq 'biblio' ) {
# Retrieve biblio information
- my $biblio = C4::Biblio::GetBiblio( $record_id );
+ my $biblio = Koha::Biblios->find( $record_id );
unless ( $biblio ) {
push @messages, {
type => 'warning',
};
next;
}
+ my $holds_count = $biblio->holds->count;
+ $biblio = $biblio->unblessed;
my $record = &GetMarcBiblio( $record_id );
$biblio->{subtitle} = GetRecordValue( 'subtitle', $record, GetFrameworkCode( $record_id ) );
$biblio->{itemnumbers} = C4::Items::GetItemnumbersForBiblio( $record_id );
- $biblio->{reserves} = C4::Reserves::GetReservesFromBiblionumber({ biblionumber => $record_id });
+ $biblio->{holds_count} = $holds_count;
$biblio->{issues_count} = C4::Biblio::CountItemsIssued( $record_id );
push @records, $biblio;
} else {
my $biblionumber = $record_id;
# First, checking if issues exist.
# If yes, nothing to do
+ my $biblio = Koha::Biblios->find( $biblionumber );
+
+ # TODO Replace with $biblio->get_issues->count
if ( C4::Biblio::CountItemsIssued( $biblionumber ) ) {
push @messages, {
type => 'warning',
}
# Cancel reserves
- my $reserves = C4::Reserves::GetReservesFromBiblionumber({ biblionumber => $biblionumber });
- for my $reserve ( @$reserves ) {
+ my $holds = $biblio->holds;
+ while ( my $hold = $holds->next ) {
eval{
- C4::Reserves::CancelReserve( { reserve_id => $reserve->{reserve_id} } );
+ C4::Reserves::CancelReserve( { reserve_id => $hold->reserve_id } );
};
if ( $@ ) {
push @messages, {
type => 'error',
code => 'reserve_not_cancelled',
biblionumber => $biblionumber,
- reserve_id => $reserve->{reserve_id},
+ reserve_id => $hold->reserve_id,
error => $@,
};
$dbh->rollback;