LP#1198465 lost overdues generated in main xact
authorBill Erickson <berickxx@gmail.com>
Thu, 25 Sep 2014 16:49:17 +0000 (12:49 -0400)
committerDan Wells <dbw2@calvin.edu>
Tue, 11 Nov 2014 20:00:52 +0000 (15:00 -0500)
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 <berickxx@gmail.com>
Signed-off-by: Dan Wells <dbw2@calvin.edu>
Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Circulate.pm

index 307d962..ffb0d92 100644 (file)
@@ -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;