Bug 22284: New methods in Koha::Library::Groups and Koha::Library
authorAgustin Moyano <agustinmoyano@theke.io>
Mon, 25 Mar 2019 02:00:36 +0000 (23:00 -0300)
committerMartin Renvoize <martin.renvoize@ptfs-europe.com>
Fri, 3 Jan 2020 12:58:03 +0000 (12:58 +0000)
This patch adds new methods in Koha::Library::Groups and Koha::Library.
1) For Koha::Library::Groups adds get_root_ancestor that returns all root
groups for a given search parameters, for example
Koha::Library::Groups->get_root_ancestor( { id => $group_id } )
2) For Koha::Library adds
2.1) get_hold_libraries: returns all libraries (including self) that
belongs to the same holdgroups. If $self belongs to several holdgroups
it will return a distinct list of all libraries belonging to them.
2.2) validate_hold_sibling: Returns 1 if the given parameters matches any of the
libraries that belong to any of the holdgroups this library belongs. For example
$library->validate_hold_sibling( { branchcode => $branchcode } )

To test:
1) apply this patch
2) prove t/db_dependent/Koha/Libraries.t t/db_dependent/LibraryGroups.t
SUCCESS => green letters :-D
3) Sign off

Sponsored-by: VOKAL
Signed-off-by: Josef Moravec <josef.moravec@gmail.com>
Signed-off-by: Liz Rea <wizzyrea@gmail.com>
Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>
Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com>

Koha/Library.pm
Koha/Library/Groups.pm
t/db_dependent/Koha/Libraries.t
t/db_dependent/LibraryGroups.t

index dab86e7..8f40a89 100644 (file)
@@ -121,6 +121,57 @@ sub to_api_mapping {
     };
 }
 
+=head3 get_hold_libraries
+
+Return all libraries (including self) that belong to the same hold groups
+
+=cut
+
+sub get_hold_libraries {
+    my ( $self ) = @_;
+    my $library_groups = $self->library_groups;
+    my @hold_libraries;
+    while ( my $library_group = $library_groups->next ) {
+        my $root = Koha::Library::Groups->get_root_ancestor({id => $library_group->id});
+        if($root->ft_local_hold_group) {
+            push @hold_libraries, $root->all_libraries;
+        }
+    }
+
+    my %seen;
+    @hold_libraries =
+      grep { !$seen{ $_->id }++ } @hold_libraries;
+
+    return @hold_libraries;
+}
+
+=head3 validate_hold_sibling
+
+Return if given library is a valid hold group member
+
+=cut
+
+sub validate_hold_sibling {
+    my ( $self, $params ) = @_;
+    my @hold_libraries = $self->get_hold_libraries;
+
+    foreach (@hold_libraries) {
+        my $hold_library = $_;
+        my $is_valid = 1;
+        foreach my $key (keys %$params) {
+            unless($hold_library->$key eq $params->{$key}) {
+                $is_valid=0;
+                last;
+            }
+        }
+        if($is_valid) {
+            #Found one library that meets all search parameters
+            return 1;
+        }
+    }
+    return 0;
+}
+
 =head2 Internal methods
 
 =head3 _type
index 1ce2cb0..ac0b6dc 100644 (file)
@@ -65,6 +65,23 @@ sub get_search_groups {
     return $self->search( { $field => 1 } );
 }
 
+
+=head3 get_root_ancestor
+
+my $root_ancestor = $self->get_root_ancestor( {id => $group_id } )
+
+Retrieve root ancestor group for a specified id.
+
+=cut
+
+sub get_root_ancestor {
+    my ( $self, $params ) = @_;
+    my $row = $self->find($params);
+    return $row unless $row->parent_id;
+    return $self->get_root_ancestor( { id => $row->parent_id } );
+}
+
+
 =head3 type
 
 =cut
index 987d6bc..87fd28a 100644 (file)
@@ -19,7 +19,7 @@
 
 use Modern::Perl;
 
-use Test::More tests => 8;
+use Test::More tests => 9;
 
 use C4::Biblio;
 use C4::Context;
@@ -468,3 +468,36 @@ subtest 'cash_registers' => sub {
 
     $schema->storage->txn_rollback;
 };
+
+subtest 'get_hold_libraries and validate_hold_sibling' => sub {
+
+    plan tests => 5;
+
+    $schema->storage->txn_begin;
+
+    my $library1 = $builder->build_object( { class => 'Koha::Libraries' } );
+    my $library2 = $builder->build_object( { class => 'Koha::Libraries' } );
+    my $library3 = $builder->build_object( { class => 'Koha::Libraries' } );
+
+    my $root = $builder->build_object( { class => 'Koha::Library::Groups', value => { ft_local_hold_group => 1 } } );
+    my $g1 = $builder->build_object( { class => 'Koha::Library::Groups', value => { parent_id => $root->id, branchcode => $library1->branchcode } } );
+    my $g2 = $builder->build_object( { class => 'Koha::Library::Groups', value => { parent_id => $root->id, branchcode => $library2->branchcode } } );
+
+    my @hold_libraries = ($library1, $library2);
+
+    my @result = $library1->get_hold_libraries();
+
+    ok(scalar(@result) == 2, 'get_hold_libraries returns 2 libraries');
+
+    my %map = map {$_->branchcode, 1} @result;
+
+    foreach my $hold_library ( @hold_libraries ) {
+        ok(exists $map{$hold_library->branchcode}, 'library in hold group');
+    }
+
+    ok($library1->validate_hold_sibling( { branchcode => $library2->branchcode } ), 'Library 2 is a valid hold sibling');
+    ok(!$library1->validate_hold_sibling( { branchcode => $library3->branchcode } ), 'Library 3 is not a valid hold sibling');
+
+    $schema->storage->txn_rollback;
+
+};
index 69f9e9d..2682421 100644 (file)
@@ -4,7 +4,7 @@ use Modern::Perl;
 
 use List::MoreUtils 'any';
 
-use Test::More tests => 20;
+use Test::More tests => 21;
 
 use t::lib::TestBuilder;
 use Koha::Database;
@@ -144,3 +144,22 @@ is( ref($groupX->libraries), 'Koha::Libraries', '->libraries should return a Koh
 @group_branchcodes = sort( map { $_->branchcode } $groupX->all_libraries );
 is_deeply( \@branchcodes, \@group_branchcodes, "Group all_libraries are returned correctly" );
 is( ref(($groupX->all_libraries)[0]), 'Koha::Library', '->all_libraries should return a list of Koha::Library - in the future it should be fixed to return a Koha::Libraries iterator instead'); # FIXME
+
+subtest 'Koha::Library::Groups->get_root_ancestor' => sub {
+    plan tests => 2;
+
+    my $groupY = Koha::Library::Group->new( { title => "Group Y" } )->store();
+    my $groupY_library1 = Koha::Library::Group->new({ parent_id => $groupY->id,  branchcode => $library1->{branchcode} })->store();
+    my $groupY1 = Koha::Library::Group->new( { parent_id => $groupY->id, title => "Group Y1" } )->store();
+    my $groupY1_library2 = Koha::Library::Group->new({ parent_id => $groupY1->id,  branchcode => $library2->{branchcode} })->store();
+    my $groupZ = Koha::Library::Group->new({ title => "Group Z" })->store();
+    my $groupZ1 = Koha::Library::Group->new({ parent_id => $groupZ->id,  title => "Group Z1" })->store();
+    my $groupZ2 = Koha::Library::Group->new({ parent_id => $groupZ1->id,  title => "Group Z2" })->store();
+    my $groupZ2_library2 = Koha::Library::Group->new({ parent_id => $groupZ2->id,  branchcode => $library2->{branchcode} })->store();
+
+    my $ancestor1 = Koha::Library::Groups->get_root_ancestor($groupY1_library2->unblessed);
+    my $ancestor2 = Koha::Library::Groups->get_root_ancestor($groupZ2_library2->unblessed);
+
+    is($ancestor1->id, $groupY->id, "Get root ancestor should return group's root ancestor");
+    ok($ancestor1->id ne $ancestor2->id, "Both root groups should have different ids");
+};
\ No newline at end of file