From d4dd7bc4f7e98aec17ba9d5e8d493da69dbbcb6a Mon Sep 17 00:00:00 2001 From: David Bourgault Date: Mon, 25 Sep 2017 16:22:51 -0400 Subject: [PATCH] Bug 17457 - Adv. Acquisition search with ISBN variations Advanced acquisition search will now follow the "SearchWithISBNVariations" system preference. Test plan : 0) Make sure you have orders pending or completed 1) Enable SearchWithISBNVariations if it is not enabled 2) Search for one of your orders by its ISBN, it should appear 3) Search for the same order by a variation of its ISBN, I used this website to find it : http://www.hahnlibrary.net/libraries/isbncalc.html You should not get a result. 4) Apply patch 5) Repeat step 2-3. You should get a hit both times. 6) prove t/db_dependent/Acquisition.t --- C4/Acquisition.pm | 25 ++++++++++++++++++++++--- t/db_dependent/Acquisition.t | 39 ++++++++++++++++++++++++++++++++++++--- 2 files changed, 58 insertions(+), 6 deletions(-) diff --git a/C4/Acquisition.pm b/C4/Acquisition.pm index 7639fef..3d0b9e1 100644 --- a/C4/Acquisition.pm +++ b/C4/Acquisition.pm @@ -2282,6 +2282,22 @@ sub GetHistory { my $total_qtyreceived = 0; my $total_price = 0; + #get variation of isbn + my @isbn_params; + my @isbns; + if ($isbn){ + if ( C4::Context->preference("SearchWithISBNVariations") ){ + @isbns = C4::Koha::GetVariationsOfISBN( $isbn ); + foreach my $isb (@isbns){ + push @isbn_params, '?'; + } + } + unless (@isbns){ + push @isbns, $isbn; + push @isbn_params, '?'; + } + } + my $dbh = C4::Context->dbh; my $query =" SELECT @@ -2349,10 +2365,13 @@ sub GetHistory { push @query_params, "%$author%"; } - if ( $isbn ) { - $query .= " AND biblioitems.isbn LIKE ? "; - push @query_params, "%$isbn%"; + if ( @isbns ) { + $query .= " AND ( biblioitems.isbn LIKE " . join (" OR biblioitems.isbn LIKE ", @isbn_params ) . ")"; + foreach my $isb (@isbns){ + push @query_params, "%$isb%"; + } } + if ( $ean ) { $query .= " AND biblioitems.ean = ? "; push @query_params, "$ean"; diff --git a/t/db_dependent/Acquisition.t b/t/db_dependent/Acquisition.t index 62a9a76..3dd93a8 100755 --- a/t/db_dependent/Acquisition.t +++ b/t/db_dependent/Acquisition.t @@ -19,9 +19,12 @@ use Modern::Perl; use POSIX qw(strftime); -use Test::More tests => 65; +use Test::More tests => 67; +use t::lib::Mocks; use Koha::Database; +use MARC::File::XML ( BinaryEncoding => 'utf8', RecordFormat => 'MARC21' ); + BEGIN { use_ok('C4::Acquisition'); use_ok('C4::Biblio'); @@ -161,18 +164,38 @@ my $budgetid = C4::Budgets::AddBudget( ); my $budget = C4::Budgets::GetBudget($budgetid); +# Prepare a sample MARC record with a ISBN to test GetHistory() +my $marcxml = qq{ + + + 03108cam a2200277 i 4500 + a2526595 + Koha + 20170306104815.0 + m o d + cr ||||||||||| + 150723s2016 vau b 000 0 eng d + + 9780136019701 + + +}; + my @ordernumbers; my ( $biblionumber1, $biblioitemnumber1 ) = AddBiblio( MARC::Record->new, '' ); my ( $biblionumber2, $biblioitemnumber2 ) = AddBiblio( MARC::Record->new, '' ); my ( $biblionumber3, $biblioitemnumber3 ) = AddBiblio( MARC::Record->new, '' ); my ( $biblionumber4, $biblioitemnumber4 ) = AddBiblio( MARC::Record->new, '' ); -my ( $biblionumber5, $biblioitemnumber5 ) = AddBiblio( MARC::Record->new, '' ); +my ( $biblionumber5, $biblioitemnumber5 ) = AddBiblio( MARC::Record->new_from_xml( $marcxml, 'utf8', 'MARC21' ), '' ); # Prepare 5 orders, and make distinction beween fields to be tested with eq and with == # Ex : a price of 50.1 will be stored internally as 5.100000 my @order_content = ( - { + { str => { basketno => $basketno, biblionumber => $biblionumber1, @@ -433,6 +456,16 @@ is( scalar( @$orders ), 1, 'GetHistory with a given ordernumber returns 1 order' $orders = GetHistory( ordernumber => $ordernumbers[1], search_children_too => 1 ); is( scalar( @$orders ), 2, 'GetHistory with a given ordernumber and search_children_too set returns 2 orders' ); +# Test GetHistory() with and without SearchWithISBNVariations +# The ISBN passed as a param is the ISBN-10 version of the 13-digit ISBN in the sample record declared in $marcxml +t::lib::Mocks::mock_preference('SearchWithISBNVariations', 0); +$orders = GetHistory( isbn => '0136019706' ); +is( scalar(@$orders), 0, "GetHistory searches correctly by ISBN" ); + +t::lib::Mocks::mock_preference('SearchWithISBNVariations', 1); +$orders = GetHistory( isbn => '0136019706' ); +is( scalar(@$orders), 1, "GetHistory searches correctly by ISBN" ); + my $budgetid2 = C4::Budgets::AddBudget( { budget_code => "budget_code_test_modrecv", -- 2.7.4