From 8c6f7682edeb73ce7a06cea5f5d10dc2c3fb621b Mon Sep 17 00:00:00 2001 From: Nick Clemens Date: Fri, 10 Mar 2023 12:37:49 +0000 Subject: [PATCH] Bug 33496: Add 'host_items' param to Koha::Biblio->items Content-Type: text/plain; charset=utf-8 This patch adds an option to the $biblio->items method to allow retrieving the items and analytic items for a record. This is intended to allow fetching a single Items object, and related object, rather than having to fetch the items, and the host items, and push them together This is step towards being able to fetch items using API/DataTables directly To test: 1 - prove -v t/db_dependent/Koha/Biblio.t Signed-off-by: David Nind Signed-off-by: Marcel de Rooy --- Koha/Biblio.pm | 35 +++++++++++++++++++++++++++-------- t/db_dependent/Koha/Biblio.t | 14 +++++++++++++- 2 files changed, 40 insertions(+), 9 deletions(-) diff --git a/Koha/Biblio.pm b/Koha/Biblio.pm index 50d60c8a69..26e72a051d 100644 --- a/Koha/Biblio.pm +++ b/Koha/Biblio.pm @@ -470,11 +470,17 @@ Returns the related Koha::Items object for this biblio =cut sub items { - my ($self) = @_; + my ($self,$params) = @_; my $items_rs = $self->_result->items; - return Koha::Items->_new_from_dbic( $items_rs ); + return Koha::Items->_new_from_dbic( $items_rs ) unless $params->{host_items}; + + my $host_itemnumbers = $self->_host_itemnumbers(); + my $params = { -or => [biblionumber => $self->id] }; + push @{$params->{'-or'}}, itemnumber => { -in => $host_itemnumbers } if $host_itemnumbers; + + return Koha::Items->search($params); } =head3 host_items @@ -491,12 +497,25 @@ sub host_items { return Koha::Items->new->empty unless C4::Context->preference('EasyAnalyticalRecords'); + my $host_itemnumbers = $self->_host_itemnumbers; + + return Koha::Items->search( { itemnumber => { -in => $host_itemnumbers } } ); +} + +=head3 _host_itemnumbers + +my $host_itemnumber = $biblio->_host_itemnumbers(); + +Return the itemnumbers for analytical items on this record + +=cut + +sub _host_itemnumbers { + my ($self) = @_; + my $marcflavour = C4::Context->preference("marcflavour"); my $analyticfield = '773'; - if ( $marcflavour eq 'MARC21' ) { - $analyticfield = '773'; - } - elsif ( $marcflavour eq 'UNIMARC' ) { + if ( $marcflavour eq 'UNIMARC' ) { $analyticfield = '461'; } my $marc_record = $self->metadata->record; @@ -504,10 +523,10 @@ sub host_items { foreach my $field ( $marc_record->field($analyticfield) ) { push @itemnumbers, $field->subfield('9'); } - - return Koha::Items->search( { itemnumber => { -in => \@itemnumbers } } ); + return \@itemnumbers; } + =head3 itemtype my $itemtype = $biblio->itemtype(); diff --git a/t/db_dependent/Koha/Biblio.t b/t/db_dependent/Koha/Biblio.t index ef41c7636a..d92d269a81 100755 --- a/t/db_dependent/Koha/Biblio.t +++ b/t/db_dependent/Koha/Biblio.t @@ -811,7 +811,7 @@ subtest 'get_marc_notes() UNIMARC tests' => sub { }; subtest 'host_items() tests' => sub { - plan tests => 6; + plan tests => 7; $schema->storage->txn_begin; @@ -847,6 +847,18 @@ subtest 'host_items() tests' => sub { is( ref($host_items), 'Koha::Items' ); is( $host_items->count, 0 ); + subtest 'test host_items param in items()' => sub { + plan tests => 4; + + my $items = $biblio->items; + is( $items->count, 1, "Without host_items param we only get the items on the biblio"); + $items = $biblio->items({ host_items => 1 }); + is( $items->count, 3, "With param host_items we get the biblio items plus analytics"); + is( ref($items), 'Koha::Items', "We correctly get an Items object"); + is_deeply( [ $items->get_column('itemnumber') ], + [ $item_1->itemnumber, $host_item_1->itemnumber, $host_item_2->itemnumber ] ); + }; + $schema->storage->txn_rollback; }; -- 2.30.2