From d2a521c0ff32e9921bfc93cb86b2c917e5eda92e Mon Sep 17 00:00:00 2001 From: Bill Erickson Date: Thu, 25 Sep 2014 12:49:17 -0400 Subject: [PATCH] LP#1198465 lost overdues generated in main xact Generate overdue fines for lost checkins (if configured) within the main body of the checkin transaction to avoid complications with negative balance reconciliation. Signed-off-by: Bill Erickson Signed-off-by: Dan Wells --- .../lib/OpenILS/Application/Circ/Circulate.pm | 98 +++++-------------- 1 file changed, 22 insertions(+), 76 deletions(-) diff --git a/Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Circulate.pm b/Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Circulate.pm index 307d962dbf..ffb0d925e9 100644 --- a/Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Circulate.pm +++ b/Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Circulate.pm @@ -347,14 +347,6 @@ sub run_method { } else { $circulator->editor->commit; - - if ($circulator->generate_lost_overdue) { - # Generating additional overdue billings has to happen after the - # main commit and before the final respond() so the caller can - # receive the latest transaction summary. - my $evt = $circulator->generate_lost_overdue_fines; - $circulator->bail_on_events($evt) if $evt; - } } $conn->respond_complete(circ_events($circulator)); @@ -536,7 +528,6 @@ my @AUTOLOAD_FIELDS = qw/ skip_deposit_fee skip_rental_fee use_booking - generate_lost_overdue clear_expired retarget_mode hold_as_transit @@ -2516,8 +2507,26 @@ sub do_checkin { " open circs for copy " .$self->copy->id."!!") if @$circs > 1; } - # run the fine generator against this circ, if this circ is there - $self->generate_fines_start if $self->circ; + my $ignore_stop_fines = undef; + if ($self->circ) { + + # if this circ is LOST and we are configured to generate overdue + # fines for lost items on checkin (to fill the gap between mark + # lost time and when the fines would have naturally stopped), tell + # the fine generator to ignore the stop-fines value on this circ. + my $stat = $U->copy_status($self->copy->status)->id; + if ($stat == OILS_COPY_STATUS_LOST) { + $ignore_stop_fines = $self->circ->stop_fines if + $U->ou_ancestor_setting_value( + $self->circ_lib, + OILS_SETTING_GENERATE_OVERDUE_ON_LOST_RETURN, + $self->editor + ); + } + + # run the fine generator against this circ + $self->generate_fines_start(undef, $ignore_stop_fines); + } if( $self->checkin_check_holds_shelf() ) { $self->bail_on_events(OpenILS::Event->new('NO_CHANGE')); @@ -3343,6 +3352,7 @@ sub generate_fines { sub generate_fines_start { my $self = shift; my $reservation = shift; + my $ignore_stop_fines = shift; my $dt_parser = DateTime::Format::ISO8601->new; my $obj = $reservation ? $self->reservation : $self->circ; @@ -3361,7 +3371,7 @@ sub generate_fines_start { $self->{_gen_fines_req} = OpenSRF::AppSession->create('open-ils.storage') ->request( 'open-ils.storage.action.circulation.overdue.generate_fines', - $obj->id + $obj->id, $ignore_stop_fines ); } @@ -3583,16 +3593,6 @@ sub checkin_handle_lost_or_longoverdue { my $restore_od = $U->ou_ancestor_setting_value( $circ_lib, $args{ous_restore_overdue}, $self->editor) || 0; - # for reference: generate-overdues-on-long-overdue-checkin is not - # supported because it doesn't make any sense that a circ would be - # marked as long-overdue before it was done being regular-overdue - if (!$args{is_longoverdue}) { - $self->generate_lost_overdue(1) if - $U->ou_ancestor_setting_value($circ_lib, - OILS_SETTING_GENERATE_OVERDUE_ON_LOST_RETURN, - $self->editor); - } - $self->checkin_handle_lost_or_lo_now_found( $args{void_cost_btype}, $args{is_longoverdue}) if $void_cost; $self->checkin_handle_lost_or_lo_now_found( @@ -4047,58 +4047,4 @@ sub checkin_handle_lost_or_lo_now_found_restore_od { } } -# ------------------------------------------------------------------ -# Lost-then-found item checked in. This sub generates new overdue -# fines, beyond the point of any existing and possibly voided -# overdue fines, up to the point of final checkin time (or max fine -# amount). -# ------------------------------------------------------------------ -sub generate_lost_overdue_fines { - my $self = shift; - my $circ = $self->circ; - my $e = $self->editor; - - # Re-open the transaction so the fine generator can see it - if($circ->xact_finish or $circ->stop_fines) { - $e->xact_begin; - $circ->clear_xact_finish; - $circ->clear_stop_fines; - $circ->clear_stop_fines_time; - $e->update_action_circulation($circ) or return $e->die_event; - $e->xact_commit; - } - - $e->xact_begin; # generate_fines expects an in-xact editor - $self->generate_fines; - $circ = $self->circ; # generate fines re-fetches the circ - - my $update = 0; - - # Re-close the transaction if no money is owed - my ($obt) = $U->fetch_mbts($circ->id, $e); - if ($obt and $obt->balance_owed == 0) { - $circ->xact_finish('now'); - $update = 1; - } - - # Set stop fines if the fine generator didn't have to - unless($circ->stop_fines) { - $circ->stop_fines(OILS_STOP_FINES_CHECKIN); - $circ->stop_fines_time('now'); - $update = 1; - } - - # update the event data sent to the caller within the transaction - $self->checkin_flesh_events; - - if ($update) { - $e->update_action_circulation($circ) or return $e->die_event; - $e->commit; - } else { - $e->rollback; - } - - return undef; -} - 1; -- 2.43.2