X-Git-Url: http://koha-dev.rot13.org:8081/gitweb/?a=blobdiff_plain;ds=sidebyside;f=opac%2Fopac-user.pl;h=d5dc41767fbf4a05f141e1693a836d07b7aa22cd;hb=4d28bc7d3cf2a4e6cb8f384d38b5db984759b9b6;hp=eed4439f8aa26265392ab46d713bc5dbc529960d;hpb=25b2cd1c6526b10bc6a726c4ef8296b87a38de02;p=srvgit diff --git a/opac/opac-user.pl b/opac/opac-user.pl index eed4439f8a..d5dc41767f 100755 --- a/opac/opac-user.pl +++ b/opac/opac-user.pl @@ -3,24 +3,23 @@ # This file is part of Koha. # parts copyright 2010 BibLibre # -# 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 . -use strict; -#use warnings; FIXME - Bug 2505 +use Modern::Perl; -use CGI; +use CGI qw ( -utf8 ); use C4::Auth; use C4::Koha; @@ -33,11 +32,20 @@ use C4::Output; use C4::Biblio; use C4::Items; use C4::Letters; -use C4::Branch; # GetBranches +use Koha::Account::Lines; +use Koha::Libraries; use Koha::DateUtils; +use Koha::Holds; +use Koha::Database; +use Koha::ItemTypes; +use Koha::Patron::Attribute::Types; +use Koha::Patron::Messages; +use Koha::Patron::Discharge; +use Koha::Patrons; use constant ATTRIBUTE_SHOW_BARCODE => 'SHOW_BCODE'; +use Scalar::Util qw(looks_like_number); use Date::Calc qw( Today Add_Delta_Days @@ -53,30 +61,42 @@ BEGIN { } } +# CAS single logout handling +# Will print header and exit +C4::Context->preference('casAuthentication') and C4::Auth_with_cas::logout_if_required($query); + my ( $template, $borrowernumber, $cookie ) = get_template_and_user( { - template_name => "opac-user.tmpl", + template_name => "opac-user.tt", query => $query, type => "opac", authnotrequired => 0, - flagsrequired => { borrow => 1 }, debug => 1, } ); -my $OPACDisplayRequestPriority = (C4::Context->preference("OPACDisplayRequestPriority")) ? 1 : 0; +my %renewed = map { $_ => 1 } split( ':', $query->param('renewed') || '' ); + +my $show_priority; +for ( C4::Context->preference("OPACShowHoldQueueDetails") ) { + m/priority/ and $show_priority = 1; +} + my $patronupdate = $query->param('patronupdate'); my $canrenew = 1; +$template->param( shibbolethAuthentication => C4::Context->config('useshibboleth') ); + # get borrower information .... -my ( $borr ) = GetMemberDetails( $borrowernumber ); +my $patron = Koha::Patrons->find( $borrowernumber ); +my $borr = $patron->unblessed; +# unblessed is a hash vs. object/undef. Hence the use of curly braces here. +my $borcat = $borr ? $borr->{categorycode} : q{}; my ( $today_year, $today_month, $today_day) = Today(); my ($warning_year, $warning_month, $warning_day) = split /-/, $borr->{'dateexpiry'}; -$borr->{'ethnicity'} = fixEthnicity( $borr->{'ethnicity'} ); - -my $debar = $borr->{'debarred'}; +my $debar = Koha::Patrons->find( $borrowernumber )->is_debarred; my $userdebarred; if ($debar) { @@ -85,6 +105,13 @@ if ($debar) { if ( $debar ne "9999-12-31" ) { $borr->{'userdebarreddate'} = $debar; } + # FIXME looks like $available is not needed + # If a user is discharged they have a validated discharge available + my $available = Koha::Patron::Discharge::count({ + borrowernumber => $borrowernumber, + validated => 1, + }); + $template->param( 'discharge_available' => $available && Koha::Patron::Discharge::is_discharged({borrowernumber => $borrowernumber}) ); } if ( $userdebarred || $borr->{'gonenoaddress'} || $borr->{'lost'} ) { @@ -92,33 +119,33 @@ if ( $userdebarred || $borr->{'gonenoaddress'} || $borr->{'lost'} ) { $canrenew = 0; } -if ( $borr->{'amountoutstanding'} > 5 ) { +my $amountoutstanding = $patron->account->balance; +if ( $amountoutstanding > 5 ) { $borr->{'amountoverfive'} = 1; } -if ( 5 >= $borr->{'amountoutstanding'} && $borr->{'amountoutstanding'} > 0 ) { +if ( 5 >= $amountoutstanding && $amountoutstanding > 0 ) { $borr->{'amountoverzero'} = 1; } my $no_renewal_amt = C4::Context->preference( 'OPACFineNoRenewals' ); -$no_renewal_amt ||= 0; +$no_renewal_amt = undef unless looks_like_number( $no_renewal_amt ); -if ( C4::Context->preference( 'OpacRenewalAllowed' ) && $borr->{amountoutstanding} > $no_renewal_amt ) { +if ( C4::Context->preference('OpacRenewalAllowed') + && defined($no_renewal_amt) + && $amountoutstanding > $no_renewal_amt ) +{ $borr->{'flagged'} = 1; $canrenew = 0; $template->param( - renewal_blocked_fines => sprintf( '%.02f', $no_renewal_amt ), + renewal_blocked_fines => $no_renewal_amt, + renewal_blocked_fines_amountoutstanding => $amountoutstanding, ); } -if ( $borr->{'amountoutstanding'} < 0 ) { +if ( $amountoutstanding < 0 ) { $borr->{'amountlessthanzero'} = 1; - $borr->{'amountoutstanding'} = -1 * ( $borr->{'amountoutstanding'} ); + $amountoutstanding = -1 * ( $amountoutstanding ); } -$borr->{'amountoutstanding'} = sprintf "%.02f", $borr->{'amountoutstanding'}; - -my @bordat; -$bordat[0] = $borr; - # Warningdate is the date that the warning starts appearing if ( $borr->{'dateexpiry'} && C4::Context->preference('NotifyBorrowerDeparture') ) { my $days_to_expiry = Date_to_Days( $warning_year, $warning_month, $warning_day ) - Date_to_Days( $today_year, $today_month, $today_day ); @@ -137,12 +164,12 @@ if ( $borr->{'dateexpiry'} && C4::Context->preference('NotifyBorrowerDeparture') # pass on any renew errors to the template for displaying my $renew_error = $query->param('renew_error'); -$template->param( BORROWER_INFO => \@bordat, +$template->param( + amountoutstanding => $amountoutstanding, borrowernumber => $borrowernumber, patron_flagged => $borr->{flagged}, OPACMySummaryHTML => (C4::Context->preference("OPACMySummaryHTML")) ? 1 : 0, surname => $borr->{surname}, - showname => $borr->{showname}, RENEW_ERROR => $renew_error, borrower => $borr, ); @@ -153,38 +180,62 @@ my $count = 0; my $overdues_count = 0; my @overdues; my @issuedat; -my $itemtypes = GetItemTypes(); -my $issues = GetPendingIssues($borrowernumber); -if ($issues){ - foreach my $issue ( sort { $b->{date_due}->datetime() cmp $a->{date_due}->datetime() } @{$issues} ) { +my $itemtypes = { map { $_->{itemtype} => $_ } @{ Koha::ItemTypes->search_with_localization->unblessed } }; +my $pending_checkouts = $patron->pending_checkouts->search({}, { order_by => [ { -desc => 'date_due' }, { -asc => 'issue_id' } ] }); +if ( $pending_checkouts->count ) { # Useless test + while ( my $c = $pending_checkouts->next ) { + my $issue = $c->unblessed_all_relateds; # check for reserves - my ( $restype, $res, undef ) = CheckReserves( $issue->{'itemnumber'} ); + my $restype = GetReserveStatus( $issue->{'itemnumber'} ); if ( $restype ) { $issue->{'reserved'} = 1; } - my ( $total , $accts, $numaccts) = GetMemberAccountRecords( $borrowernumber ); - my $charges = 0; - foreach my $ac (@$accts) { - if ( $ac->{'itemnumber'} == $issue->{'itemnumber'} ) { - $charges += $ac->{'amountoutstanding'} - if $ac->{'accounttype'} eq 'F'; - $charges += $ac->{'amountoutstanding'} - if $ac->{'accounttype'} eq 'L'; + # Must be moved in a module if reused + my $charges = Koha::Account::Lines->search( + { + borrowernumber => $patron->borrowernumber, + amountoutstanding => { '>' => 0 }, + accounttype => [ 'F', 'FU', 'L' ], + itemnumber => $issue->{itemnumber} + }, + ); + $issue->{charges} = $charges->total_outstanding; + + my $rental_fines = Koha::Account::Lines->search( + { + borrowernumber => $patron->borrowernumber, + amountoutstanding => { '>' => 0 }, + accounttype => 'Rent', + itemnumber => $issue->{itemnumber} } - } - $issue->{'charges'} = $charges; - $issue->{'subtitle'} = GetRecordValue('subtitle', GetMarcBiblio($issue->{'biblionumber'}), GetFrameworkCode($issue->{'biblionumber'})); + ); + $issue->{rentalfines} = $rental_fines->total_outstanding + + my $marcrecord = GetMarcBiblio({ + biblionumber => $issue->{'biblionumber'}, + embed_items => 1, + opac => 1, + borcat => $borcat }); + $issue->{'subtitle'} = GetRecordValue('subtitle', $marcrecord, GetFrameworkCode($issue->{'biblionumber'})); # check if item is renewable my ($status,$renewerror) = CanBookBeRenewed( $borrowernumber, $issue->{'itemnumber'} ); ($issue->{'renewcount'},$issue->{'renewsallowed'},$issue->{'renewsleft'}) = GetRenewCount($borrowernumber, $issue->{'itemnumber'}); + ( $issue->{'renewalfee'}, $issue->{'renewalitemtype'} ) = GetIssuingCharges( $issue->{'itemnumber'}, $borrowernumber ); if($status && C4::Context->preference("OpacRenewalAllowed")){ $issue->{'status'} = $status; } + $issue->{'renewed'} = $renewed{ $issue->{'itemnumber'} }; + if ($renewerror) { - $issue->{'too_many'} = 1 if $renewerror eq 'too_many'; - $issue->{'on_reserve'} = 1 if $renewerror eq 'on_reserve'; + $issue->{'too_many'} = 1 if $renewerror eq 'too_many'; + $issue->{'on_reserve'} = 1 if $renewerror eq 'on_reserve'; + $issue->{'norenew_overdue'} = 1 if $renewerror eq 'overdue'; + $issue->{'auto_renew'} = 1 if $renewerror eq 'auto_renew'; + $issue->{'auto_too_soon'} = 1 if $renewerror eq 'auto_too_soon'; + $issue->{'auto_too_late'} = 1 if $renewerror eq 'auto_too_late'; + $issue->{'auto_too_much_oweing'} = 1 if $renewerror eq 'auto_too_much_oweing'; if ( $renewerror eq 'too_soon' ) { $issue->{'too_soon'} = 1; @@ -197,7 +248,7 @@ if ($issues){ } } - if ( $issue->{'overdue'} ) { + if ( $c->is_overdue ) { push @overdues, $issue; $overdues_count++; $issue->{'overdue'} = 1; @@ -216,6 +267,7 @@ if ($issues){ my $isbn = GetNormalizedISBN($issue->{'isbn'}); $issue->{normalized_isbn} = $isbn; + $issue->{normalized_upc} = GetNormalizedUPC( $marcrecord, C4::Context->preference('marcflavour') ); # My Summary HTML if (my $my_summary_html = C4::Context->preference('OPACMySummaryHTML')){ @@ -229,113 +281,30 @@ if ($issues){ } } } +my $overduesblockrenewing = C4::Context->preference('OverduesBlockRenewing'); +$canrenew = 0 if ($overduesblockrenewing ne 'allow' and $overdues_count == $count); + $template->param( ISSUES => \@issuedat ); $template->param( issues_count => $count ); $template->param( canrenew => $canrenew ); $template->param( OVERDUES => \@overdues ); $template->param( overdues_count => $overdues_count ); -my $show_barcode = C4::Members::AttributeTypes::AttributeTypeExists( ATTRIBUTE_SHOW_BARCODE ); +my $show_barcode = Koha::Patron::Attribute::Types->search( + { code => ATTRIBUTE_SHOW_BARCODE } )->count; if ($show_barcode) { my $patron_show_barcode = GetBorrowerAttributeValue($borrowernumber, ATTRIBUTE_SHOW_BARCODE); undef $show_barcode if defined($patron_show_barcode) && !$patron_show_barcode; } $template->param( show_barcode => 1 ) if $show_barcode; -# load the branches -my $branches = GetBranches(); -my @branch_loop; -for my $branch_hash ( sort keys %{$branches} ) { - my $selected; - if ( C4::Context->preference('SearchMyLibraryFirst') ) { - $selected = - ( C4::Context->userenv - && ( $branch_hash eq C4::Context->userenv->{branch} ) ); - } - push @branch_loop, - { value => "branch: $branch_hash", - branchname => $branches->{$branch_hash}->{'branchname'}, - selected => $selected, - }; -} -$template->param( branchloop => \@branch_loop ); - # now the reserved items.... -my @reserves = GetReservesFromBorrowernumber( $borrowernumber ); -foreach my $res (@reserves) { - - if ( $res->{'expirationdate'} eq '0000-00-00' ) { - $res->{'expirationdate'} = ''; - } - $res->{'subtitle'} = GetRecordValue('subtitle', GetMarcBiblio($res->{'biblionumber'}), GetFrameworkCode($res->{'biblionumber'})); - $res->{'waiting'} = 1 if $res->{'found'} eq 'W'; - $res->{'branch'} = $branches->{ $res->{'branchcode'} }->{'branchname'}; - my $biblioData = GetBiblioData($res->{'biblionumber'}); - $res->{'reserves_title'} = $biblioData->{'title'}; - if ($OPACDisplayRequestPriority) { - $res->{'priority'} = '' if $res->{'priority'} eq '0'; - } - $res->{'suspend_until'} = C4::Dates->new( $res->{'suspend_until'}, "iso")->output("syspref") if ( $res->{'suspend_until'} ); -} - -# use Data::Dumper; -# warn Dumper(@reserves); - -$template->param( RESERVES => \@reserves ); -$template->param( reserves_count => $#reserves+1 ); -$template->param( showpriority=>1 ) if $OPACDisplayRequestPriority; - -my @waiting; -my $wcount = 0; -foreach my $res (@reserves) { - if ( $res->{'itemnumber'} ) { - my $item = GetItem( $res->{'itemnumber'}); - $res->{'holdingbranch'} = - $branches->{ $item->{'holdingbranch'} }->{'branchname'}; - $res->{'branch'} = $branches->{ $res->{'branchcode'} }->{'branchname'}; - # get document reserve status - my $biblioData = GetBiblioData($res->{'biblionumber'}); - $res->{'waiting_title'} = $biblioData->{'title'}; - if ( ( $res->{'found'} eq 'W' ) ) { - my $item = $res->{'itemnumber'}; - $item = GetBiblioFromItemNumber($item,undef); - $res->{'wait'}= 1; - $res->{'holdingbranch'}=$item->{'holdingbranch'}; - $res->{'biblionumber'}=$item->{'biblionumber'}; - $res->{'barcode'} = $item->{'barcode'}; - $res->{'wbrcode'} = $res->{'branchcode'}; - $res->{'itemnumber'} = $res->{'itemnumber'}; - $res->{'wbrname'} = $branches->{$res->{'branchcode'}}->{'branchname'}; - if($res->{'holdingbranch'} eq $res->{'wbrcode'}){ - $res->{'atdestination'} = 1; - } - # set found to 1 if reserve is waiting for patron pickup - $res->{'found'} = 1 if $res->{'found'} eq 'W'; - } else { - my ($transfertwhen, $transfertfrom, $transfertto) = GetTransfers( $res->{'itemnumber'} ); - if ($transfertwhen) { - $res->{intransit} = 1; - $res->{datesent} = $transfertwhen; - $res->{frombranch} = GetBranchName($transfertfrom); - } - } - push @waiting, $res; - $wcount++; - } - # can be cancelled - #$res->{'cancelable'} = 1 if ($res->{'wait'} && $res->{'atdestination'} && $res->{'found'} ne "1"); - $res->{'cancelable'} = 1 if ($res->{wait} and not $res->{found}) or (not $res->{wait} and not $res->{intransit}); - -} - -$template->param( WAITING => \@waiting ); +my $reserves = Koha::Holds->search( { borrowernumber => $borrowernumber } ); -# current alert subscriptions -my $alerts = getalert($borrowernumber); -foreach ( @$alerts ) { - $_->{ $_->{type} } = 1; - $_->{relatedto} = findrelatedto( $_->{type}, $_->{externalid} ); -} +$template->param( + RESERVES => $reserves, + showpriority => $show_priority, +); if (C4::Context->preference('BakerTaylorEnabled')) { $template->param( @@ -353,30 +322,56 @@ if (C4::Context->preference("OPACAmazonCoverImages") or $template->param(JacketImages=>1); } -if ( GetMessagesCount( $borrowernumber, 'B' ) ) { - $template->param( bor_messages => 1 ); -} - -if ( $borr->{'opacnote'} ) { - $template->param( - bor_messages => 1, - opacnote => $borr->{'opacnote'}, - ); -} - $template->param( - bor_messages_loop => GetMessages( $borrowernumber, 'B', 'NONE' ), - waiting_count => $wcount, - patronupdate => $patronupdate, - OpacRenewalAllowed => C4::Context->preference("OpacRenewalAllowed"), - userview => 1, + OverDriveCirculation => C4::Context->preference('OverDriveCirculation') || 0, + overdrive_error => scalar $query->param('overdrive_error') || undef, + overdrive_tab => scalar $query->param('overdrive_tab') || 0, + RecordedBooksCirculation => C4::Context->preference('RecordedBooksClientSecret') && C4::Context->preference('RecordedBooksLibraryID'), +); + +my $patron_messages = Koha::Patron::Messages->search( + { + borrowernumber => $borrowernumber, + message_type => 'B', + } ); +if ( C4::Context->preference('AllowPatronToSetCheckoutsVisibilityForGuarantor') + || C4::Context->preference('AllowStaffToSetCheckoutsVisibilityForGuarantor') ) +{ + my @relatives = + Koha::Database->new()->schema()->resultset("Borrower")->search( + { + privacy_guarantor_checkouts => 1, + 'me.guarantorid' => $borrowernumber + }, + { prefetch => [ { 'issues' => { 'item' => 'biblio' } } ] } + ); + $template->param( relatives => \@relatives ); +} + $template->param( - SuspendHoldsOpac => C4::Context->preference('SuspendHoldsOpac'), + patron_messages => $patron_messages, + opacnote => $borr->{opacnote}, + patronupdate => $patronupdate, + OpacRenewalAllowed => C4::Context->preference("OpacRenewalAllowed"), + userview => 1, + SuspendHoldsOpac => C4::Context->preference('SuspendHoldsOpac'), AutoResumeSuspendedHolds => C4::Context->preference('AutoResumeSuspendedHolds'), - OpacHoldNotes => C4::Context->preference('OpacHoldNotes'), + OpacHoldNotes => C4::Context->preference('OpacHoldNotes'), + failed_holds => scalar $query->param('failed_holds'), ); -output_html_with_http_headers $query, $cookie, $template->output; +# if not an empty string this indicates to return +# back to the opac-results page +my $search_query = $query->param('has-search-query'); + +if ($search_query) { + + print $query->redirect( + -uri => "/cgi-bin/koha/opac-search.pl?$search_query", + -cookie => $cookie, + ); +} +output_html_with_http_headers $query, $cookie, $template->output, undef, { force_no_caching => 1 };