From da4e271e747e053e238f07dd7c4912318c8f9b07 Mon Sep 17 00:00:00 2001 From: Tomas Cohen Arazi Date: Mon, 23 May 2022 11:44:19 -0300 Subject: [PATCH] Bug 22456: Add Koha::Holds->filter_by_has_pending_cancellation_requests This patch adds that method. Which is covered by new tests. To test: 1. Apply this patch 2. Run: $ kshell k$ prove t/db_dependent/Koha/Holds.t => SUCCESS: Tests pass! 3. Sign off :-D Signed-off-by: Tomas Cohen Arazi --- Koha/Holds.pm | 21 +++++++++-- Koha/Schema/Result/Reserve.pm | 7 ++++ t/db_dependent/Koha/Holds.t | 67 +++++++++++++++++++++++++++++++++-- 3 files changed, 91 insertions(+), 4 deletions(-) diff --git a/Koha/Holds.pm b/Koha/Holds.pm index 2a117f5f66..b6158f8116 100644 --- a/Koha/Holds.pm +++ b/Koha/Holds.pm @@ -32,7 +32,7 @@ Koha::Holds - Koha Hold object set class =head1 API -=head2 Class Methods +=head2 Class methods =cut @@ -145,7 +145,24 @@ sub get_items_that_can_fill { )->filter_by_for_hold(); } -=head3 type +=head3 filter_by_has_pending_cancellation_requests + + my $with_cancellation_reqs = $holds->filter_by_has_cancellation_requests; + +Returns a filtered resultset only containing holds that pending cancellation requests. + +=cut + +sub filter_by_has_pending_cancellation_requests { + my ($self) = @_; + + return $self->search( { 'cancellation_requests.status' => 'requested' }, + { join => 'cancellation_requests' } ); +} + +=head2 Internal methods + +=head3 _type =cut diff --git a/Koha/Schema/Result/Reserve.pm b/Koha/Schema/Result/Reserve.pm index 08818830ca..03eb7ef909 100644 --- a/Koha/Schema/Result/Reserve.pm +++ b/Koha/Schema/Result/Reserve.pm @@ -491,4 +491,11 @@ __PACKAGE__->belongs_to( }, ); +__PACKAGE__->has_many( + "cancellation_requests", + "Koha::Schema::Result::HoldCancellationRequest", + { "foreign.hold_id" => "self.reserve_id" }, + { cascade_copy => 0, cascade_delete => 0 }, +); + 1; diff --git a/t/db_dependent/Koha/Holds.t b/t/db_dependent/Koha/Holds.t index d9f8b666a7..bdb1b37597 100755 --- a/t/db_dependent/Koha/Holds.t +++ b/t/db_dependent/Koha/Holds.t @@ -19,7 +19,7 @@ use Modern::Perl; -use Test::More tests => 7; +use Test::More tests => 8; use Test::Warn; use C4::Circulation qw( AddIssue ); @@ -638,4 +638,67 @@ subtest 'set_waiting+patron_expiration_date' => sub { $schema->storage->txn_rollback; -1; +subtest 'filter_by_has_pending_cancellation_requests() tests' => sub { + + plan tests => 4; + + $schema->storage->txn_begin; + + my $patron = $builder->build_object( { class => 'Koha::Patrons' } ); + + my $item_1 = $builder->build_sample_item; + my $item_2 = $builder->build_sample_item; + my $item_3 = $builder->build_sample_item; + + my $hold_1 = $builder->build_object( + { + class => 'Koha::Holds', + value => { + found => 'W', + itemnumber => $item_1->id, + biblionumber => $item_1->biblionumber, + borrowernumber => $patron->id + } + } + ); + my $hold_2 = $builder->build_object( + { + class => 'Koha::Holds', + value => { + found => 'W', + itemnumber => $item_2->id, + biblionumber => $item_2->biblionumber, + borrowernumber => $patron->id + } + } + ); + my $hold_3 = $builder->build_object( + { + class => 'Koha::Holds', + value => { + found => 'W', + itemnumber => $item_3->id, + biblionumber => $item_3->biblionumber, + borrowernumber => $patron->id + } + } + ); + + my $rs = Koha::Holds->search( + { reserve_id => [ $hold_1->id, $hold_2->id, $hold_3->id ] } ); + + is( $rs->count, 3 ); + + my $filtered_rs = $rs->filter_by_has_pending_cancellation_requests; + + is( $filtered_rs->count, 0 ); + + $hold_2->add_cancellation_request( { requester_id => $patron->id } ); + + $filtered_rs = $rs->filter_by_has_pending_cancellation_requests; + + is( $filtered_rs->count, 1 ); + is( $filtered_rs->next->id, $hold_2->id ); + + $schema->storage->txn_rollback; +}; -- 2.34.1