Bug 16735: Use libraries in all subgroups, not just immediate children
authorKyle M Hall <kyle@bywatersolutions.com>
Tue, 8 Aug 2017 16:40:45 +0000 (12:40 -0400)
committerJonathan Druart <jonathan.druart@bugs.koha-community.org>
Mon, 12 Feb 2018 18:41:26 +0000 (15:41 -0300)
Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>

Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>

Koha/Library/Group.pm
catalogue/search.pl
opac/opac-search.pl
t/db_dependent/LibraryGroups.t

index cc4bd6d..5ac1360 100644 (file)
@@ -117,6 +117,37 @@ sub libraries {
     );
 }
 
+=head3 all_libraries
+
+my @libraries = $group->libraries( { [invert => 1] } );
+
+Returns the libraries set as children of this group or any subgroup.
+
+=cut
+
+sub all_libraries {
+    my ( $self, $params ) = @_;
+
+    my @libraries;
+
+    my @children = $self->children;
+    foreach my $c (@children) {
+        if ( $c->branchcode ) {
+            push( @libraries, $c );
+        }
+        else {
+            push( @libraries, $c->all_libraries );
+        }
+    }
+
+    my %seen;
+    @libraries =
+      grep { !$seen{ $_->id }++ } @libraries;
+
+#    return wantarray ? @li : $children;
+    return @libraries;
+}
+
 =head3 libraries_not_direct_children
 
 my @libraries = $group->libraries_not_direct_children();
index 4041bd8..26b7ef1 100755 (executable)
@@ -400,7 +400,7 @@ my %is_nolimit = map { $_ => 1 } @nolimits;
 
 if($params->{'multibranchlimit'}) {
     my $search_group = Koha::Library::Groups->find( $params->{multibranchlimit} );
-    my @libraries = $search_group->libraries;
+    my @libraries = $search_group->all_libraries;
     my $multibranch = '('.join( " or ", map { 'branch: ' . $_->id } @libraries ) .')';
     push @limits, $multibranch if ($multibranch ne  '()');
 }
index 81e6b3c..763c844 100755 (executable)
@@ -492,7 +492,7 @@ if (@searchCategories > 0) {
 
 if($params->{'multibranchlimit'}) {
     my $search_group = Koha::Library::Groups->find( $params->{multibranchlimit} );
-    my @libraries = $search_group->libraries;
+    my @libraries = $search_group->all_libraries;
     my $multibranch = '('.join( " or ", map { 'branch: ' . $_->id } @libraries ) .')';
     push @limits, $multibranch if ($multibranch ne  '()');
 }
index c3aef9f..52bde20 100644 (file)
@@ -4,7 +4,7 @@ use Modern::Perl;
 
 use List::MoreUtils 'any';
 
-use Test::More tests => 13;
+use Test::More tests => 15;
 
 use t::lib::TestBuilder;
 
@@ -20,26 +20,17 @@ $dbh->{AutoCommit} = 0;
 $dbh->{RaiseError} = 1;
 
 $dbh->do(q|DELETE FROM issues|);
+$dbh->do(q|DELETE FROM library_groups|);
 
 my $builder = t::lib::TestBuilder->new();
 
-my $library1 = $builder->build(
-    {
-        source => 'Branch',
-    }
-);
-
-my $library2 = $builder->build(
-    {
-        source => 'Branch',
-    }
-);
-
-my $library3 = $builder->build(
-    {
-        source => 'Branch',
-    }
-);
+my $library1 = $builder->build( { source => 'Branch' } );
+my $library2 = $builder->build( { source => 'Branch' } );
+my $library3 = $builder->build( { source => 'Branch' } );
+my $library4 = $builder->build( { source => 'Branch' } );
+my $library5 = $builder->build( { source => 'Branch' } );
+my $library6 = $builder->build( { source => 'Branch' } );
+my $library7 = $builder->build( { source => 'Branch' } );
 
 my $root_group =
   Koha::Library::Group->new( { title => "Test root group" } )->store();
@@ -77,3 +68,21 @@ $in_list = any { $_->id eq $groupA_library1->branchcode } @libraries_not_direct_
 ok( !$in_list, 'Method libraries_not_direct_children returns all libraries not direct descendants of group, library 1 is not in the list');
 $in_list = any { $_->id eq $groupA1_library2->branchcode } @libraries_not_direct_children;
 ok( $in_list, 'Method libraries_not_direct_children returns all libraries not direct descendants of group, library 2 is in the list');
+
+my $groupX = Koha::Library::Group->new( { title => "Group X" } )->store();
+my $groupX_library1 = Koha::Library::Group->new({ parent_id => $groupX->id,  branchcode => $library1->{branchcode} })->store();
+my $groupX_library2 = Koha::Library::Group->new({ parent_id => $groupX->id,  branchcode => $library2->{branchcode} })->store();
+my $groupX1 = Koha::Library::Group->new({ parent_id => $groupX->id, title => 'Group X1' })->store();
+my $groupX1_library3 = Koha::Library::Group->new({ parent_id => $groupX1->id,  branchcode => $library3->{branchcode} })->store();
+my $groupX1_library4 = Koha::Library::Group->new({ parent_id => $groupX1->id,  branchcode => $library4->{branchcode} })->store();
+my $groupX2 = Koha::Library::Group->new({ parent_id => $groupX->id, title => 'Group X2' })->store();
+my $groupX2_library5 = Koha::Library::Group->new({ parent_id => $groupX2->id,  branchcode => $library5->{branchcode} })->store();
+my $groupX2_library6 = Koha::Library::Group->new({ parent_id => $groupX2->id,  branchcode => $library6->{branchcode} })->store();
+
+my @branchcodes = sort( $library1->{branchcode}, $library2->{branchcode} );
+my @group_branchcodes = sort( map { $_->branchcode } $groupX->libraries->as_list );
+is_deeply( \@branchcodes, \@group_branchcodes, "Group libraries are returned correctly" );
+
+@branchcodes = sort( $library1->{branchcode}, $library2->{branchcode}, $library3->{branchcode}, $library4->{branchcode}, $library5->{branchcode}, $library6->{branchcode} );
+@group_branchcodes = sort( map { $_->branchcode } $groupX->all_libraries );
+is_deeply( \@branchcodes, \@group_branchcodes, "Group all_libraries are returned correctly" );