@@ -, +, @@ ItemType --- Koha/ItemType.pm | 21 +++++++++++++++++++++ opac/opac-ISBDdetail.pl | 2 +- opac/opac-MARCdetail.pl | 3 ++- opac/opac-detail.pl | 2 +- opac/opac-search.pl | 13 +++++-------- t/db_dependent/ArticleRequests.t | 18 +++++------------- 6 files changed, 35 insertions(+), 24 deletions(-) --- a/Koha/ItemType.pm +++ a/Koha/ItemType.pm @@ -22,6 +22,7 @@ use Carp; use C4::Koha; use C4::Languages; use Koha::Database; +use Koha::IssuingRules; use Koha::Localizations; use base qw(Koha::Object); @@ -106,6 +107,26 @@ sub can_be_deleted { return $nb_items + $nb_biblioitems == 0 ? 1 : 0; } +=head3 may_article_request + + Returns true if it is likely possible to make an article request for + this item type. + Optional parameter: categorycode (for patron). + +=cut + +sub may_article_request { + my ( $self, $params ) = @_; + return q{} if !C4::Context->preference('ArticleRequests'); + my $itemtype = $self->itemtype; + my $category = $params->{categorycode}; + + my $guess = Koha::IssuingRules->guess_article_requestable_itemtypes({ + $category ? ( categorycode => $category ) : (), + }); + return ( $guess->{ $itemtype // q{} } || $guess->{ '*' } ) ? 1 : q{}; +} + =head3 type =cut --- a/opac/opac-ISBDdetail.pl +++ a/opac/opac-ISBDdetail.pl @@ -220,7 +220,7 @@ if (my $search_for_title = C4::Context->preference('OPACSearchForTitleIn')){ if( C4::Context->preference('ArticleRequests') ) { my $artreqpossible = $patron ? $biblio->can_article_request( $patron ) - : $biblio->may_article_request; + : Koha::ItemTypes->find($biblio->itemtype)->may_article_request; $template->param( artreqpossible => $artreqpossible ); } --- a/opac/opac-MARCdetail.pl +++ a/opac/opac-MARCdetail.pl @@ -60,6 +60,7 @@ use List::MoreUtils qw( any uniq ); use Koha::Biblios; use Koha::IssuingRules; use Koha::Items; +use Koha::ItemTypes; use Koha::Patrons; use Koha::RecordProcessor; @@ -352,7 +353,7 @@ if (my $search_for_title = C4::Context->preference('OPACSearchForTitleIn')){ if( C4::Context->preference('ArticleRequests') ) { my $artreqpossible = $patron ? $biblio->can_article_request( $patron ) - : $biblio->may_article_request; + : Koha::ItemTypes->find($biblio->itemtype)->may_article_request; $template->param( artreqpossible => $artreqpossible ); } --- a/opac/opac-detail.pl +++ a/opac/opac-detail.pl @@ -760,7 +760,7 @@ if( C4::Context->preference('ArticleRequests') ) { my $patron = $borrowernumber ? Koha::Patrons->find($borrowernumber) : undef; my $artreqpossible = $patron ? $biblio->can_article_request( $patron ) - : $biblio->may_article_request; + : Koha::ItemTypes->find($biblio->itemtype)->may_article_request; $template->param( artreqpossible => $artreqpossible ); } --- a/opac/opac-search.pl +++ a/opac/opac-search.pl @@ -642,10 +642,10 @@ for (my $i=0;$i<@servers;$i++) { } $hits = 0 unless @newresults; - my $categorycode; # needed for may_article_request - if( $borrowernumber && C4::Context->preference('ArticleRequests') ) { - my $patron = Koha::Patrons->find( $borrowernumber ); - $categorycode = $patron ? $patron->categorycode : undef; + my $art_req_itypes; + if( C4::Context->preference('ArticleRequests') ) { + my $patron = $borrowernumber ? Koha::Patrons->find( $borrowernumber ) : undef; + $art_req_itypes = Koha::IssuingRules->guess_article_requestable_itemtypes({ $patron ? ( categorycode => $patron->categorycode ) : () }); } foreach my $res (@newresults) { @@ -705,10 +705,7 @@ for (my $i=0;$i<@servers;$i++) { } # BZ17530: 'Intelligent' guess if result can be article requested - $res->{artreqpossible} = Koha::Biblio->may_article_request({ - categorycode => $categorycode, - itemtype => $res->{itemtype}, - }); + $res->{artreqpossible} = ( $art_req_itypes->{ $res->{itemtype} // q{} } || $art_req_itypes->{ '*' } ) ? 1 : q{}; } if ($results_hashref->{$server}->{"hits"}){ --- a/t/db_dependent/ArticleRequests.t +++ a/t/db_dependent/ArticleRequests.t @@ -221,7 +221,7 @@ subtest 'search_limited' => sub { }; subtest 'may_article_request' => sub { - plan tests => 6; + plan tests => 3; # mocking t::lib::Mocks::mock_preference('ArticleRequests', 1); @@ -231,18 +231,10 @@ subtest 'may_article_request' => sub { 'PT' => { 'BK' => 1 }, }); - # tests for class method call - is( Koha::Biblio->may_article_request({ itemtype => 'CR' }), 1, 'SER/* should be true' ); - is( Koha::Biblio->may_article_request({ itemtype => 'CR', categorycode => 'S' }), 1, 'SER/S should be true' ); - is( Koha::Biblio->may_article_request({ itemtype => 'CR', categorycode => 'PT' }), '', 'SER/PT should be false' ); - - # tests for instance method call - my $builder = t::lib::TestBuilder->new; - my $biblio = $builder->build_object({ class => 'Koha::Biblios' }); - my $biblioitem = $builder->build_object({ class => 'Koha::Biblioitems', value => { biblionumber => $biblio->biblionumber, itemtype => 'BK' }}); - is( $biblio->may_article_request, '', 'BK/* false' ); - is( $biblio->may_article_request({ categorycode => 'S' }), 1, 'BK/S true' ); - is( $biblio->may_article_request({ categorycode => 'PT' }), 1, 'BK/PT true' ); + my $itemtype = Koha::ItemTypes->find('CR') // Koha::ItemType->new({ itemtype => 'CR' })->store; + is( $itemtype->may_article_request, 1, 'SER/* should be true' ); + is( $itemtype->may_article_request({ categorycode => 'S' }), 1, 'SER/S should be true' ); + is( $itemtype->may_article_request({ categorycode => 'PT' }), '', 'SER/PT should be false' ); # Cleanup $cache->clear_from_cache( Koha::IssuingRules::GUESSED_ITEMTYPES_KEY ); --