From 9d2f2a812433672965d2f818c9043a361931ef82 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 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 Signed-off-by: Tomas Cohen Arazi (cherry picked from commit 8ff2e962b2e8e41db60cbc746a849287a83ccb65) Signed-off-by: Martin Renvoize (cherry picked from commit aac8c1e36ea84deed0f4b9ad59f9f1bd44ba607f) Signed-off-by: Matt Blenkinsop --- 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 85a72400be..c17c4359f0 100644 --- a/Koha/Biblio.pm +++ b/Koha/Biblio.pm @@ -471,11 +471,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 @@ -492,12 +498,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; @@ -505,10 +524,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 ee3a7290ac..09e747e6b2 100755 --- a/t/db_dependent/Koha/Biblio.t +++ b/t/db_dependent/Koha/Biblio.t @@ -783,7 +783,7 @@ subtest 'get_marc_notes() UNIMARC tests' => sub { }; subtest 'host_items() tests' => sub { - plan tests => 6; + plan tests => 7; $schema->storage->txn_begin; @@ -819,6 +819,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.39.5