From 74516f3ba1edd416dcafd396a67cb2b98ef6d53d Mon Sep 17 00:00:00 2001 From: Kyle M Hall Date: Wed, 7 Aug 2013 11:03:17 -0400 Subject: [PATCH] Bug 10694 - Allow arbitrary backdating of returns Sometimes libraries need to backdate returns further back in time than Koha's dropbox mode will allow. The returns backdating will check in an item as if it had been returned on the specified date, and will reduce any fine accordingly. Test Plan: 1) Apply the patch for bug 8769 2) Apply this patch 3) Check out an item, and backdate the due date by 1 month or so * This issue needs to generate a fine 4) Run fines.pl to generate the fine 5) Browse to returns.pl 6) Specify a return date of the day after the specified due date 7) Check the borrowers issue history, you should see the backdated return date, rather than today's date 8) Check the fine, it should be reduced to a fine for a single day overdue, rather than the previous larger fine. --- C4/Circulation.pm | 36 +++++++++++++------ circ/returns.pl | 26 ++++++++++++++- .../intranet-tmpl/prog/en/modules/circ/returns.tt | 33 ++++++++++++++++++ 3 files changed, 82 insertions(+), 13 deletions(-) diff --git a/C4/Circulation.pm b/C4/Circulation.pm index be62078..450ae86 100644 --- a/C4/Circulation.pm +++ b/C4/Circulation.pm @@ -1781,7 +1781,7 @@ sub AddReturn { # case of a return of document (deal with issues and holdingbranch) my $today = DateTime->now( time_zone => C4::Context->tz() ); if ($doreturn) { - my $datedue = $issue->{date_due}; + my $datedue = $issue->{date_due}; $borrower or warn "AddReturn without current borrower"; my $circControlBranch; if ($dropbox) { @@ -1790,31 +1790,43 @@ sub AddReturn { # FIXME: check issuedate > returndate, factoring in holidays #$circControlBranch = _GetCircControlBranch($item,$borrower) unless ( $item->{'issuedate'} eq C4::Dates->today('iso') );; $circControlBranch = _GetCircControlBranch($item,$borrower); - $issue->{'overdue'} = DateTime->compare($issue->{'date_due'}, $today ) == -1 ? 1 : 0; + $issue->{'overdue'} = DateTime->compare($issue->{'date_due'}, $today ) == -1 ? 1 : 0; } if ($borrowernumber) { - if( C4::Context->preference('CalculateFinesOnReturn') && $issue->{'overdue'}){ - # we only need to calculate and change the fines if we want to do that on return - # Should be on for hourly loans + if ( ( C4::Context->preference('CalculateFinesOnReturn') && $issue->{'overdue'} ) || $return_date ) { + # we only need to calculate and change the fines if we want to do that on return + # Should be on for hourly loans my $control = C4::Context->preference('CircControl'); my $control_branchcode = ( $control eq 'ItemHomeLibrary' ) ? $item->{homebranch} : ( $control eq 'PatronLibrary' ) ? $borrower->{branchcode} : $issue->{branchcode}; + my $date_returned = + $return_date ? dt_from_string($return_date) : $today; + my ( $amount, $type, $unitcounttotal ) = C4::Overdues::CalcFine( $item, $borrower->{categorycode}, - $control_branchcode, $datedue, $today ); + $control_branchcode, $datedue, $date_returned ); $type ||= q{}; - if ( $amount > 0 - && C4::Context->preference('finesMode') eq 'production' ) - { - C4::Overdues::UpdateFine( $issue->{itemnumber}, - $issue->{borrowernumber}, - $amount, $type, output_pref($datedue) ); + if ( C4::Context->preference('finesMode') eq 'production' ) { + if ( $amount > 0 ) { + C4::Overdues::UpdateFine( $issue->{itemnumber}, + $issue->{borrowernumber}, + $amount, $type, output_pref($datedue) ); + } + elsif ($return_date) { + + # Backdated returns may have fines that shouldn't exist, + # so in this case, we need to drop those fines to 0 + + C4::Overdues::UpdateFine( $issue->{itemnumber}, + $issue->{borrowernumber}, + 0, $type, output_pref($datedue) ); + } } } diff --git a/circ/returns.pl b/circ/returns.pl index 9472797..86bb476 100755 --- a/circ/returns.pl +++ b/circ/returns.pl @@ -180,6 +180,30 @@ my $calendar = Koha::Calendar->new( branchcode => $userenv_branch ); #dropbox: get last open day (today - 1) my $today = DateTime->now( time_zone => C4::Context->tz()); my $dropboxdate = $calendar->addDate($today, -1); + +my $return_date_override = $query->param('return_date_override'); +my $return_date_override_remember = + $query->param('return_date_override_remember'); +if ($return_date_override) { + if ( C4::Context->preference('SpecifyReturnDate') ) { + if ( $return_date_override =~ C4::Dates->regexp('syspref') ) { + + # Save the original format if we are remembering for this series + $template->param( + return_date_override => $return_date_override, + return_date_override_remember => 1 + ) if ($return_date_override_remember); + + my $dt = dt_from_string($return_date_override); + $return_date_override = + DateTime::Format::MySQL->format_datetime($dt); + } + } + else { + $return_date_override = q{}; + } +} + if ($dotransfer){ # An item has been returned to a branch other than the homebranch, and the librarian has chosen to initiate a transfer my $transferitem = $query->param('transferitem'); @@ -216,7 +240,7 @@ if ($barcode) { # save the return # ( $returned, $messages, $issueinformation, $borrower ) = - AddReturn( $barcode, $userenv_branch, $exemptfine, $dropboxmode); # do the return + AddReturn( $barcode, $userenv_branch, $exemptfine, $dropboxmode, $return_date_override ); my $homeorholdingbranchreturn = C4::Context->preference('HomeOrHoldingBranchReturn'); $homeorholdingbranchreturn ||= 'homebranch'; diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/returns.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/circ/returns.tt index 98d2ae9..d383c63 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/returns.tt +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/circ/returns.tt @@ -1,9 +1,14 @@ [% USE KohaDates %] [% USE KohaBranchName %] +[% USE Koha %] [% INCLUDE 'doc-head-open.inc' %] Koha › Circulation › Check in [% title |html %] [% INCLUDE 'doc-head-close.inc' %] + +[% INCLUDE 'calendar.inc' %] + +