diff --git a/C4/Serials.pm b/C4/Serials.pm
index 1eae56bc8d..dfa93ce1ca 100644
--- a/C4/Serials.pm
+++ b/C4/Serials.pm
@@ -517,7 +517,9 @@ subscription expiration date.
=cut
sub SearchSubscriptions {
- my ( $args ) = @_;
+ my ( $args, $params ) = @_;
+
+ $params //= {};
my $additional_fields = $args->{additional_fields} // [];
my $matching_record_ids_for_additional_fields = [];
@@ -624,6 +626,12 @@ sub SearchSubscriptions {
$sth->execute(@where_args);
my $results = $sth->fetchall_arrayref( {} );
+ my $total_results = @{$results};
+
+ if ($params->{results_limit} && $total_results > $params->{results_limit}) {
+ $results = [splice(@{$results}, 0, $params->{results_limit})];
+ }
+
for my $subscription ( @$results ) {
$subscription->{cannotedit} = not can_edit_subscription( $subscription );
$subscription->{cannotdisplay} = not can_show_subscription( $subscription );
@@ -634,7 +642,7 @@ sub SearchSubscriptions {
}
- return @$results;
+ return wantarray ? @{$results} : { results => $results, total => $total_results };
}
diff --git a/installer/data/mysql/atomicupdate/bug-31846-serials-search-results-limit.pl b/installer/data/mysql/atomicupdate/bug-31846-serials-search-results-limit.pl
new file mode 100755
index 0000000000..d7309af900
--- /dev/null
+++ b/installer/data/mysql/atomicupdate/bug-31846-serials-search-results-limit.pl
@@ -0,0 +1,17 @@
+use Modern::Perl;
+
+return {
+ bug_number => "31846",
+ description => "Add SerialsSearchResultsLimit syspref",
+ up => sub {
+ my ($args) = @_;
+ my ($dbh, $out) = @$args{qw(dbh out)};
+ # Do you stuffs here
+ $dbh->do(q{
+ INSERT IGNORE INTO systempreferences (variable, value, options, explanation, type)
+ VALUES ('SerialsSearchResultsLimit', NULL, NULL, 'Serials search results limit', 'integer')
+ });
+ # Print useful stuff here
+ say $out "SerialsSearchResultsLimit syspref added";
+ },
+};
diff --git a/installer/data/mysql/mandatory/sysprefs.sql b/installer/data/mysql/mandatory/sysprefs.sql
index 6af4e7b210..078b27eb11 100644
--- a/installer/data/mysql/mandatory/sysprefs.sql
+++ b/installer/data/mysql/mandatory/sysprefs.sql
@@ -672,6 +672,7 @@ INSERT INTO systempreferences ( `variable`, `value`, `options`, `explanation`, `
('SendAllEmailsTo','',NULL,'All emails will be redirected to this email if it is not empty','free'),
('SeparateHoldings','0',NULL,'Separate current branch holdings from other holdings','YesNo'),
('SeparateHoldingsBranch','homebranch','homebranch|holdingbranch','Branch used to separate holdings','Choice'),
+('SerialsSearchResultsLimit', NULL, NULL, 'Serials search results limit', 'integer'),
('SessionRestrictionByIP','1','Check for change in remote IP address for session security. Disable only when remote IP address changes frequently.','','YesNo'),
('SessionStorage','mysql','mysql|Pg|tmp','Use database or a temporary file for storing session data','Choice'),
('ShelfBrowserUsesCcode','1','0','Use the item collection code when finding items for the shelf browser.','YesNo'),
diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/serials.pref b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/serials.pref
index e712b6419e..e24ea209a6 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/serials.pref
+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/serials.pref
@@ -63,3 +63,8 @@ Serials:
1: Do
0: Don't
- prefill the notes from the last 'Arrived' serial when generating the next 'Expected' issue.
+ -
+ - Show only the
+ - pref: SerialsSearchResultsLimit
+ class: integer
+ - first serials when performing an advanced serials search.
diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/serials/serials-search.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/serials/serials-search.tt
index 39f712b930..7684b8bb55 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/modules/serials/serials-search.tt
+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/serials/serials-search.tt
@@ -231,6 +231,11 @@
[% END %]
[% ELSE %]
[% IF ( done_searched ) %]
+ [% IF orig_total > total %]
+
+
The search originally produced [% orig_total | html %] results and was limited to [% total | html %].
+
+ [% END %]
Serials subscriptions ([% total | html %] found)
[% ELSE %]
Serials subscriptions search
diff --git a/serials/serials-search.pl b/serials/serials-search.pl
index 45b85817d1..80b2003814 100755
--- a/serials/serials-search.pl
+++ b/serials/serials-search.pl
@@ -55,6 +55,7 @@ my $searched = $query->param('searched') || 0;
my $mana = $query->param('mana') || 0;
my @subscriptionids = $query->multi_param('subscriptionid');
my $op = $query->param('op');
+my $orig_total;
my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
{
@@ -90,7 +91,7 @@ for my $field ( @additional_fields ) {
my @subscriptions;
my $mana_statuscode;
-if ($searched){
+if ($searched) {
if ($mana) {
my $result = Koha::SharedContent::search_entities("subscription",{
title => $title,
@@ -102,20 +103,25 @@ if ($searched){
@subscriptions = @{ $result->{data} };
}
else {
- @subscriptions = SearchSubscriptions(
- {
- biblionumber => $biblionumber,
- title => $title,
- issn => $ISSN,
- ean => $EAN,
- callnumber => $callnumber,
- publisher => $publisher,
- bookseller => $bookseller,
- branch => $branch,
- additional_fields => \@additional_field_filters,
- location => $location,
- expiration_date => $expiration_date,
- });
+ my $subscriptions = SearchSubscriptions(
+ {
+ biblionumber => $biblionumber,
+ title => $title,
+ issn => $ISSN,
+ ean => $EAN,
+ callnumber => $callnumber,
+ publisher => $publisher,
+ bookseller => $bookseller,
+ branch => $branch,
+ additional_fields => \@additional_field_filters,
+ location => $location,
+ expiration_date => $expiration_date,
+ },
+ { results_limit => C4::Context->preference('SerialsSearchResultsLimit') }
+ );
+ @subscriptions = @{$subscriptions->{results}};
+ $orig_total = $subscriptions->{total};
+
}
}
@@ -142,8 +148,7 @@ if ($mana) {
search_only => 1
);
}
-else
-{
+else {
# to toggle between create or edit routing list options
if ($routing) {
for my $subscription ( @subscriptions) {
@@ -178,6 +183,7 @@ else
openedsubscriptions => \@openedsubscriptions,
closedsubscriptions => \@closedsubscriptions,
total => @openedsubscriptions + @closedsubscriptions,
+ orig_total => $orig_total,
title_filter => $title,
ISSN_filter => $ISSN,
EAN_filter => $EAN,
diff --git a/t/db_dependent/Serials.t b/t/db_dependent/Serials.t
index eb432dc914..65c563d164 100755
--- a/t/db_dependent/Serials.t
+++ b/t/db_dependent/Serials.t
@@ -16,7 +16,7 @@ use Koha::DateUtils qw( dt_from_string output_pref );
use Koha::Acquisition::Booksellers;
use t::lib::Mocks;
use t::lib::TestBuilder;
-use Test::More tests => 52;
+use Test::More tests => 54;
BEGIN {
use_ok('C4::Serials', qw( updateClaim NewSubscription GetSubscription GetSubscriptionHistoryFromSubscriptionId SearchSubscriptions ModSubscription GetExpirationDate GetSerials GetSerialInformation NewIssue AddItem2Serial DelSubscription GetFullSubscription PrepareSerialsData GetSubscriptionsFromBiblionumber ModSubscriptionHistory GetSerials2 GetLatestSerials GetNextSeq GetSeq CountSubscriptionFromBiblionumber ModSerialStatus findSerialsByStatus HasSubscriptionStrictlyExpired HasSubscriptionExpired GetLateOrMissingIssues check_routing addroutingmember GetNextDate ));
@@ -26,6 +26,8 @@ my $schema = Koha::Database->new->schema;
$schema->storage->txn_begin;
my $dbh = C4::Context->dbh;
+$dbh->do('DELETE FROM subscription');
+
my $builder = t::lib::TestBuilder->new();
# This could/should be used for all untested methods
@@ -76,14 +78,84 @@ my $notes = "a\nnote\non\nseveral\nlines";
my $internalnotes = 'intnotes';
my $ccode = 'FIC';
my $subscriptionid = NewSubscription(
- undef, "", undef, undef, $budget_id, $biblionumber,
- '2013-01-01', $frequency_id, undef, undef, undef,
- undef, undef, undef, undef, undef, undef,
- 1, $notes, ,undef, '2013-01-01', undef, $pattern_id,
- undef, undef, 0, $internalnotes, 0,
- undef, undef, 0, undef, '2013-12-31', 0,
- undef, undef, undef, $ccode
+ undef,
+ "",
+ undef,
+ undef,
+ $budget_id,
+ $biblionumber,
+ '2013-01-01',
+ $frequency_id,
+ undef,
+ undef,
+ undef,
+ undef,
+ undef,
+ undef,
+ undef,
+ undef,
+ undef,
+ 1,
+ $notes,
+ undef,
+ '2013-01-01',
+ undef,
+ $pattern_id,
+ undef,
+ undef,
+ 0,
+ $internalnotes,
+ 0,
+ undef,
+ undef,
+ 0,
+ undef,
+ '2013-12-31', 0,
+ undef,
+ undef,
+ undef,
+ $ccode
+);
+NewSubscription(
+ undef,
+ "",
+ undef,
+ undef,
+ $budget_id,
+ $biblionumber,
+ '2013-01-02',
+ $frequency_id,
+ undef,
+ undef,
+ undef,
+ undef,
+ undef,
+ undef,
+ undef,
+ undef,
+ undef,
+ 1,
+ $notes,
+ undef,
+ '2013-01-02',
+ undef,
+ $pattern_id,
+ undef,
+ undef,
+ 0,
+ $internalnotes,
+ 0,
+ undef,
+ undef,
+ 0,
+ undef,
+ '2013-12-31',
+ 0,
+ undef,
+ undef,
+ undef,
+ $ccode
);
my $subscriptioninformation = GetSubscription( $subscriptionid );
@@ -108,6 +180,20 @@ isa_ok( \@subscriptions, 'ARRAY' );
@subscriptions = SearchSubscriptions({ biblionumber => $subscriptioninformation->{bibnum}, orderby => 'title' });
isa_ok( \@subscriptions, 'ARRAY' );
+@subscriptions = SearchSubscriptions({});
+is(
+ @subscriptions,
+ 2,
+ 'SearchSubscriptions returned the expected number of subscriptions when results_limit is not set'
+);
+
+@subscriptions = SearchSubscriptions({}, { results_limit => 1 });
+is(
+ @subscriptions,
+ 1,
+ 'SearchSubscriptions returned only one subscription when results_limit is set to "1"'
+);
+
my $frequency = GetSubscriptionFrequency($subscriptioninformation->{periodicity});
my $old_frequency;
if (not $frequency->{unit}) {