Bugzilla – Attachment 140162 Details for
Bug 22322
Self-checkin module should provide for automatic logins (like self-checkout)
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
Bug 22322: Self check-in without log in
Bug-22322-Self-check-in-without-log-in.patch (text/plain), 18.99 KB, created by
ByWater Sandboxes
on 2022-09-02 15:46:08 UTC
(
hide
)
Description:
Bug 22322: Self check-in without log in
Filename:
MIME Type:
Creator:
ByWater Sandboxes
Created:
2022-09-02 15:46:08 UTC
Size:
18.99 KB
patch
obsolete
>From c8ce5350141d4a7c35c6f9255e752e694f21179e Mon Sep 17 00:00:00 2001 >From: Johanna Raisa <johanna.raisa@gmail.com> >Date: Wed, 10 Jul 2019 13:42:25 +0300 >Subject: [PATCH] Bug 22322: Self check-in without log in > >One should be able to return loans via SCO without >login required. This patch adds check in box where >patrons can check in their loans with barcode. > >To test: >1. Set "SelfCheckoutByLogin" as "cardnumber". >2. Find patron with loan or add one. >3. Go to /cgi-bin/koha/sco/sco-main.pl >4. Return loan by passing items barcode >=> confirm loans is returned succesfully > >Sponsored-by: Koha-Suomi Oy > >Signed-off-by: Lucy Vaux-Harvey <lucy.vaux-harvey@ptfs-europe.com> >--- > .../en/includes/masthead-sco-self.inc | 35 ++++++ > .../bootstrap/en/modules/sco/help.tt | 2 +- > .../bootstrap/en/modules/sco/sco-main.tt | 108 ++++++++++++++---- > opac/sco/sco-main.pl | 83 ++++++++++++-- > 4 files changed, 198 insertions(+), 30 deletions(-) > create mode 100644 koha-tmpl/opac-tmpl/bootstrap/en/includes/masthead-sco-self.inc > >diff --git a/koha-tmpl/opac-tmpl/bootstrap/en/includes/masthead-sco-self.inc b/koha-tmpl/opac-tmpl/bootstrap/en/includes/masthead-sco-self.inc >new file mode 100644 >index 0000000000..c6be929d7e >--- /dev/null >+++ b/koha-tmpl/opac-tmpl/bootstrap/en/includes/masthead-sco-self.inc >@@ -0,0 +1,35 @@ >+[% USE Koha %] >+[% SET OpacLangSelectorMode = Koha.Preference('OpacLangSelectorMode') %] >+<!-- <div id="wrap"> --> >+ <div class="navbar navbar-inverse navbar-static-top navbar-black"> >+ <div class="navbar-inner navbar-black"> >+ <div class="container-fluid navbar-black"> >+ <a class="brand" href="/cgi-bin/koha/sco/sco-main.pl"><img src="[% interface %]/[% theme %]/images/koha-logo-navbar.png" alt=""></a> >+ <div id="checkouthelp"> >+ <ul class="nav pull-right"> >+ <li><a href="/cgi-bin/koha/sco/help.pl"><i class="icon help"></i> Help</a></li> >+ </ul> >+ </div> >+ >+ [% IF ( opaclanguagesdisplay ) %] >+ <div id="members"> >+ <ul class="nav pull-right"> >+ [% INCLUDE 'masthead-langmenu.inc' %] >+ </ul> >+ </div> <!-- /members --> >+ [% END # / IF opaclanguagedisplay %] >+ >+ </div> <!-- /container-fluid --> >+ </div> <!-- /navbar-inner --> >+ </div> <!-- /navbar --> >+<!-- </div> --> >+ >+ [% IF ( opacheader ) %] >+ <div class="container-fluid"> >+ <div class="row-fluid"> >+ <div id="opacheader"> >+ [% opacheader %] >+ </div> >+ </div> >+ </div> >+ [% END %] >diff --git a/koha-tmpl/opac-tmpl/bootstrap/en/modules/sco/help.tt b/koha-tmpl/opac-tmpl/bootstrap/en/modules/sco/help.tt >index 131a4bf698..58a0541762 100644 >--- a/koha-tmpl/opac-tmpl/bootstrap/en/modules/sco/help.tt >+++ b/koha-tmpl/opac-tmpl/bootstrap/en/modules/sco/help.tt >@@ -17,7 +17,7 @@ > </script> > </head> > <body id="sco_help" class="sco"> >- [% INCLUDE 'masthead-sco.inc' %] >+[% INCLUDE 'masthead-sco-self.inc' %] > > <div class="main"> > <div class="container-fluid"> >diff --git a/koha-tmpl/opac-tmpl/bootstrap/en/modules/sco/sco-main.tt b/koha-tmpl/opac-tmpl/bootstrap/en/modules/sco/sco-main.tt >index 7feec7e2fc..e965bcefac 100644 >--- a/koha-tmpl/opac-tmpl/bootstrap/en/modules/sco/sco-main.tt >+++ b/koha-tmpl/opac-tmpl/bootstrap/en/modules/sco/sco-main.tt >@@ -35,9 +35,9 @@ > [% Asset.js('js/i18n.js') | $raw %] > </head> > <body id="sco_main" class="sco" onload="dofocus();" onunload="mungeHistory();"> >- [% INCLUDE 'masthead-sco.inc' %] >+[% INCLUDE 'masthead-sco.inc' %] > >- <div class="main"> >+ <div class="main"> > <div class="container-fluid"> > <div class="row"> > [% IF ( display_patron_image ) %] >@@ -401,32 +401,48 @@ > </div> > </div> > [% ELSE # IF validuser %] >- <div class="sco_entry" > >+ <div class="row"> >+ <div class="sco_entry col-5" > >+ <h4>Check out</h4> > <form id="mainform" action="/cgi-bin/koha/sco/sco-main.pl" name="mainform" method="post"> > <fieldset> > [% IF ( Koha.Preference('SelfCheckoutByLogin') ) %] >- <legend>Log in to your account</legend> >- <label for="patronlogin">Login:</label> >- <input type="text" id="patronlogin" class="focus noEnterSubmit" size="20" name="patronlogin" autocomplete="off"/> >- <label for="patronpw">Password:</label> >- <input type="password" id="patronpw" size="20" name="patronpw" autocomplete="off"/> >- <fieldset class="action"> >- <button type="submit" class="btn btn-primary">Log in</button> >- </fieldset> >- [% ELSE %] >- <div class="form-row"> >- <div class="col-auto"> >- <label for="patronid">Please enter your card number:</label> >+ <div class="row mb-2"> >+ <div class="col-3"> >+ <label for="patronlogin">Username:</label> > </div> >+ <div class="col-5"> >+ <input type="text" id="patronlogin" class="form-control focus noEnterSubmit" size="20" name="patronlogin" autocomplete="off"/> >+ </div> >+ </div> >+ <div class="row mb-2"> > <div class="col-3"> >- <input type="text" id="patronid" class="form-control focus" size="20" name="patronid" autocomplete="off" /> >+ <label for="patronpw">Password:</label> >+ </div> >+ <div class="col-5"> >+ <input type="password" id="patronpw" class="form-control" size="20" name="patronpw" autocomplete="off"/> > </div> >- <div class="col-auto"> >- <button type="submit" class="btn btn-primary">Submit</button> >+ </div> >+ <div class="row justify-content-end"> >+ <div class="col-6"> >+ <fieldset class="action"> >+ <button type="submit" class="btn btn-primary">Log in</button> >+ </fieldset> > </div> >- </div> <!-- /.form-row --> >+ </div> >+ [% ELSE %] >+ <div class="row"> >+ <div class="col-auto"> >+ <label for="patronid">Please enter your card number:</label> >+ </div> >+ <div class="col-4"> >+ <input type="text" id="patronid" class="form-control focus" size="20" name="patronid" autocomplete="off" /> >+ </div> >+ <div class="col"> >+ <button type="submit" class="btn btn-primary">Submit</button> >+ </div> >+ </div> > [% END %] >- > [% FOREACH INPUT IN INPUTS %] > <input type="hidden" name="[% INPUT.name | html %]" value="[% INPUT.value | html %]"> > [% END %] >@@ -434,13 +450,45 @@ > </fieldset> > </form> > </div> <!-- / .sco_entry --> >+ <div class="sco_entry col" > >+ <form id="barcodeform" action="/cgi-bin/koha/sco/sco-main.pl" name="barcodeform" method="post"> >+ <fieldset> >+ <div class="row"> >+ <div class="col"> >+ <h4>Check in</h4> >+ </div> >+ </div> >+ <div class="row"> >+ <div class="col-auto"> >+ <label for="uibarcode">Please enter barcode:</label> >+ </div> >+ <div class="col-3"> >+ [% IF ( checkinmessage ) %] >+ <input type="text" id="uibarcode" class="form-control focus" name="uibarcode" autocomplete="off" /> >+ [% ELSE %] >+ <input type="text" id="uibarcode" class="form-control" name="uibarcode" autocomplete="off" /> >+ [% END %] >+ </div> >+ <div class="col"> >+ <button type="submit" class="btn btn-primary">Submit</button> >+ </div> >+ </div> >+ [% FOREACH INPUT IN INPUTS %] >+ <input type="hidden" name="[% INPUT.name |html %]" value="[% INPUT.value |html %]"> >+ [% END %] >+ <input type="hidden" name="op" value="checkin" /> >+ </fieldset> >+ </form> >+ </div> <!-- / .sco_entry --> >+ </div> <!-- / .row --> > [% END # / IF validuser %] > [% END # / UNLESS ( hide_main %] >+ <b>[% checkinmessage %]</b> > [% IF ( Koha.Preference('SCOMainUserBlock' ) ) %]<div id="scomainuserblock">[% Koha.Preference('SCOMainUserBlock' ) | $raw %]</div>[% END %] > </div> <!-- / .span12 --> > </div> <!-- / .row --> > </div> <!-- / .container-fluid --> >- </div> <!-- / .main --> >+ </div> <!-- / .main --> > <span id="audio-alert"></span> > > [% INCLUDE 'opac-bottom.inc' %] >@@ -502,7 +550,7 @@ > > $(document).ready(function() { > dofocus(); >- [% IF ( patronid ) %]sco_init();[% END %] >+ [% IF ( patronid || uibarcode ) %]sco_init();[% END %] > $("#loanTable").dataTable($.extend(true, {}, dataTablesDefaults, { > "dom": "t", > "order": [ 0 ], >@@ -513,6 +561,7 @@ > ] > })); > >+ > $("#logout_form").on("click", function(e){ > e.preventDefault(e); > clearTimeout(mainTimeout); >@@ -529,7 +578,22 @@ > [% ELSE %] > location.href = '/cgi-bin/koha/sco/sco-main.pl?op=logout'; > [% END %] >+ return true; >+ }); > >+ $("#logout_form_vara").on("click", function() { >+ clearTimeout(mainTimeout); >+ [% IF Koha.Preference('SelfCheckReceiptPrompt') %] >+ var confirmStart = Date.now(); >+ if(confirm(_("Would you like to print a receipt?"))){ >+ if ( (Date.now() - confirmStart) < [% SelfCheckTimeout %] ) { >+ window.open("/cgi-bin/koha/sco/printslip.pl?borrowernumber=[% borrowernumber %]&print=qslip"); >+ } >+ else { >+ alert(_("Timeout while waiting for print confirmation")); >+ } >+ } >+ [% END %] > return true; > }); > }); >diff --git a/opac/sco/sco-main.pl b/opac/sco/sco-main.pl >index ac89db749c..fb893ec026 100755 >--- a/opac/sco/sco-main.pl >+++ b/opac/sco/sco-main.pl >@@ -33,10 +33,12 @@ use Modern::Perl; > use CGI qw ( -utf8 ); > > use C4::Auth qw( in_iprange get_template_and_user checkpw ); >-use C4::Circulation qw( barcodedecode AddReturn CanBookBeIssued AddIssue CanBookBeRenewed AddRenewal ); >-use C4::Reserves; >+use C4::Circulation qw( barcodedecode AddReturn CanBookBeIssued AddIssue CanBookBeRenewed AddRenewal updateWrongTransfer ); >+use C4::Reserves qw( ModReserveAffect ); > use C4::Output qw( output_html_with_http_headers ); > use C4::Members; >+use C4::Biblio qw( GetBiblioData ); >+use C4::Items qw( ModItemTransfer ); > use Koha::DateUtils qw( dt_from_string ); > use Koha::Acquisition::Currencies; > use Koha::Items; >@@ -45,6 +47,7 @@ use Koha::Patron::Images; > use Koha::Patron::Messages; > use Koha::Plugins; > use Koha::Token; >+use Koha::Calendar; > > my $query = CGI->new; > >@@ -73,9 +76,11 @@ $query->param(-name=>'sco_user_login',-values=>[1]); > my ( $template, $loggedinuser, $cookie ) = get_template_and_user( > { > template_name => "sco/sco-main.tt", >+ authnotrequired => 0, > flagsrequired => { self_check => "self_checkout_module" }, > query => $query, > type => "opac", >+ debug => 1, > } > ); > >@@ -93,13 +98,15 @@ if (defined C4::Context->preference('SCOAllowCheckin')) { > } > > my $issuerid = $loggedinuser; >-my ($op, $patronlogin, $patronpw, $barcode, $confirmed, $newissues) = ( >+my ($op, $patronlogin, $patronpw, $barcode, $confirmed, $newissues, $uibarcode, $checkinmessage) = ( > $query->param("op") || '', > $query->param("patronlogin")|| '', > $query->param("patronpw") || '', > $query->param("barcode") || '', > $query->param("confirmed") || '', > $query->param("newissues") || '', >+ $query->param("uibarcode") || '', >+ $query->param("checkinmessage") || undef, > ); > > my $jwt = $query->cookie('JWT'); >@@ -115,6 +122,18 @@ my @newissueslist = split /,/, $newissues; > my $issuenoconfirm = 1; #don't need to confirm on issue. > my $issuer = Koha::Patrons->find( $issuerid )->unblessed; > >+my $checkinitem; >+my $checkinbranchcode; >+my $userenv = C4::Context->userenv; >+my $userenv_branch = $userenv->{'branch'} // ''; >+my $daysmode = Koha::CirculationRules->get_effective_daysmode( >+ { >+ branchcode => $userenv_branch, >+ } >+); >+my $calendar = Koha::Calendar->new( branchcode => $userenv_branch, days_mode => $daysmode ); >+my $today = DateTime->now( time_zone => C4::Context->tz()); >+ > my $patronid = $jwt ? Koha::Token->new->decode_jwt({ token => $jwt }) : undef; > unless ( $patronid ) { > if ( C4::Context->preference('SelfCheckoutByLogin') ) { >@@ -139,7 +158,7 @@ my $branch = $issuer->{branchcode}; > my $confirm_required = 0; > my $return_only = 0; > >-if ( $patron && $op eq "returnbook" && $allowselfcheckreturns ) { >+if ( ( $op eq "checkin" && $uibarcode ) || $patron && $op eq "returnbook" && $allowselfcheckreturns ) { > my $success = 1; > > >@@ -152,16 +171,66 @@ if ( $patron && $op eq "returnbook" && $allowselfcheckreturns ) { > } > } > >- if ($success) { >+ if ($success && ( $op ne "checkin" && !$uibarcode )) { > # Patron cannot checkin an item they don't own > $success = 0 > unless $patron->checkouts->find( { itemnumber => $item->itemnumber } ); > } > >- if ( $success ) { >- ($success) = AddReturn( $barcode, $branch ) >+ $uibarcode =~ s/^\s+|\s+$//g; >+ $checkinitem = Koha::Items->find({ barcode => $uibarcode }); >+ if( !$checkinitem ){ >+ $checkinmessage = "Item not found."; >+ } >+ my $tobranch = $checkinitem->homebranch; >+ >+ my ($return_success,$messages,$issueinformation,$borrower) = AddReturn($uibarcode,$branch,undef,$today) unless !$success; >+ >+ my $needstransfer = $messages->{'NeedsTransfer'}; >+ if($messages->{'ResFound'}) { >+ my $reserve = $messages->{'ResFound'}; >+ my $reserve_id = $reserve->{'reserve_id'}; >+ my $resborrower = $reserve->{'borrowernumber'}; >+ my $diffBranchReturned = $reserve->{'branchcode'}; >+ my $itemnumber = $checkinitem->itemnumber; >+ my $diffBranchSend = ($branch ne $diffBranchReturned) ? $diffBranchReturned : undef; >+ if($diffBranchSend) { >+ ModReserveAffect( $itemnumber, $resborrower, $diffBranchSend, $reserve_id); >+ ModItemTransfer($itemnumber,$branch,$diffBranchReturned, 'ResFound'); >+ } >+ else { >+ my $settransit = C4::Context->preference('RequireSCCheckInBeforeNotifyingPickups') ? 1 : 0; >+ ModReserveAffect( $itemnumber, $resborrower, $settransit, $reserve_id); >+ } >+ $borrower = Koha::Patrons->find({ cardnumber => $patronid }); >+ } >+ else { >+ if($needstransfer) { >+ ModItemTransfer($checkinitem->itemnumber, $branch, $tobranch, 'NeedsTransfer'); >+ } >+ } >+ >+ if($messages->{'WrongTransfer'}) { >+ updateWrongTransfer($checkinitem->itemnumber,$tobranch,$branch); >+ } >+ >+ my $biblio = Koha::Biblios->find({ biblionumber => $checkinitem->biblionumber }); >+ if ( $biblio && ( $success || $return_success )) { >+ $checkinmessage = "Returned ".$biblio->title; >+ } >+ >+ if ( $issuer ) { >+ $checkinbranchcode = $issuer->{branchcode}; >+ #home branch of item >+ if ($checkinbranchcode) { >+ my $checkinlibrary = Koha::Libraries->find( $checkinbranchcode ); >+ $checkinmessage.=", ".$checkinlibrary->branchname; >+ } > } > >+ $template->param(checkinmessage => $checkinmessage || undef); >+ $template->param(SelfCheckTimeout => 10000); #don't show returns long >+ $template->param(uibarcode => $uibarcode); > $template->param( returned => $success ); > } > elsif ( $patron && ( $op eq 'checkout' ) ) { >-- >2.30.2
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
|
Splinter Review
Attachments on
bug 22322
:
123299
|
139170
|
140162
|
143764
|
150770
|
150776
|
161722
|
161723
|
165722
|
165723