Bug 12595: Search a patron by his/her firstname and surname
authorJonathan Druart <jonathan.druart@biblibre.com>
Thu, 17 Jul 2014 11:26:46 +0000 (13:26 +0200)
committerTomas Cohen Arazi <tomascohen@gmail.com>
Fri, 18 Jul 2014 15:36:40 +0000 (12:36 -0300)
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.

Signed-off-by: Dobrica Pavlinusic <dpavlin@rot13.org>
Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com>
Signed-off-by: Tomas Cohen Arazi <tomascohen@gmail.com>
C4/Utils/DataTables/Members.pm

index 992d67f..c52007a 100644 (file)
@@ -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;