From 5a9403316304834ad44bf467269480dd33a1da07 Mon Sep 17 00:00:00 2001
From: Jonathan Druart <jonathan.druart@biblibre.com>
Date: Thu, 17 Jul 2014 13:26:46 +0200
Subject: [PATCH] Bug 12595: Search a patron by his/her firstname and surname

Before bug 9811, if you searched for "John Doe" and only 1 patron with
this firstname/surname existed, the patron detail page was displayed.

Now the result lists all patrons with ( firstname=john or doe ) or (
surname=john or doe). Which is quite annoying when you expect only 1
result.

Test plan:
0/ Create some patrons like: "John Doe", "Jane Doe", "John Smith".
1/ Search for "John Doe" in the patron search box
2/ Verify you got 2 results
3/ Apply the patch
4/ Search for "John Doe" in the patron search box
5/ Verify you are redirected to the right patron detail page.
---
 C4/Utils/DataTables/Members.pm | 25 +++++++++++++------------
 1 file changed, 13 insertions(+), 12 deletions(-)

diff --git a/C4/Utils/DataTables/Members.pm b/C4/Utils/DataTables/Members.pm
index 992d67f..c52007a 100644
--- a/C4/Utils/DataTables/Members.pm
+++ b/C4/Utils/DataTables/Members.pm
@@ -54,7 +54,6 @@ sub search {
 
     # split on coma
     $searchmember =~ s/,/ /g if $searchmember;
-    my @where_strs_or;
     my $searchfields = {
         standard => 'surname,firstname,othernames,cardnumber',
         email => 'email,emailpro,B_email',
@@ -65,21 +64,23 @@ sub search {
         sort1 => 'sort1',
         sort2 => 'sort2',
     };
-    for my $searchfield ( split /,/, $searchfields->{$searchfieldstype} ) {
-        foreach my $term ( split / /, $searchmember) {
-            next unless $term;
-            $searchmember =~ s/\*/%/g; # * is replaced with % for sql
-            $term .= '%' # end with anything
-                if $term !~ /%$/;
-            $term = "%$term" # begin with anythin unless start_with
-                if $term !~ /^%/
-                    and $searchtype eq "contain";
+    foreach my $term ( split / /, $searchmember) {
+        next unless $term;
+        $searchmember =~ s/\*/%/g; # * is replaced with % for sql
+        $term .= '%' # end with anything
+            if $term !~ /%$/;
+        $term = "%$term" # begin with anythin unless start_with
+            if $term !~ /^%/
+                and $searchtype eq "contain";
+        my @where_strs_or;
+        for my $searchfield ( split /,/, $searchfields->{$searchfieldstype} ) {
             push @where_strs_or, "borrowers." . $dbh->quote_identifier($searchfield) . " LIKE ?";
             push @where_args, $term;
         }
+
+        push @where_strs, '('. join (' OR ', @where_strs_or) . ')'
+            if @where_strs_or;
     }
-    push @where_strs, '('. join (' OR ', @where_strs_or) . ')'
-        if @where_strs_or;
 
     my $where;
     $where = " WHERE " . join (" AND ", @where_strs) if @where_strs;
-- 
2.0.0.rc2