X-Git-Url: http://koha-dev.rot13.org:8081/gitweb/?a=blobdiff_plain;f=opac%2Fsco%2Fsco-main.pl;h=40d591519b154a916a5125dd16bd8526f2ac4d9c;hb=9d6d641d1f8b77271800f43bc027b651f9aea52b;hp=243dddd064d71dde4cf34794831322b66e8442e5;hpb=6eb021ab0e113e2b6b897c89475f1eadc7a2c15b;p=srvgit diff --git a/opac/sco/sco-main.pl b/opac/sco/sco-main.pl index 243dddd064..40d591519b 100755 --- a/opac/sco/sco-main.pl +++ b/opac/sco/sco-main.pl @@ -6,18 +6,18 @@ # # This file is part of Koha. # -# Koha is free software; you can redistribute it and/or modify it under the -# terms of the GNU General Public License as published by the Free Software -# Foundation; either version 2 of the License, or (at your option) any later -# version. +# Koha is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. # -# Koha is distributed in the hope that it will be useful, but WITHOUT ANY -# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR -# A PARTICULAR PURPOSE. See the GNU General Public License for more details. +# Koha is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. # -# You should have received a copy of the GNU General Public License along -# with Koha; if not, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# You should have received a copy of the GNU General Public License +# along with Koha; if not, see . # We're going to authenticate a self-check user. we'll add a flag to borrowers 'selfcheck' # @@ -31,22 +31,24 @@ # # FIXME: inputfocus not really used in TMPL -use strict; -use warnings; +use Modern::Perl; -use CGI; -use Digest::MD5 qw(md5_base64); +use CGI qw ( -utf8 ); -use C4::Auth qw(get_template_and_user checkpw); -use C4::Koha; -use C4::Circulation; +use C4::Auth qw( in_iprange get_template_and_user checkpw ); +use C4::Circulation qw( AddReturn CanBookBeIssued AddIssue CanBookBeRenewed AddRenewal ); use C4::Reserves; -use C4::Output; +use C4::Output qw( output_html_with_http_headers ); use C4::Members; -use C4::Biblio; -use C4::Items; +use Koha::DateUtils qw( dt_from_string ); +use Koha::Acquisition::Currencies; +use Koha::Items; +use Koha::Patrons; +use Koha::Patron::Images; +use Koha::Patron::Messages; +use Koha::Token; -my $query = new CGI; +my $query = CGI->new; unless (C4::Context->preference('WebBasedSelfCheck')) { # redirect to OPAC home if self-check is not enabled @@ -54,64 +56,70 @@ unless (C4::Context->preference('WebBasedSelfCheck')) { exit; } -if (C4::Context->preference('AutoSelfCheckAllowed')) -{ - my $AutoSelfCheckID = C4::Context->preference('AutoSelfCheckID'); - my $AutoSelfCheckPass = C4::Context->preference('AutoSelfCheckPass'); - $query->param(-name=>'userid',-values=>[$AutoSelfCheckID]); - $query->param(-name=>'password',-values=>[$AutoSelfCheckPass]); - $query->param(-name=>'koha_login_context',-values=>['sco']); +unless ( in_iprange(C4::Context->preference('SelfCheckAllowByIPRanges')) ) { + # redirect to OPAC home if self-checkout not permitted from current IP + print $query->redirect("/cgi-bin/koha/opac-main.pl"); + exit; } -my ($template, $loggedinuser, $cookie) = get_template_and_user({ - template_name => "sco/sco-main.tmpl", - authnotrequired => 0, - flagsrequired => { circulate => "circulate_remaining_permissions" }, - query => $query, - type => "opac", - debug => 1, -}); -if (C4::Context->preference('SelfCheckoutByLogin')) + +if (C4::Context->preference('AutoSelfCheckAllowed')) { - $template->param(authbylogin => 1); + my $AutoSelfCheckID = C4::Context->preference('AutoSelfCheckID'); + my $AutoSelfCheckPass = C4::Context->preference('AutoSelfCheckPass'); + $query->param(-name=>'userid',-values=>[$AutoSelfCheckID]); + $query->param(-name=>'password',-values=>[$AutoSelfCheckPass]); + $query->param(-name=>'koha_login_context',-values=>['sco']); } +$query->param(-name=>'sco_user_login',-values=>[1]); + +my ( $template, $loggedinuser, $cookie ) = get_template_and_user( + { + template_name => "sco/sco-main.tt", + flagsrequired => { self_check => "self_checkout_module" }, + query => $query, + type => "opac", + } +); # Get the self checkout timeout preference, or use 120 seconds as a default my $selfchecktimeout = 120000; if (C4::Context->preference('SelfCheckTimeout')) { $selfchecktimeout = C4::Context->preference('SelfCheckTimeout') * 1000; } -$template->param(SelfCheckTimeout => $selfchecktimeout); +$template->param( SelfCheckTimeout => $selfchecktimeout ); -# Checks policy laid out by AllowSelfCheckReturns, defaults to 'on' if preference is undefined +# Checks policy laid out by SCOAllowCheckin, defaults to 'on' if preference is undefined my $allowselfcheckreturns = 1; -if (defined C4::Context->preference('AllowSelfCheckReturns')) { - $allowselfcheckreturns = C4::Context->preference('AllowSelfCheckReturns'); +if (defined C4::Context->preference('SCOAllowCheckin')) { + $allowselfcheckreturns = C4::Context->preference('SCOAllowCheckin'); } -$template->param(AllowSelfCheckReturns => $allowselfcheckreturns); - my $issuerid = $loggedinuser; -my ($op, $patronid, $patronlogin, $patronpw, $barcode, $confirmed, $timedout) = ( +my ($op, $patronid, $patronlogin, $patronpw, $barcode, $confirmed, $newissues) = ( $query->param("op") || '', $query->param("patronid") || '', $query->param("patronlogin")|| '', $query->param("patronpw") || '', $query->param("barcode") || '', $query->param("confirmed") || '', - $query->param("timedout") || '', #not actually using this... + $query->param("newissues") || '', ); +my @newissueslist = split /,/, $newissues; my $issuenoconfirm = 1; #don't need to confirm on issue. -#warn "issuerid: " . $issuerid; -my $issuer = GetMemberDetails($issuerid); -my $item = GetItem(undef,$barcode); +my $issuer = Koha::Patrons->find( $issuerid )->unblessed; +my $item = Koha::Items->find({ barcode => $barcode }); if (C4::Context->preference('SelfCheckoutByLogin') && !$patronid) { my $dbh = C4::Context->dbh; my $resval; ($resval, $patronid) = checkpw($dbh, $patronlogin, $patronpw); } -my $borrower = GetMemberDetails(undef,$patronid); +my ( $borrower, $patron ); +if ( $patronid ) { + $patron = Koha::Patrons->find( { cardnumber => $patronid } ); + $borrower = $patron->unblessed if $patron; +} my $branch = $issuer->{branchcode}; my $confirm_required = 0; @@ -119,43 +127,60 @@ my $return_only = 0; #warn "issuer cardnumber: " . $issuer->{cardnumber}; #warn "patron cardnumber: " . $borrower->{cardnumber}; if ($op eq "logout") { + $template->param( loggedout => 1 ); $query->param( patronid => undef, patronlogin => undef, patronpw => undef ); } elsif ( $op eq "returnbook" && $allowselfcheckreturns ) { - my ($doreturn) = AddReturn( $barcode, $branch ); - #warn "returnbook: " . $doreturn; - $borrower = GetMemberDetails(undef,$patronid); + my $success = 0; + my $human_required = 0; + if ( C4::Context->preference("CircConfirmItemParts") ) { + my $item = Koha::Items->find( { barcode => $barcode } ); + if ( defined($item) + && $item->materials ) + { + $human_required = 1; + } + } + + ($success) = AddReturn( $barcode, $branch ) + unless $human_required; + $template->param( returned => $success ); } -elsif ( $op eq "checkout" ) { +elsif ( $patron && ( $op eq 'checkout' ) ) { my $impossible = {}; my $needconfirm = {}; - if ( !$confirmed ) { - ( $impossible, $needconfirm ) = CanBookBeIssued( - $borrower, - $barcode, - undef, - 0, - C4::Context->preference("AllowItemsOnHoldCheckout") - ); + ( $impossible, $needconfirm ) = CanBookBeIssued( + $patron, + $barcode, + undef, + 0, + C4::Context->preference("AllowItemsOnHoldCheckoutSCO") + ); + my $issue_error; + if ( $confirm_required = scalar keys %$needconfirm ) { + for my $error ( qw( UNKNOWN_BARCODE max_loans_allowed ISSUED_TO_ANOTHER NO_MORE_RENEWALS NOT_FOR_LOAN DEBT WTHDRAWN RESTRICTED RESERVED ITEMNOTSAMEBRANCH EXPIRED DEBARRED CARD_LOST GNA INVALID_DATE UNKNOWN_BARCODE TOO_MANY DEBT_GUARANTEES DEBT_GUARANTORS USERBLOCKEDOVERDUE PATRON_CANT PREVISSUE NOT_FOR_LOAN_FORCING ITEM_LOST ADDITIONAL_MATERIALS ) ) { + if ( $needconfirm->{$error} ) { + $issue_error = $error; + $confirmed = 0; + last; + } + } } - $confirm_required = scalar keys %$needconfirm; #warn "confirm_required: " . $confirm_required ; if (scalar keys %$impossible) { - # warn "impossible: numkeys: " . scalar (keys(%$impossible)); - #warn join " ", keys %$impossible; - my $issue_error = (keys %$impossible)[0]; + my $issue_error = (keys %$impossible)[0]; # FIXME This is wrong, we assume only one error and keys are not ordered + my $title = ( $item ) ? $item->biblio->title : ''; - # FIXME we assume only one error. $template->param( impossible => $issue_error, "circ_error_$issue_error" => 1, - title => $item->{title}, + title => $title, hide_main => 1, ); if ($issue_error eq 'DEBT') { - $template->param(amount => $impossible->{DEBT}); + $template->param(DEBT => $impossible->{DEBT}); } #warn "issue_error: " . $issue_error ; if ( $issue_error eq "NO_MORE_RENEWALS" ) { @@ -165,42 +190,68 @@ elsif ( $op eq "checkout" ) { barcode => $barcode, ); } - } elsif ( $needconfirm->{RENEW_ISSUE} ) { - if ($confirmed) { - #warn "renewing"; - AddRenewal( $borrower, $item->{itemnumber} ); - } else { - #warn "renew confirmation"; - $template->param( + } elsif ( $needconfirm->{RENEW_ISSUE} ){ + $template->param( renew => 1, barcode => $barcode, confirm => 1, confirm_renew_issue => 1, hide_main => 1, - ); - } + ); } elsif ( $confirm_required && !$confirmed ) { #warn "failed confirmation"; - my $issue_error = (keys %$needconfirm)[0]; $template->param( - impossible => (keys %$needconfirm)[0], + impossible => 1, "circ_error_$issue_error" => 1, hide_main => 1, ); + if ($issue_error eq 'DEBT') { + $template->param(DEBT => $needconfirm->{DEBT}); + } } else { if ( $confirmed || $issuenoconfirm ) { # we'll want to call getpatroninfo again to get updated issues. - # warn "issuing book?"; + my ( $hold_existed, $item ); + if ( C4::Context->preference('HoldFeeMode') eq 'any_time_is_collected' ) { + # There is no easy way to know if the patron has been charged for this item. + # So we check if a hold existed for this item before the check in + $item = Koha::Items->find({ barcode => $barcode }); + $hold_existed = Koha::Holds->search( + { + -and => { + borrowernumber => $borrower->{borrowernumber}, + -or => { + biblionumber => $item->biblionumber, + itemnumber => $item->itemnumber + } + } + } + )->count; + } + AddIssue( $borrower, $barcode ); - # ($borrower, $flags) = getpatroninformation(undef,undef, $patronid); - # $template->param( - # patronid => $patronid, - # validuser => 1, - # ); + $template->param( issued => 1 ); + push @newissueslist, $barcode; + + if ( $hold_existed ) { + my $dtf = Koha::Database->new->schema->storage->datetime_parser; + $template->param( + # If the hold existed before the check in, let's confirm that the charge line exists + # Note that this should not be needed but since we do not have proper exception handling here we do it this way + patron_has_hold_fee => Koha::Account::Lines->search( + { + borrowernumber => $borrower->{borrowernumber}, + debit_type_code => 'RESERVE', + description => $item->biblio->title, + date => $dtf->format_date(dt_from_string) + } + )->count, + ); + } } else { $confirm_required = 1; #warn "issue confirmation"; $template->param( - confirm => "Issuing title: " . $item->{title}, + confirm => "Issuing title: " . $item->biblio->title, barcode => $barcode, hide_main => 1, inputfocus => 'confirm', @@ -209,49 +260,94 @@ elsif ( $op eq "checkout" ) { } } # $op -if ($borrower->{cardnumber}) { +if ( $patron && ( $op eq 'renew' ) ) { + my ($status,$renewerror) = CanBookBeRenewed( $borrower->{borrowernumber}, $item->itemnumber ); + if ($status) { + #warn "renewing"; + AddRenewal( $borrower->{borrowernumber}, $item->itemnumber, undef, undef, undef, undef, 1 ); + push @newissueslist, $barcode; + $template->param( renewed => 1 ); + } +} + +if ($borrower) { # warn "issuer's branchcode: " . $issuer->{branchcode}; # warn "user's branchcode: " . $borrower->{branchcode}; my $borrowername = sprintf "%s %s", ($borrower->{firstname} || ''), ($borrower->{surname} || ''); - my @issues; - my ($issueslist) = GetPendingIssues( $borrower->{'borrowernumber'} ); - foreach my $it (@$issueslist) { - my ($renewokay, $renewerror) = CanBookBeIssued( - $borrower, - $it->{'barcode'}, - undef, - 0, - C4::Context->preference("AllowItemsOnHoldCheckout") + my $pending_checkouts = $patron->pending_checkouts; + my @checkouts; + while ( my $c = $pending_checkouts->next ) { + my $checkout = $c->unblessed_all_relateds; + my ($can_be_renewed, $renew_error) = CanBookBeRenewed( + $borrower->{borrowernumber}, + $checkout->{itemnumber}, ); - $it->{'norenew'} = 1 if $renewokay->{'NO_MORE_RENEWALS'}; - push @issues, $it; + $checkout->{can_be_renewed} = $can_be_renewed; # In the future this will be $checkout->can_be_renewed + $checkout->{renew_error} = $renew_error; + $checkout->{overdue} = $c->is_overdue; + push @checkouts, $checkout; + } + + my $show_priority; + for ( C4::Context->preference("OPACShowHoldQueueDetails") ) { + m/priority/ and $show_priority = 1; + } + + my $account = $patron->account; + my $total = $account->balance; + my $accountlines = $account->lines; + + my $holds = $patron->holds; + my $waiting_holds_count = 0; + + while(my $hold = $holds->next) { + $waiting_holds_count++ if $hold->is_waiting; } $template->param( validuser => 1, borrowername => $borrowername, - issues_count => scalar(@issues), - ISSUES => \@issues, + issues_count => scalar(@checkouts), + ISSUES => \@checkouts, + HOLDS => $holds, + newissues => join(',',@newissueslist), patronid => $patronid, patronlogin => $patronlogin, patronpw => $patronpw, + waiting_holds_count => $waiting_holds_count, noitemlinks => 1 , + borrowernumber => $borrower->{'borrowernumber'}, + SuspendHoldsOpac => C4::Context->preference('SuspendHoldsOpac'), + AutoResumeSuspendedHolds => C4::Context->preference('AutoResumeSuspendedHolds'), + howpriority => $show_priority, + ACCOUNT_LINES => $accountlines, + total => $total, ); + + my $patron_messages = Koha::Patron::Messages->search( + { + borrowernumber => $borrower->{'borrowernumber'}, + message_type => 'B', + } + ); + $template->param( + patron_messages => $patron_messages, + opacnote => $borrower->{opacnote}, + ); + my $inputfocus = ($return_only == 1) ? 'returnbook' : ($confirm_required == 1) ? 'confirm' : 'barcode' ; $template->param( inputfocus => $inputfocus, - nofines => 1, - "dateformat_" . C4::Context->preference('dateformat') => 1, + nofines => 1, + ); if (C4::Context->preference('ShowPatronImageInWebBasedSelfCheck')) { - my ($image, $dberror) = GetPatronImage($borrower->{cardnumber}); - if ($image) { - $template->param( - display_patron_image => 1, - cardnumber => $borrower->{cardnumber}, - ); - } + my $patron_image = Koha::Patron::Images->find($borrower->{borrowernumber}); + $template->param( + display_patron_image => 1, + csrf_token => Koha::Token->new->generate_csrf( { session_id => scalar $query->cookie('CGISESSID') . $borrower->{cardnumber}, id => $borrower->{userid}} ), + ) if $patron_image; } } else { $template->param( @@ -260,4 +356,4 @@ if ($borrower->{cardnumber}) { ); } -output_html_with_http_headers $query, $cookie, $template->output; +output_html_with_http_headers $query, $cookie, $template->output, undef, { force_no_caching => 1 };