X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=circ%2Fcirculation.pl;h=b0652677b58d822f322ab28481ad54fe6498d0db;hb=5a08969a71dc27562a1a22af809673a8727f5c82;hp=75799bd524d193135e66d75e5ed35b269ff78a45;hpb=7aedcf643e6f7793b4ebf55b1c7cdec7ec04a25d;p=koha.git diff --git a/circ/circulation.pl b/circ/circulation.pl index 75799bd524..b0652677b5 100755 --- a/circ/circulation.pl +++ b/circ/circulation.pl @@ -30,7 +30,6 @@ use DateTime::Duration; use C4::Output; use C4::Print; use C4::Auth qw/:DEFAULT get_session haspermission/; -use C4::Branch; # GetBranches use C4::Koha; # GetPrinter use C4::Circulation; use C4::Utils::DataTables::Members; @@ -43,12 +42,17 @@ use Koha::Holds; use C4::Context; use CGI::Session; use C4::Members::Attributes qw(GetBorrowerAttributes); +use Koha::AuthorisedValues; use Koha::Patron; -use Koha::Patron::Debarments qw(GetDebarments IsDebarred); +use Koha::Patron::Debarments qw(GetDebarments); use Koha::DateUtils; use Koha::Database; +use Koha::BiblioFrameworks; use Koha::Patron::Messages; use Koha::Patron::Images; +use Koha::SearchEngine; +use Koha::SearchEngine::Search; +use Koha::Patron::Modifications; use Date::Calc qw( Today @@ -62,26 +66,12 @@ use List::MoreUtils qw/uniq/; # my $query = new CGI; +my $override_high_holds = $query->param('override_high_holds'); +my $override_high_holds_tmp = $query->param('override_high_holds_tmp'); + my $sessionID = $query->cookie("CGISESSID") ; my $session = get_session($sessionID); - -# branch and printer are now defined by the userenv -# but first we have to check if someone has tried to change them - -my $branch = $query->param('branch'); -if ($branch){ - # update our session so the userenv is updated - $session->param('branch', $branch); - $session->param('branchname', GetBranchName($branch)); -} - -my $printer = $query->param('printer'); -if ($printer){ - # update our session so the userenv is updated - $session->param('branchprinter', $printer); -} - -if (!C4::Context->userenv && !$branch){ +if (!C4::Context->userenv){ if ($session->param('branch') eq 'NO_LIBRARY_SET'){ # no branch set we can't issue print $query->redirect("/cgi-bin/koha/circ/selectbranchprinter.pl"); @@ -92,7 +82,7 @@ if (!C4::Context->userenv && !$branch){ my $barcodes = []; my $barcode = $query->param('barcode'); # Barcode given by user could be '0' -if ( $barcode || $barcode eq '0' ) { +if ( $barcode || ( defined($barcode) && $barcode eq '0' ) ) { $barcodes = [ $barcode ]; } else { my $filefh = $query->upload('uploadfile'); @@ -105,7 +95,7 @@ if ( $barcode || $barcode eq '0' ) { push @$barcodes, split( /\s\n/, $list ); $barcodes = [ map { $_ =~ /^\s*$/ ? () : $_ } @$barcodes ]; } else { - @$barcodes = $query->param('barcodes'); + @$barcodes = $query->multi_param('barcodes'); } } @@ -136,8 +126,6 @@ my ( $template, $loggedinuser, $cookie ) = get_template_and_user ( } ); -my $branches = GetBranches(); - my $force_allow_issue = $query->param('forceallow') || 0; if (!C4::Auth::haspermission( C4::Context->userenv->{id} , { circulate => 'force_checkout' } )) { $force_allow_issue = 0; @@ -145,19 +133,20 @@ if (!C4::Auth::haspermission( C4::Context->userenv->{id} , { circulate => 'force my $onsite_checkout = $query->param('onsite_checkout'); -my @failedrenews = $query->param('failedrenew'); # expected to be itemnumbers +my @failedrenews = $query->multi_param('failedrenew'); # expected to be itemnumbers our %renew_failed = (); for (@failedrenews) { $renew_failed{$_} = 1; } -my @failedreturns = $query->param('failedreturn'); +my @failedreturns = $query->multi_param('failedreturn'); our %return_failed = (); for (@failedreturns) { $return_failed{$_} = 1; } +my $searchtype = $query->param('searchtype') || q{contain}; + my $findborrower = $query->param('findborrower') || q{}; $findborrower =~ s|,| |g; -$branch = C4::Context->userenv->{'branch'}; -$printer = C4::Context->userenv->{'branchprinter'}; +my $branch = C4::Context->userenv->{'branch'}; # If AutoLocation is not activated, we show the Circulation Parameters to chage settings of librarian if (C4::Context->preference("AutoLocation") != 1) { @@ -176,10 +165,10 @@ for my $barcode ( @$barcodes ) { my $stickyduedate = $query->param('stickyduedate') || $session->param('stickyduedate'); my $duedatespec = $query->param('duedatespec') || $session->param('stickyduedate'); -$duedatespec = eval { output_pref( { dt => dt_from_string( $duedatespec ), dateformat => 'iso' }); } +$duedatespec = eval { output_pref( { dt => dt_from_string( $duedatespec ), dateformat => 'iso', timeformat => '24hr' }); } if ( $duedatespec ); -my $restoreduedatespec = $query->param('restoreduedatespec') || $session->param('stickyduedate') || $duedatespec; -if ($restoreduedatespec eq "highholds_empty") { +my $restoreduedatespec = $query->param('restoreduedatespec') || $duedatespec || $session->param('stickyduedate'); +if ( $restoreduedatespec && $restoreduedatespec eq "highholds_empty" ) { undef $restoreduedatespec; } my $issueconfirmed = $query->param('issueconfirmed'); @@ -196,7 +185,7 @@ if ( @$barcodes ) { $stickyduedate = $query->param('stickyduedate'); $duedatespec = $query->param('duedatespec'); } - $session->param('auto_renew', $query->param('auto_renew')); + $session->param('auto_renew', scalar $query->param('auto_renew')); } else { $session->clear('auto_renew'); @@ -254,8 +243,8 @@ if ($findborrower) { my $results = C4::Utils::DataTables::Members::search( { searchmember => $findborrower, - searchtype => 'contain', - dt_params => $dt_params, + searchtype => $searchtype, + dt_params => $dt_params, } ); my $borrowers = $results->{patrons}; @@ -273,35 +262,25 @@ if ($findborrower) { } # get the borrower information..... +my $patron; if ($borrowernumber) { - $borrower = GetMemberDetails( $borrowernumber, 0 ); + $patron = Koha::Patrons->find( $borrowernumber ); + $borrower = GetMember( borrowernumber => $borrowernumber ); my ( $od, $issue, $fines ) = GetMemberIssuesAndFines( $borrowernumber ); - # Warningdate is the date that the warning starts appearing - my ( $today_year, $today_month, $today_day) = Today(); - my ($warning_year, $warning_month, $warning_day) = split /-/, $borrower->{'dateexpiry'}; - my ( $enrol_year, $enrol_month, $enrol_day) = split /-/, $borrower->{'dateenrolled'}; # if the expiry date is before today ie they have expired - if ( !$borrower->{'dateexpiry'} || $warning_year*$warning_month*$warning_day==0 - || Date_to_Days($today_year, $today_month, $today_day ) - > Date_to_Days($warning_year, $warning_month, $warning_day) ) - { + if ( $patron->is_expired ) { #borrowercard expired, no issues $template->param( - flagged => "1", noissues => ($force_allow_issue) ? 0 : "1", forceallow => $force_allow_issue, expired => "1", ); } # check for NotifyBorrowerDeparture - elsif ( C4::Context->preference('NotifyBorrowerDeparture') && - Date_to_Days(Add_Delta_Days($warning_year,$warning_month,$warning_day,- C4::Context->preference('NotifyBorrowerDeparture'))) < - Date_to_Days( $today_year, $today_month, $today_day ) ) - { + elsif ( $patron->is_going_to_expire ) { # borrower card soon to expire warn librarian $template->param( "warndeparture" => $borrower->{dateexpiry} , - flagged => "1" ); if (C4::Context->preference('ReturnBeforeExpiry')){ $template->param("returnbeforeexpiry" => 1); @@ -313,7 +292,7 @@ if ($borrowernumber) { finetotal => $fines ); - if ( IsDebarred($borrowernumber) ) { + if ( $patron and $patron->is_debarred ) { $template->param( 'userdebarred' => $borrower->{debarred}, 'debarredcomment' => $borrower->{debarredcomment}, @@ -335,16 +314,27 @@ if (@$barcodes) { for my $barcode ( @$barcodes ) { my $template_params = { barcode => $barcode }; # always check for blockers on issuing - my ( $error, $question, $alerts ) = - CanBookBeIssued( $borrower, $barcode, $datedue , $inprocess, undef, { onsite_checkout => $onsite_checkout } ); + my ( $error, $question, $alerts, $messages ) = CanBookBeIssued( + $borrower, + $barcode, $datedue, + $inprocess, + undef, + { + onsite_checkout => $onsite_checkout, + override_high_holds => $override_high_holds || $override_high_holds_tmp || 0, + } + ); + my $blocker = $invalidduedate ? 1 : 0; $template_params->{alert} = $alerts; + $template_params->{messages} = $messages; # Get the item title for more information my $getmessageiteminfo = GetBiblioFromItemNumber(undef,$barcode); - $template_params->{authvalcode_notforloan} = - C4::Koha::GetAuthValCode('items.notforloan', $getmessageiteminfo->{'frameworkcode'}); + + my $mss = Koha::MarcSubfieldStructures->search({ frameworkcode => $getmessageiteminfo->{frameworkcode}, kohafield => 'items.notforloan', authorised_value => { not => undef } }); + $template_params->{authvalcode_notforloan} = $mss->count ? $mss->next->authorised_value : undef; # Fix for bug 7494: optional checkout-time fallback search for a book @@ -355,16 +345,16 @@ if (@$barcodes) { { $template_params->{FALLBACK} = 1; + my $searcher = Koha::SearchEngine::Search->new({index => $Koha::SearchEngine::BIBLIOS_INDEX}); my $query = "kw=" . $barcode; - my ( $searcherror, $results, $total_hits ) = SimpleSearch($query); + my ( $searcherror, $results, $total_hits ) = $searcher->simple_search_compat($query, 0, 10); # if multiple hits, offer options to librarian if ( $total_hits > 0 ) { my @options = (); foreach my $hit ( @{$results} ) { my $chosen = - TransformMarcToKoha( C4::Context->dbh, - C4::Search::new_record_from_zebra('biblioserver',$hit) ); + TransformMarcToKoha( C4::Search::new_record_from_zebra('biblioserver',$hit) ); # offer all barcodes individually if ( $chosen->{barcode} ) { @@ -392,7 +382,10 @@ if (@$barcodes) { my $confirm_required = 0; unless($issueconfirmed){ # Get the item title for more information - $template_params->{additional_materials} = $iteminfo->{'materials'}; + my $materials = $iteminfo->{'materials'}; + my $descriptions = Koha::AuthorisedValues->get_description_by_koha_field({ frameworkcode => $getmessageiteminfo->{frameworkcode}, kohafield => 'items.materials', authorised_value => $materials }); + $materials = $descriptions->{lib} // ''; + $template_params->{additional_materials} = $materials; $template_params->{itemhomebranch} = $iteminfo->{'homebranch'}; # pass needsconfirmation to template if issuing is possible and user hasn't yet confirmed. @@ -406,8 +399,9 @@ if (@$barcodes) { } } unless($confirm_required) { - my $issue = AddIssue( $borrower, $barcode, $datedue, $cancelreserve, undef, undef, { onsite_checkout => $onsite_checkout, auto_renew => $session->param('auto_renew') } ); - $template->param( issue => $issue ); + my $switch_onsite_checkout = exists $messages->{ONSITE_CHECKOUT_WILL_BE_SWITCHED}; + my $issue = AddIssue( $borrower, $barcode, $datedue, $cancelreserve, undef, undef, { onsite_checkout => $onsite_checkout, auto_renew => $session->param('auto_renew'), switch_onsite_checkout => $switch_onsite_checkout, } ); + $template_params->{issue} = $issue; $session->clear('auto_renew'); $inprocess = 1; } @@ -450,7 +444,7 @@ if (@$barcodes) { # reload the borrower info for the sake of reseting the flags..... if ($borrowernumber) { - $borrower = GetMemberDetails( $borrowernumber, 0 ); + $borrower = GetMember( borrowernumber => $borrowernumber ); } ################################################################################## @@ -468,9 +462,8 @@ if ($borrowernumber) { } #title -my $flags = $borrower->{'flags'}; +my $flags = $borrower ? C4::Members::patronflags( $borrower ) : {}; foreach my $flag ( sort keys %$flags ) { - $template->param( flagged=> 1); $flags->{$flag}->{'message'} =~ s#\n#
#g; if ( $flags->{$flag}->{'noissues'} ) { $template->param( @@ -494,6 +487,14 @@ foreach my $flag ( sort keys %$flags ) { charges_is_blocker => 1 ); } + elsif ( $flag eq 'CHARGES_GUARANTEES' ) { + $template->param( + charges_guarantees => 'true', + chargesmsg_guarantees => $flags->{'CHARGES_GUARANTEES'}->{'message'}, + chargesamount_guarantees => $flags->{'CHARGES_GUARANTEES'}->{'amount'}, + charges_guarantees_is_blocker => 1 + ); + } elsif ( $flag eq 'CREDITS' ) { $template->param( credits => 'true', @@ -510,6 +511,13 @@ foreach my $flag ( sort keys %$flags ) { chargesamount => $flags->{'CHARGES'}->{'amount'}, ); } + elsif ( $flag eq 'CHARGES_GUARANTEES' ) { + $template->param( + charges_guarantees => 'true', + chargesmsg_guarantees => $flags->{'CHARGES_GUARANTEES'}->{'message'}, + chargesamount_guarantees => $flags->{'CHARGES_GUARANTEES'}->{'amount'}, + ); + } elsif ( $flag eq 'CREDITS' ) { $template->param( credits => 'true', @@ -537,38 +545,30 @@ foreach my $flag ( sort keys %$flags ) { } } -my $amountold = $borrower->{flags} ? $borrower->{flags}->{'CHARGES'}->{'message'} || 0 : 0; +my $amountold = $flags ? $flags->{'CHARGES'}->{'message'} || 0 : 0; $amountold =~ s/^.*\$//; # remove upto the $, if any my ( $total, $accts, $numaccts) = GetMemberAccountRecords( $borrowernumber ); if ( $borrowernumber && $borrower->{'category_type'} eq 'C') { - my ( $catcodes, $labels ) = GetborCatFromCatType( 'A', 'WHERE category_type = ?' ); - my $cnt = scalar(@$catcodes); - $template->param( 'CATCODE_MULTI' => 1) if $cnt > 1; - $template->param( 'catcode' => $catcodes->[0]) if $cnt == 1; + my $patron_categories = Koha::Patron::Categories->search_limited({ category_type => 'A' }, {order_by => ['categorycode']}); + $template->param( 'CATCODE_MULTI' => 1) if $patron_categories->count > 1; + $template->param( 'catcode' => $patron_categories->next ) if $patron_categories->count == 1; } -my $librarian_messages = Koha::Patron::Messages->search( +my $messages = Koha::Patron::Messages->search( { - borrowernumber => $borrowernumber, - message_type => 'L', - } -); - -my $patron_messages = Koha::Patron::Messages->search( + 'me.borrowernumber' => $borrowernumber, + }, { - borrowernumber => $borrowernumber, - message_type => 'B', + join => 'manager', + '+select' => ['manager.surname', 'manager.firstname' ], + '+as' => ['manager_surname', 'manager_firstname'], } ); -if( $librarian_messages->count or $patron_messages->count ) { - $template->param(flagged => 1) -} - my $fast_cataloging = 0; -if (defined getframeworkinfo('FA')) { +if ( Koha::BiblioFrameworks->find('FA') ) { $fast_cataloging = 1 } @@ -585,7 +585,7 @@ my $view = $batch my @relatives; if ( $borrowernumber ) { - if ( my $patron = Koha::Patrons->find( $borrower->{borrowernumber} ) ) { + if ( $patron ) { if ( my $guarantor = $patron->guarantor ) { push @relatives, $guarantor->borrowernumber; push @relatives, $_->borrowernumber for $patron->siblings; @@ -598,7 +598,8 @@ my $relatives_issues_count = Koha::Database->new()->schema()->resultset('Issue') ->count( { borrowernumber => \@relatives } ); -my $roadtype = C4::Koha::GetAuthorisedValueByCode( 'ROADTYPE', $borrower->{streettype} ); +my $av = Koha::AuthorisedValues->search({ category => 'ROADTYPE', authorised_value => $borrower->{streettype} }); +my $roadtype = $av->count ? $av->next->lib : ''; $template->param(%$borrower); @@ -614,17 +615,13 @@ if ($restoreduedatespec || $stickyduedate) { } $template->param( - librarian_messages => $librarian_messages, - patron_messages => $patron_messages, - findborrower => $findborrower, + patron => $patron, + messages => $messages, borrower => $borrower, borrowernumber => $borrowernumber, categoryname => $borrower->{'description'}, branch => $branch, - branchname => GetBranchName($borrower->{'branchcode'}), - printer => $printer, - printername => $printer, - was_renewed => $query->param('was_renewed') ? 1 : 0, + was_renewed => scalar $query->param('was_renewed') ? 1 : 0, expiry => $borrower->{'dateexpiry'}, roadtype => $roadtype, amountold => $amountold, @@ -638,6 +635,7 @@ $template->param( is_child => ($borrowernumber && $borrower->{'category_type'} eq 'C'), $view => 1, batch_allowed => $batch_allowed, + batch => $batch, AudioAlerts => C4::Context->preference("AudioAlerts"), fast_cataloging => $fast_cataloging, CircAutoPrintQuickSlip => C4::Context->preference("CircAutoPrintQuickSlip"), @@ -652,17 +650,16 @@ $template->param( my $patron_image = Koha::Patron::Images->find($borrower->{borrowernumber}); $template->param( picture => 1 ) if $patron_image; -# get authorised values with type of BOR_NOTES - -my $canned_notes = GetAuthorisedValues("BOR_NOTES"); - +my $has_modifications = Koha::Patron::Modifications->search( { borrowernumber => $borrowernumber } )->count; $template->param( debt_confirmed => $debt_confirmed, SpecifyDueDate => $duedatespec_allow, CircAutocompl => C4::Context->preference("CircAutocompl"), - canned_bor_notes_loop => $canned_notes, debarments => GetDebarments({ borrowernumber => $borrowernumber }), todaysdate => output_pref( { dt => dt_from_string()->set(hour => 23)->set(minute => 59), dateformat => 'sql' } ), + has_modifications => $has_modifications, + override_high_holds => $override_high_holds, + nopermission => scalar $query->param('nopermission'), ); output_html_with_http_headers $query, $cookie, $template->output;