@@ -, +, @@ Koha::Holds->filter_by_has_pending_cancellation_requests $ kshell k$ prove t/db_dependent/Koha/Holds.t --- Koha/Holds.pm | 21 +++++++++-- Koha/Schema/Result/Reserve.pm | 7 ++++ t/db_dependent/Koha/Holds.t | 67 +++++++++++++++++++++++++++++++++-- 3 files changed, 91 insertions(+), 4 deletions(-) --- a/Koha/Holds.pm +++ a/Koha/Holds.pm @@ -32,7 +32,7 @@ Koha::Holds - Koha Hold object set class =head1 API -=head2 Class Methods +=head2 Class methods =cut @@ -144,7 +144,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 --- a/Koha/Schema/Result/Reserve.pm +++ a/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; --- a/t/db_dependent/Koha/Holds.t +++ a/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 ); @@ -629,4 +629,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; +}; --