From 17793063bf7dda3652b669f60846e64dc3ca9e8e Mon Sep 17 00:00:00 2001
From: Jonathan Druart <jonathan.druart@bugs.koha-community.org>
Date: Mon, 27 Jun 2022 14:51:45 +0200
Subject: [PATCH] Bug 30965: Add patron autocomplete search to curbside pickups

Prior to this patch librarians had to know the cardnumber to search for
patron. Now it's possible to search using the default patron
autocomplete search (name, cardnumber, etc.)

Test plan:
Confirm that you can search for a patron without their cardnumber,
select it and create a curbside pickup

Sponsored-by: Association KohaLa - https://koha-fr.org/
---
 circ/curbside_pickups.pl                      | 30 +++++-------------
 .../prog/en/modules/circ/curbside_pickups.tt  | 31 ++++++++++---------
 2 files changed, 24 insertions(+), 37 deletions(-)

diff --git a/circ/curbside_pickups.pl b/circ/curbside_pickups.pl
index fb1c17475bb..14e835c6535 100755
--- a/circ/curbside_pickups.pl
+++ b/circ/curbside_pickups.pl
@@ -45,31 +45,17 @@ my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
 my $branchcode = C4::Context->userenv()->{'branch'};
 my $libraries = Koha::Libraries->search( {}, { order_by => ['branchname'] } );
 if ( $op eq 'find-patron' ) {
-    my $cardnumber     = $input->param('cardnumber');
     my $borrowernumber = $input->param('borrowernumber');
 
-    my $patron =
-      $cardnumber
-      ? Koha::Patrons->find( { cardnumber => $cardnumber } )
-      : Koha::Patrons->find($borrowernumber);
+    my $patron = Koha::Patrons->find($borrowernumber);
 
-    my $existing_curbside_pickups;
-
-    if ( $patron ){
-        $existing_curbside_pickups = Koha::CurbsidePickups->search(
-            {
-                branchcode                => $branchcode,
-                borrowernumber            => $patron->id,
-                delivered_datetime        => undef,
-            }
-        )->filter_by_scheduled_today;
-    } else {
-        push @messages, {
-            type => 'error',
-            code => 'no_patron_found',
-            cardnumber => $cardnumber
-        };
-    }
+    my $existing_curbside_pickups = Koha::CurbsidePickups->search(
+        {
+            branchcode                => $branchcode,
+            borrowernumber            => $patron->id,
+            delivered_datetime        => undef,
+        }
+    )->filter_by_scheduled_today;
 
     $tab = 'schedule-pickup';
     $template->param(
diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/curbside_pickups.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/circ/curbside_pickups.tt
index 575534c4f43..ac5b80273ba 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/curbside_pickups.tt
+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/circ/curbside_pickups.tt
@@ -83,8 +83,6 @@
                             <span>There are no more pickups available for this slot. Please choose another one.</span>
                         [% CASE 'cannot_checkout' %]
                             <span>Unable to check the items out to [% INCLUDE 'patron-title.inc' patron=m.patron %]</span>
-                        [% CASE 'no_patron_found' %]
-                            <span>No patron found with cardnumber [% m.cardnumber | html %].</span>
                         [% CASE %]
                             <span>[% m.code | html %]</span>
                         [% END %]
@@ -428,20 +426,13 @@
                                     [% patron.firstname | html %] [% patron.surname | html %] ([% patron.cardnumber | html %]) already has a scheduled pickup for this library.
                                 </div>
                             [% END %]
-                            <form method="post" class="form-inline">
-                                <input type="hidden" name="op" value="find-patron"/>
-                                <input type="hidden" name="tab" value="schedule-pickup"/>
-
-                                <div class="form-group">
-                                    <label class="sr-only" for="input-patron-cardnumber">Cardnumber</label>
-                                    <div class="input-group">
-                                        <div class="input-group-addon">Card number</div>
-                                        <input type="text" class="form-control" name="cardnumber" id="input-patron-cardnumber" placeholder="Enter patron cardnumber"/>
-                                    </div>
+                            <div class="form-group">
+                                <label class="sr-only" for="input-patron-cardnumber">Cardnumber</label>
+                                <div class="input-group">
+                                    <div class="input-group-addon">Search a patron</div>
+                                    <input autocomplete="off" id="find-patron" class="form-control" type="text" style="width:25%" class="noEnterSubmit" placeholder="Enter patron cardnumber or name"//>
                                 </div>
-
-                                <button type="submit" class="btn btn-default">Submit</button>
-                            </form>
+                            </div>
                         [% ELSE %]
                             [% SET waiting_holds = patron.holds.search( found => 'W', branchcode => Branches.GetLoggedInBranchcode ) %]
                             [% IF !policy.enable_waiting_holds_only || waiting_holds.count > 0 %]
@@ -504,6 +495,7 @@
     [% Asset.js("lib/dayjs/plugin/isSameOrAfter.js") | $raw %]
     <script>dayjs.extend(window.dayjs_plugin_isSameOrAfter)</script>
     [% INCLUDE 'calendar.inc' %]
+    [% INCLUDE 'js-patron-format.inc' %]
     <script>
         let pickups = [% To.json(curbside_pickups.unblessed) | $raw %];
         let policy = [% To.json(policy.unblessed) | $raw %];
@@ -631,6 +623,15 @@
                 }
                 return true;
             });
+
+            if ( $("#find-patron").length ) {
+                patron_autocomplete($("#find-patron"), { 'on-select-callback': function( event, ui ) {
+                        window.location.href = "/cgi-bin/koha/circ/curbside_pickups.pl?op=find-patron&borrowernumber=" + ui.item.patron_id;
+                        return false;
+                    }
+                });
+            }
+
         });
     </script>
 [% END %]
-- 
2.25.1