X-Git-Url: http://koha-dev.rot13.org:8081/gitweb/?a=blobdiff_plain;f=circ%2Fcirculation.pl;h=fcd967d8072d14ee1764fe4de081cf0703099643;hb=56da7be50ada38bab6ec866f5915d55507c7d821;hp=ab478954b7587b2f76cbedec9ba1f8e0aee90f47;hpb=117ee49514c369c089f1940e1f7ca47bd8208e97;p=srvgit diff --git a/circ/circulation.pl b/circ/circulation.pl index ab478954b7..fcd967d807 100755 --- a/circ/circulation.pl +++ b/circ/circulation.pl @@ -30,8 +30,6 @@ use DateTime::Duration; use C4::Output; use C4::Print; use C4::Auth qw/:DEFAULT get_session haspermission/; -use C4::Dates qw/format_date/; -use C4::Branch; # GetBranches use C4::Koha; # GetPrinter use C4::Circulation; use C4::Utils::DataTables::Members; @@ -40,47 +38,38 @@ use C4::Biblio; use C4::Search; use MARC::Record; use C4::Reserves; +use Koha::Holds; use C4::Context; use CGI::Session; use C4::Members::Attributes qw(GetBorrowerAttributes); -use Koha::Borrower::Debarments qw(GetDebarments IsDebarred); +use Koha::Patron; +use Koha::Patron::Debarments qw(GetDebarments); use Koha::DateUtils; use Koha::Database; +use Koha::Patron::Messages; +use Koha::Patron::Images; +use Koha::SearchEngine; +use Koha::SearchEngine::Search; +use Koha::Patron::Modifications; use Date::Calc qw( Today - Add_Delta_YM Add_Delta_Days Date_to_Days ); use List::MoreUtils qw/uniq/; - # # PARAMETERS READING # 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"); @@ -88,9 +77,46 @@ if (!C4::Context->userenv && !$branch){ } } +my $barcodes = []; +my $barcode = $query->param('barcode'); +# Barcode given by user could be '0' +if ( $barcode || ( defined($barcode) && $barcode eq '0' ) ) { + $barcodes = [ $barcode ]; +} else { + my $filefh = $query->upload('uploadfile'); + if ( $filefh ) { + while ( my $content = <$filefh> ) { + $content =~ s/[\r\n]*$//g; + push @$barcodes, $content if $content; + } + } elsif ( my $list = $query->param('barcodelist') ) { + push @$barcodes, split( /\s\n/, $list ); + $barcodes = [ map { $_ =~ /^\s*$/ ? () : $_ } @$barcodes ]; + } else { + @$barcodes = $query->multi_param('barcodes'); + } +} + +$barcodes = [ uniq @$barcodes ]; + +my $template_name = q|circ/circulation.tt|; +my $borrowernumber = $query->param('borrowernumber'); +my $borrower = $borrowernumber ? GetMember( borrowernumber => $borrowernumber ) : undef; +my $batch = $query->param('batch'); +my $batch_allowed = 0; +if ( $batch && C4::Context->preference('BatchCheckouts') ) { + $template_name = q|circ/circulation_batch_checkouts.tt|; + my @batch_category_codes = split '\|', C4::Context->preference('BatchCheckoutsValidCategories'); + if ( grep {/^$borrower->{categorycode}$/} @batch_category_codes ) { + $batch_allowed = 1; + } else { + $barcodes = []; + } +} + my ( $template, $loggedinuser, $cookie ) = get_template_and_user ( { - template_name => 'circ/circulation.tt', + template_name => $template_name, query => $query, type => "intranet", authnotrequired => 0, @@ -98,8 +124,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; @@ -107,21 +131,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; -my $borrowernumber = $query->param('borrowernumber'); - -$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) { @@ -132,12 +155,20 @@ if (C4::Context->preference("DisplayClearScreenButton")) { $template->param(DisplayClearScreenButton => 1); } -my $barcode = $query->param('barcode') || q{}; -$barcode =~ s/^\s*|\s*$//g; # remove leading/trailing whitespace +for my $barcode ( @$barcodes ) { + $barcode =~ s/^\s*|\s*$//g; # remove leading/trailing whitespace + $barcode = barcodedecode($barcode) + if( $barcode && C4::Context->preference('itemBarcodeInputFilter')); +} -$barcode = barcodedecode($barcode) if( $barcode && C4::Context->preference('itemBarcodeInputFilter')); 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', timeformat => '24hr' }); } + if ( $duedatespec ); +my $restoreduedatespec = $query->param('restoreduedatespec') || $duedatespec || $session->param('stickyduedate'); +if ( $restoreduedatespec && $restoreduedatespec eq "highholds_empty" ) { + undef $restoreduedatespec; +} my $issueconfirmed = $query->param('issueconfirmed'); my $cancelreserve = $query->param('cancelreserve'); my $print = $query->param('print') || q{}; @@ -145,14 +176,14 @@ my $debt_confirmed = $query->param('debt_confirmed') || 0; # Don't show the debt my $charges = $query->param('charges') || q{}; # Check if stickyduedate is turned off -if ( $barcode ) { +if ( @$barcodes ) { # was stickyduedate loaded from session? if ( $stickyduedate && ! $query->param("stickyduedate") ) { $session->clear( 'stickyduedate' ); $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'); @@ -165,25 +196,22 @@ if( $onsite_checkout && !$duedatespec_allow ) { $datedue = output_pref({ dt => dt_from_string, dateonly => 1, dateformat => 'iso' }); $datedue .= ' 23:59:00'; } elsif( $duedatespec_allow ) { - if ($duedatespec) { - if ($duedatespec =~ C4::Dates->regexp('syspref')) { - $datedue = dt_from_string($duedatespec); - } else { + if ( $duedatespec ) { + $datedue = eval { dt_from_string( $duedatespec ) }; + if (! $datedue ) { $invalidduedate = 1; - $template->param(IMPOSSIBLE=>1, INVALID_DATE=>$duedatespec); + $template->param( IMPOSSIBLE=>1, INVALID_DATE=>$duedatespec ); } } } -our $todaysdate = C4::Dates->new->output('iso'); - # check and see if we should print -if ( $barcode eq '' && $print eq 'maybe' ) { +if ( @$barcodes == 0 && $print eq 'maybe' ) { $print = 'yes'; } -my $inprocess = ($barcode eq '') ? '' : $query->param('inprocess'); -if ( $barcode eq '' && $charges eq 'yes' ) { +my $inprocess = (@$barcodes == 0) ? '' : $query->param('inprocess'); +if ( @$barcodes == 0 && $charges eq 'yes' ) { $template->param( PAYCHARGES => 'yes', borrowernumber => $borrowernumber @@ -213,7 +241,8 @@ if ($findborrower) { my $results = C4::Utils::DataTables::Members::search( { searchmember => $findborrower, - dt_params => $dt_params, + searchtype => $searchtype, + dt_params => $dt_params, } ); my $borrowers = $results->{patrons}; @@ -231,7 +260,6 @@ if ($findborrower) { } # get the borrower information..... -my $borrower; if ($borrowernumber) { $borrower = GetMemberDetails( $borrowernumber, 0 ); my ( $od, $issue, $fines ) = GetMemberIssuesAndFines( $borrowernumber ); @@ -240,13 +268,6 @@ if ($borrowernumber) { 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'}; - # Renew day is calculated by adding the enrolment period to today - my ( $renew_year, $renew_month, $renew_day); - if ($enrol_year*$enrol_month*$enrol_day>0) { - ( $renew_year, $renew_month, $renew_day) = - Add_Delta_YM( $enrol_year, $enrol_month, $enrol_day, - 0 , $borrower->{'enrolmentperiod'}); - } # 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 ) @@ -254,11 +275,9 @@ if ($borrowernumber) { { #borrowercard expired, no issues $template->param( - flagged => "1", noissues => ($force_allow_issue) ? 0 : "1", forceallow => $force_allow_issue, expired => "1", - renewaldate => format_date("$renew_year-$renew_month-$renew_day") ); } # check for NotifyBorrowerDeparture @@ -267,8 +286,8 @@ if ($borrowernumber) { Date_to_Days( $today_year, $today_month, $today_day ) ) { # borrower card soon to expire warn librarian - $template->param("warndeparture" => format_date($borrower->{dateexpiry}), - flagged => "1",); + $template->param( "warndeparture" => $borrower->{dateexpiry} , + ); if (C4::Context->preference('ReturnBeforeExpiry')){ $template->param("returnbeforeexpiry" => 1); } @@ -279,15 +298,15 @@ if ($borrowernumber) { finetotal => $fines ); - if ( IsDebarred($borrowernumber) ) { + my $patron = Koha::Patrons->find( $borrowernumber ); + if ( $patron and $patron->is_debarred ) { $template->param( 'userdebarred' => $borrower->{debarred}, 'debarredcomment' => $borrower->{debarredcomment}, ); if ( $borrower->{debarred} ne "9999-12-31" ) { - $template->param( 'userdebarreddate' => - C4::Dates::format_date( $borrower->{debarred} ) ); + $template->param( 'userdebarreddate' => $borrower->{debarred} ); } } @@ -297,36 +316,51 @@ if ($borrowernumber) { # STEP 3 : ISSUING # # -if ($barcode) { +if (@$barcodes) { + my $checkout_infos; + for my $barcode ( @$barcodes ) { + my $template_params = { barcode => $barcode }; # always check for blockers on issuing - my ( $error, $question, $alerts ) = - CanBookBeIssued( $borrower, $barcode, $datedue , $inprocess ); + 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->param( alert => $alerts ); + $template_params->{alert} = $alerts; + $template_params->{messages} = $messages; # Get the item title for more information my $getmessageiteminfo = GetBiblioFromItemNumber(undef,$barcode); - $template->param( - authvalcode_notforloan => C4::Koha::GetAuthValCode('items.notforloan', $getmessageiteminfo->{'frameworkcode'}), - ); + $template_params->{authvalcode_notforloan} = + C4::Koha::GetAuthValCode('items.notforloan', $getmessageiteminfo->{'frameworkcode'}); + # Fix for bug 7494: optional checkout-time fallback search for a book if ( $error->{'UNKNOWN_BARCODE'} - && C4::Context->preference("itemBarcodeFallbackSearch") ) + && C4::Context->preference("itemBarcodeFallbackSearch") + && not $batch + ) { - $template->param( FALLBACK => 1 ); + $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} ) { @@ -337,50 +371,83 @@ if ($barcode) { } } } - $template->param( options => \@options ); + $template_params->{options} = \@options; } } unless( $onsite_checkout and C4::Context->preference("OnSiteCheckoutsForce") ) { delete $question->{'DEBT'} if ($debt_confirmed); foreach my $impossible ( keys %$error ) { - $template->param( - $impossible => $$error{$impossible}, - IMPOSSIBLE => 1 - ); + $template_params->{$impossible} = $$error{$impossible}; + $template_params->{IMPOSSIBLE} = 1; $blocker = 1; } } + my $iteminfo = GetBiblioFromItemNumber(undef, $barcode); if( !$blocker || $force_allow_issue ){ my $confirm_required = 0; unless($issueconfirmed){ # Get the item title for more information - my $getmessageiteminfo = GetBiblioFromItemNumber(undef,$barcode); - $template->{VARS}->{'additional_materials'} = $getmessageiteminfo->{'materials'}; - $template->param( itemhomebranch => $getmessageiteminfo->{'homebranch'} ); + my $materials = $iteminfo->{'materials'}; + my $avcode = GetAuthValCode('items.materials'); + if ($avcode) { + $materials = GetKohaAuthorisedValueLib($avcode, $materials); + } + $template_params->{additional_materials} = $materials; + $template_params->{itemhomebranch} = $iteminfo->{'homebranch'}; # pass needsconfirmation to template if issuing is possible and user hasn't yet confirmed. foreach my $needsconfirmation ( keys %$question ) { - $template->param( - $needsconfirmation => $$question{$needsconfirmation}, - getTitleMessageIteminfo => $getmessageiteminfo->{'title'}, - getBarcodeMessageIteminfo => $getmessageiteminfo->{'barcode'}, - NEEDSCONFIRMATION => 1, - onsite_checkout => $onsite_checkout, - ); + $template_params->{$needsconfirmation} = $$question{$needsconfirmation}; + $template_params->{getTitleMessageIteminfo} = $iteminfo->{'title'}; + $template_params->{getBarcodeMessageIteminfo} = $iteminfo->{'barcode'}; + $template_params->{NEEDSCONFIRMATION} = 1; + $template_params->{onsite_checkout} = $onsite_checkout; $confirm_required = 1; } } 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; } } - + + # FIXME If the issue is confirmed, we launch another time GetMemberIssuesAndFines, now display the issue count after issue my ( $od, $issue, $fines ) = GetMemberIssuesAndFines($borrowernumber); - $template->param( issuecount => $issue ); + + if ($question->{RESERVE_WAITING} or $question->{RESERVED}){ + $template->param( + reserveborrowernumber => $question->{'resborrowernumber'} + ); + } + + $template->param( + itembiblionumber => $getmessageiteminfo->{'biblionumber'} + ); + + + + $template_params->{issuecount} = $issue; + + if ( $iteminfo ) { + $iteminfo->{subtitle} = GetRecordValue('subtitle', GetMarcBiblio($iteminfo->{biblionumber}), GetFrameworkCode($iteminfo->{biblionumber})); + $template_params->{item} = $iteminfo; + } + push @$checkout_infos, $template_params; + } + unless ( $batch ) { + $template->param( %{$checkout_infos->[0]} ); + $template->param( barcode => $barcodes->[0] ); + } else { + my $confirmation_needed = grep { $_->{NEEDSCONFIRMATION} } @$checkout_infos; + $template->param( + checkout_infos => $checkout_infos, + confirmation_needed => $confirmation_needed, + ); + } } # reload the borrower info for the sake of reseting the flags..... @@ -392,42 +459,19 @@ if ($borrowernumber) { # BUILD HTML # show all reserves of this borrower, and the position of the reservation .... if ($borrowernumber) { + my $holds = Koha::Holds->search( { borrowernumber => $borrowernumber } ); + my $waiting_holds = $holds->waiting; $template->param( - holds_count => Koha::Database->new()->schema()->resultset('Reserve') - ->count( { borrowernumber => $borrowernumber } ) ); - my @borrowerreserv = GetReservesFromBorrowernumber($borrowernumber); - - my @WaitingReserveLoop; - foreach my $num_res (@borrowerreserv) { - if ( $num_res->{'found'} && $num_res->{'found'} eq 'W' ) { - my $getiteminfo = GetBiblioFromItemNumber( $num_res->{'itemnumber'} ); - my $itemtypeinfo = getitemtypeinfo( (C4::Context->preference('item-level_itypes')) ? $getiteminfo->{'itype'} : $getiteminfo->{'itemtype'} ); - my %getWaitingReserveInfo; - $getWaitingReserveInfo{title} = $getiteminfo->{'title'}; - $getWaitingReserveInfo{biblionumber} = - $getiteminfo->{'biblionumber'}; - $getWaitingReserveInfo{itemtype} = $itemtypeinfo->{'description'}; - $getWaitingReserveInfo{author} = $getiteminfo->{'author'}; - $getWaitingReserveInfo{itemcallnumber} = - $getiteminfo->{'itemcallnumber'}; - $getWaitingReserveInfo{reservedate} = - format_date( $num_res->{'reservedate'} ); - $getWaitingReserveInfo{waitingat} = - GetBranchName( $num_res->{'branchcode'} ); - $getWaitingReserveInfo{waitinghere} = 1 - if $num_res->{'branchcode'} eq $branch; - push( @WaitingReserveLoop, \%getWaitingReserveInfo ); - } - } - $template->param( WaitingReserveLoop => \@WaitingReserveLoop ); - $template->param( adultborrower => 1 ) - if ( $borrower->{'category_type'} eq 'A' ); + holds_count => $holds->count(), + WaitingHolds => $waiting_holds, + ); + + $template->param( adultborrower => 1 ) if ( $borrower->{category_type} eq 'A' || $borrower->{category_type} eq 'I' ); } #title my $flags = $borrower->{'flags'}; foreach my $flag ( sort keys %$flags ) { - $template->param( flagged=> 1); $flags->{$flag}->{'message'} =~ s#\n#
#g; if ( $flags->{$flag}->{'noissues'} ) { $template->param( @@ -451,6 +495,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', @@ -467,6 +519,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', @@ -494,23 +553,30 @@ foreach my $flag ( sort keys %$flags ) { } } -my $amountold = $borrower->{flags}->{'CHARGES'}->{'message'} || 0; +my $amountold = $borrower->{flags} ? $borrower->{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 $lib_messages_loop = GetMessages( $borrowernumber, 'L', $branch ); -if($lib_messages_loop){ $template->param(flagged => 1 ); } +my $librarian_messages = Koha::Patron::Messages->search( + { + borrowernumber => $borrowernumber, + message_type => 'L', + } +); -my $bor_messages_loop = GetMessages( $borrowernumber, 'B', $branch ); -if($bor_messages_loop){ $template->param(flagged => 1 ); } +my $patron_messages = Koha::Patron::Messages->search( + { + borrowernumber => $borrowernumber, + message_type => 'B', + } +); my $fast_cataloging = 0; if (defined getframeworkinfo('FA')) { @@ -524,8 +590,21 @@ if (C4::Context->preference('ExtendedPatronAttributes')) { extendedattributes => $attributes ); } - -my @relatives = GetMemberRelatives( $borrower->{'borrowernumber'} ); +my $view = $batch + ?'batch_checkout_view' + : 'circview'; + +my @relatives; +if ( $borrowernumber ) { + if ( my $patron = Koha::Patrons->find( $borrower->{borrowernumber} ) ) { + if ( my $guarantor = $patron->guarantor ) { + push @relatives, $guarantor->borrowernumber; + push @relatives, $_->borrowernumber for $patron->siblings; + } else { + push @relatives, $_->borrowernumber for $patron->guarantees; + } + } +} my $relatives_issues_count = Koha::Database->new()->schema()->resultset('Issue') ->count( { borrowernumber => \@relatives } ); @@ -534,30 +613,40 @@ my $roadtype = C4::Koha::GetAuthorisedValueByCode( 'ROADTYPE', $borrower->{stree $template->param(%$borrower); +# Restore date if changed by holds and/or save stickyduedate to session +if ($restoreduedatespec || $stickyduedate) { + $duedatespec = $restoreduedatespec || $duedatespec; + + if ($stickyduedate) { + $session->param( 'stickyduedate', $duedatespec ); + } +} elsif (defined($duedatespec) && !defined($restoreduedatespec)) { + undef $duedatespec; +} + $template->param( - lib_messages_loop => $lib_messages_loop, - bor_messages_loop => $bor_messages_loop, - all_messages_del => C4::Context->preference('AllowAllMessageDeletion'), - findborrower => $findborrower, + librarian_messages => $librarian_messages, + patron_messages => $patron_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, - expiry => format_date($borrower->{'dateexpiry'}), + was_renewed => scalar $query->param('was_renewed') ? 1 : 0, + expiry => $borrower->{'dateexpiry'}, roadtype => $roadtype, amountold => $amountold, - barcode => $barcode, + barcodes => $barcodes, stickyduedate => $stickyduedate, duedatespec => $duedatespec, + restoreduedatespec => $restoreduedatespec, message => $message, totaldue => sprintf('%.2f', $total), inprocess => $inprocess, is_child => ($borrowernumber && $borrower->{'category_type'} eq 'C'), - circview => 1, - soundon => C4::Context->preference("SoundOn"), + $view => 1, + batch_allowed => $batch_allowed, + batch => $batch, + AudioAlerts => C4::Context->preference("AudioAlerts"), fast_cataloging => $fast_cataloging, CircAutoPrintQuickSlip => C4::Context->preference("CircAutoPrintQuickSlip"), activeBorrowerRelationship => (C4::Context->preference('borrowerRelationship') ne ''), @@ -568,26 +657,19 @@ $template->param( relatives_borrowernumbers => \@relatives, ); -# save stickyduedate to session -if ($stickyduedate) { - $session->param( 'stickyduedate', $duedatespec ); -} - -my ($picture, $dberror) = GetPatronImage($borrower->{'borrowernumber'}); -$template->param( picture => 1 ) if $picture; - -# get authorised values with type of BOR_NOTES - -my $canned_notes = GetAuthorisedValues("BOR_NOTES"); +my $patron_image = Koha::Patron::Images->find($borrower->{borrowernumber}); +$template->param( picture => 1 ) if $patron_image; +my $has_modifications = Koha::Patron::Modifications->search( { borrowernumber => $borrowernumber } )->count; $template->param( debt_confirmed => $debt_confirmed, SpecifyDueDate => $duedatespec_allow, CircAutocompl => C4::Context->preference("CircAutocompl"), - AllowRenewalLimitOverride => C4::Context->preference("AllowRenewalLimitOverride"), - canned_bor_notes_loop => $canned_notes, debarments => GetDebarments({ borrowernumber => $borrowernumber }), - todaysdate => dt_from_string()->set(hour => 23)->set(minute => 59), + 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;