From 2902db6bac45640f24120666ada4eeb79f3d461b 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 Content-Type: text/plain; charset=utf-8 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 Signed-off-by: Katrin Fischer Signed-off-by: Marcel de Rooy --- C4/Acquisition.pm | 25 ++++++++++++++++++++++--- t/db_dependent/Acquisition.t | 37 +++++++++++++++++++++++++++++++++++-- 2 files changed, 57 insertions(+), 5 deletions(-) diff --git a/C4/Acquisition.pm b/C4/Acquisition.pm index 15a51dd..7adc416 100644 --- a/C4/Acquisition.pm +++ b/C4/Acquisition.pm @@ -2286,6 +2286,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 @@ -2353,10 +2369,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..35d0521 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,12 +164,32 @@ 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 @@ -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.1.4