From 1b618cac3dc1436ba38c78ea5219afc6822f5f5a Mon Sep 17 00:00:00 2001 From: Kyle M Hall Date: Fri, 13 Sep 2013 11:26:30 -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. This feature is activated by a new system preference, SpecifyReturnDate. Test Plan: 1) Apply this patch 2) Check out an item, and backdate the due date by 1 month or so * This issue needs to generate a fine 3) Run fines.pl to generate the fine 4) Browse to returns.pl 5) Specify a return date of the day after the specified due date 6) Check the borrowers issue history, you should see the backdated return date, rather than today's date 7) Check the fine, it should be reduced to a fine for a single day overdue, rather than the previous larger fine. Signed-off-by: Kyle M Hall Signed-off-by: Barbara Knibbs Signed-off-by: Petter Goksoyr Asen Signed-off-by: Katrin Fischer Works as described, passes tests and QA script. Signed-off-by: Galen Charlton --- C4/Circulation.pm | 45 ++++++++++++------- circ/returns.pl | 26 ++++++++++- installer/data/mysql/sysprefs.sql | 1 + installer/data/mysql/updatedatabase.pl | 13 ++++++ .../admin/preferences/circulation.pref | 6 +++ .../prog/en/modules/circ/returns.tt | 33 ++++++++++++++ 6 files changed, 108 insertions(+), 16 deletions(-) diff --git a/C4/Circulation.pm b/C4/Circulation.pm index bd9e1ccad9..3fafdbafe7 100644 --- a/C4/Circulation.pm +++ b/C4/Circulation.pm @@ -1634,7 +1634,7 @@ sub GetBranchItemRule { =head2 AddReturn ($doreturn, $messages, $iteminformation, $borrower) = - &AddReturn($barcode, $branch, $exemptfine, $dropbox); + &AddReturn($barcode, $branch, $exemptfine, $dropbox, $returndate); Returns a book. @@ -1653,6 +1653,9 @@ overdue charges are applied and C<$dropbox> is true, the last charge will be removed. This assumes that the fines accrual script has run for _today_. +=item C<$return_date> allows the default return date to be overridden +by the given return date. + =back C<&AddReturn> returns a list of four items: @@ -1706,7 +1709,7 @@ patron who last borrowed the book. =cut sub AddReturn { - my ( $barcode, $branch, $exemptfine, $dropbox ) = @_; + my ( $barcode, $branch, $exemptfine, $dropbox, $return_date ) = @_; if ($branch and not GetBranchDetail($branch)) { warn "AddReturn error: branch '$branch' not found. Reverting to " . C4::Context->userenv->{'branch'}; @@ -1779,7 +1782,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) { @@ -1788,36 +1791,48 @@ 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) ); + } } } MarkIssueReturned( $borrowernumber, $item->{'itemnumber'}, - $circControlBranch, '', $borrower->{'privacy'} ); + $circControlBranch, $return_date, $borrower->{'privacy'} ); # FIXME is the "= 1" right? This could be the borrower hash. $messages->{'WasReturned'} = 1; diff --git a/circ/returns.pl b/circ/returns.pl index 55888a6988..895823f40a 100755 --- a/circ/returns.pl +++ b/circ/returns.pl @@ -186,6 +186,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'); @@ -222,7 +246,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/installer/data/mysql/sysprefs.sql b/installer/data/mysql/sysprefs.sql index 8dbf496128..2ef142fd21 100644 --- a/installer/data/mysql/sysprefs.sql +++ b/installer/data/mysql/sysprefs.sql @@ -356,6 +356,7 @@ INSERT INTO systempreferences ( `variable`, `value`, `options`, `explanation`, ` ('SocialNetworks','0','','Enable/Disable social networks links in opac detail pages','YesNo'), ('soundon','0','','Enable circulation sounds during checkin and checkout in the staff interface. Not supported by all web browsers yet.','YesNo'), ('SpecifyDueDate','1','','Define whether to display \"Specify Due Date\" form in Circulation','YesNo'), +('SpecifyReturnDate',1,'','Define whether to display \"Specify Return Date\" form in Circulation','YesNo'), ('SpineLabelAutoPrint','0','','If this setting is turned on, a print dialog will automatically pop up for the quick spine label printer.','YesNo'), ('SpineLabelFormat','','30|10','This preference defines the format for the quick spine label printer. Just list the fields you would like to see in the order you would like to see them, surrounded by <>, for example .','Textarea'), ('SpineLabelShowPrintOnBibDetails','0','','If turned on, a \"Print Label\" link will appear for each item on the bib details page in the staff interface.','YesNo'), diff --git a/installer/data/mysql/updatedatabase.pl b/installer/data/mysql/updatedatabase.pl index e8e1b8e107..c10188d50e 100755 --- a/installer/data/mysql/updatedatabase.pl +++ b/installer/data/mysql/updatedatabase.pl @@ -8343,6 +8343,19 @@ if ( CheckVersion($DBversion) ) { SetVersion($DBversion); } + +$DBversion = "3.13.00.XXX"; +if ( CheckVersion($DBversion) ) { + $dbh->do(q{ + INSERT INTO systempreferences + (variable,value,explanation,options,type) + VALUES + ('SpecifyReturnDate',1,'Define whether to display \"Specify Return Date\" form in Circulation','','YesNo') + }); + print "Upgrade to $DBversion done (Bug 10694 - Allow arbitrary backdating of returns)\n"; + SetVersion($DBversion); +} + =head1 FUNCTIONS =head2 TableExists($table) diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/circulation.pref b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/circulation.pref index 6282c0fdce..ad0d78bcaa 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/circulation.pref +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/circulation.pref @@ -57,6 +57,12 @@ Circulation: yes: Allow no: "Don't allow" - staff to specify a due date for a checkout. + - + - pref: SpecifyReturnDate + choices: + yes: Allow + no: "Don't allow" + - staff to specify a return date for a check in. - - Set the default start date for the Holds to pull list to - pref: HoldsToPullStartDate 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 14be5c8a0c..1d413b754f 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 Branches %] +[% USE Koha %] [% INCLUDE 'doc-head-open.inc' %] Koha › Circulation › Check in [% title |html %] [% INCLUDE 'doc-head-close.inc' %] + +[% INCLUDE 'calendar.inc' %] + +