From 9d1bce401f5e41e8474197d4950cce7a5773519d Mon Sep 17 00:00:00 2001 From: danyonsewell Date: Wed, 20 Dec 2023 04:15:06 +0000 Subject: [PATCH] Bug 26567: Allow to limit subscription search to subscriptions with routing lists MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds a search option to the advanced search in the serials module that allows to limit search on subscriptions with routing lists. Test plan: 1. Apply this patch 2. Create two subscriptions, one with a routing list and one without 3. Navigate to Serials home and tick the checkbox labeled "Search routing lists only:" 4. Confirm that the only search result to appear is the subscription you added the routing list to 5. Run unit tests: prove t/db_dependent/Serials.t Sponsored by: Bibliotheksservice-Zentrum Baden-Wuerttemberg Signed-off-by: Christian Stelzenmüller Signed-off-by: Katrin Fischer Perltidied changes to make QA test tools pass. --- C4/Serials.pm | 6 ++- .../prog/en/includes/serials-advsearch.inc | 5 ++ serials/serials-search.pl | 22 +++++---- t/db_dependent/Serials.t | 48 ++++++++++++++++++- 4 files changed, 69 insertions(+), 12 deletions(-) diff --git a/C4/Serials.pm b/C4/Serials.pm index ec88b0f3e6..5340fb47ca 100644 --- a/C4/Serials.pm +++ b/C4/Serials.pm @@ -510,6 +510,7 @@ The valid search fields are: branch expiration_date closed + routinglist The expiration_date search field is special; it specifies the maximum subscription expiration date. @@ -553,6 +554,10 @@ sub SearchSubscriptions { LEFT JOIN biblioitems ON biblioitems.biblionumber = subscription.biblionumber LEFT JOIN aqbooksellers ON subscription.aqbooksellerid = aqbooksellers.id |; + if ( $args->{routinglist} ) { + $query .= + q| INNER JOIN (SELECT DISTINCT subscriptionid FROM subscriptionroutinglist) srl ON srl.subscriptionid = subscription.subscriptionid|; + } $query .= q| WHERE 1|; my @where_strs; my @where_args; @@ -609,7 +614,6 @@ sub SearchSubscriptions { push @where_strs, "subscription.closed = ?"; push @where_args, "$args->{closed}"; } - if(@where_strs){ $query .= ' AND ' . join(' AND ', @where_strs); } diff --git a/koha-tmpl/intranet-tmpl/prog/en/includes/serials-advsearch.inc b/koha-tmpl/intranet-tmpl/prog/en/includes/serials-advsearch.inc index ec34b6f073..84b9eed7cb 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/includes/serials-advsearch.inc +++ b/koha-tmpl/intranet-tmpl/prog/en/includes/serials-advsearch.inc @@ -50,6 +50,11 @@ +
  • + + +
  • + [% INCLUDE 'additional-fields-entry.inc' available=additional_fields_for_subscription values=additional_field_filters wrap_fieldset=0 %] diff --git a/serials/serials-search.pl b/serials/serials-search.pl index 80b2003814..19eb7cea1d 100755 --- a/serials/serials-search.pl +++ b/serials/serials-search.pl @@ -52,6 +52,7 @@ my $location = $query->param('location_filter') || ''; my $expiration_date = $query->param('expiration_date_filter') || ''; my $routing = $query->param('routing') || C4::Context->preference("RoutingSerials"); my $searched = $query->param('searched') || 0; +my $routinglist = $query->param('routinglist'); my $mana = $query->param('mana') || 0; my @subscriptionids = $query->multi_param('subscriptionid'); my $op = $query->param('op'); @@ -105,17 +106,18 @@ if ($searched) { else { my $subscriptions = SearchSubscriptions( { - biblionumber => $biblionumber, - title => $title, - issn => $ISSN, - ean => $EAN, - callnumber => $callnumber, - publisher => $publisher, - bookseller => $bookseller, - branch => $branch, + 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, + location => $location, + expiration_date => $expiration_date, + routinglist => $routinglist, }, { results_limit => C4::Context->preference('SerialsSearchResultsLimit') } ); diff --git a/t/db_dependent/Serials.t b/t/db_dependent/Serials.t index 65c563d164..af74187346 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 => 54; +use Test::More tests => 56; 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 )); @@ -194,6 +194,52 @@ is( 'SearchSubscriptions returned only one subscription when results_limit is set to "1"' ); +# Set up fake data +my $subscriptionwithroutinglistid = 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 +); + +#creating fake patrons +my $patron = $builder->build_object( + { + class => 'Koha::Patrons', + } +); +my $patron2 = $builder->build_object( + { + class => 'Koha::Patrons', + } +); +my $patronid1 = $patron->borrowernumber; +my $patronid2 = $patron2->borrowernumber; + +# Add a fake routing list with fake patrons +addroutingmember( $patronid1, $subscriptionwithroutinglistid ); +addroutingmember( $patronid2, $subscriptionwithroutinglistid ); + +# Perform SearchSubscriptions +my $fake_subscription = GetSubscription($subscriptionwithroutinglistid); + +my @subscriptionswithroutinglist = SearchSubscriptions( + { + issn => $fake_subscription->{issn}, + orderby => 'title', + routinglist => 1 + } +); + +# Check the results +is( @subscriptionswithroutinglist, 1, 'SearchSubscriptions returned the expected number of subscriptions' ); +is( + $subscriptionswithroutinglist[0]->{title}, $fake_subscription->{title}, + 'SearchSubscriptions returned the correct subscription' +); + my $frequency = GetSubscriptionFrequency($subscriptioninformation->{periodicity}); my $old_frequency; if (not $frequency->{unit}) { -- 2.30.2