From f1c14d25d1bcf1cacb7bdeef3bfc7581f5c830ec 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 Signed-off-by: Katrin Fischer Signed-off-by: Marcel de Rooy Signed-off-by: Jonathan Druart --- 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 202ed7e7a3..a257017dc7 100644 --- a/C4/Acquisition.pm +++ b/C4/Acquisition.pm @@ -2288,6 +2288,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 @@ -2355,10 +2371,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 0475872fb9..891dbf0f28 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.39.5