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 <david@davidnind.com>

Signed-off-by: Marcel de Rooy <m.de.rooy@rijksmuseum.nl>
Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>
This commit is contained in:
Nick Clemens 2023-03-10 12:37:49 +00:00 committed by Tomas Cohen Arazi
parent 68aeaf5c4c
commit 8ff2e962b2
Signed by: tomascohen
GPG key ID: 0A272EA1B2F3C15F
2 changed files with 40 additions and 9 deletions

View file

@ -486,11 +486,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
@ -507,12 +513,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;
@ -520,10 +539,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();

View file

@ -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;
};