[open-ils-commits] r12548 - in trunk/Open-ILS/src/perlmods/OpenILS: . Application/Circ (erickson)

svn at svn.open-ils.org svn at svn.open-ils.org
Mon Mar 16 16:04:20 EDT 2009


Author: erickson
Date: 2009-03-16 16:04:16 -0400 (Mon, 16 Mar 2009)
New Revision: 12548

Modified:
   trunk/Open-ILS/src/perlmods/OpenILS/Application/Circ/Circulate.pm
   trunk/Open-ILS/src/perlmods/OpenILS/Const.pm
Log:
plugged in Bill Ott's lost item checkin functionality.  This includes the ability to void lost item fines, processing fines, and un-voiding existing overdue fines on the transaction when an item previously marked lost is checked in.  lib can also define a post-due-date interval during which these settings take effect.  Each are controlled by org-unit settings.  I still need to add Const.pm entries for billing types.  Thanks Billsvn diff Open-ILS/src/perlmods/OpenILS/Const.pm Open-ILS/src/perlmods/OpenILS/Application/Circ/Circulate.pm

Modified: trunk/Open-ILS/src/perlmods/OpenILS/Application/Circ/Circulate.pm
===================================================================
--- trunk/Open-ILS/src/perlmods/OpenILS/Application/Circ/Circulate.pm	2009-03-16 19:58:55 UTC (rev 12547)
+++ trunk/Open-ILS/src/perlmods/OpenILS/Application/Circ/Circulate.pm	2009-03-16 20:04:16 UTC (rev 12548)
@@ -318,6 +318,8 @@
 use OpenILS::Application::Circ::ScriptBuilder;
 use OpenILS::Const qw/:const/;
 use OpenILS::Utils::Penalty;
+use OpenILS::Application::Circ::CircCommon;
+use Time::Local;
 
 my $holdcode    = "OpenILS::Application::Circ::Holds";
 my $transcode   = "OpenILS::Application::Circ::Transit";
@@ -2085,8 +2087,6 @@
 
 sub checkin_handle_circ {
    my $self = shift;
-    $U->logmark;
-
    my $circ = $self->circ;
    my $copy = $self->copy;
    my $evt;
@@ -2107,36 +2107,98 @@
 
    # see if there are any fines owed on this circ.  if not, close it
     ($obt) = $U->fetch_mbts($circ->id, $self->editor);
-   $circ->xact_finish('now') if( $obt and $obt->balance_owed == 0 );
+    $circ->xact_finish('now') if( $obt and $obt->balance_owed == 0 );
 
     $logger->debug("circulator: ".$obt->balance_owed." is owed on this circulation");
 
-   # Set the checkin vars since we have the item
+    # Set the checkin vars since we have the item
     $circ->checkin_time( ($self->backdate) ? $self->backdate : 'now' );
 
-   $circ->checkin_staff($self->editor->requestor->id);
-   $circ->checkin_lib($self->editor->requestor->ws_ou);
+    $circ->checkin_staff($self->editor->requestor->id);
+    $circ->checkin_lib($self->editor->requestor->ws_ou);
 
     my $circ_lib = (ref $self->copy->circ_lib) ?  
         $self->copy->circ_lib->id : $self->copy->circ_lib;
     my $stat = $U->copy_status($self->copy->status)->id;
 
-    # If the item is lost/missing and it needs to be sent home, don't 
-    # reshelve the copy, leave it lost/missing so the recipient will know
-    if( ($stat == OILS_COPY_STATUS_LOST or $stat == OILS_COPY_STATUS_MISSING)
-        and ($circ_lib != $self->editor->requestor->ws_ou) ) {
-        $logger->info("circulator: not updating copy status on checkin because copy is lost/missing");
+    # immediately available keeps items lost or missing items from going home before being handled
+    my $lost_immediately_available = $U->ou_ancestor_setting_value(
+        $circ_lib, OILS_SETTING_LOST_IMMEDIATELY_AVAILABLE, $self->editor) || 0;
 
+
+    if ( (!$lost_immediately_available) && ($circ_lib != $self->editor->requestor->ws_ou) ) {
+
+        if( ($stat == OILS_COPY_STATUS_LOST or $stat == OILS_COPY_STATUS_MISSING) ) {
+            $logger->info("circulator: not updating copy status on checkin because copy is lost/missing");
+        } else {
+            $self->copy->status($U->copy_status(OILS_COPY_STATUS_RESHELVING));
+            $self->update_copy;
+        }
+
+    } elsif ($stat == OILS_COPY_STATUS_LOST) {
+
+        $self->checkin_handle_lost($circ_lib);
+
     } else {
+
         $self->copy->status($U->copy_status(OILS_COPY_STATUS_RESHELVING));
         $self->update_copy;
     }
 
     return $self->bail_on_events($self->editor->event)
         unless $self->editor->update_action_circulation($circ);
+
+    # make sure the circ isn't closed if we just voided some fines
+    $evt = OpenILS::Application::Circ::CircCommon->reopen_xact($self->editor, $circ->id);
+    return $self->bail_on_events($evt) if $evt;
+
+    return undef;
 }
 
 
+# ------------------------------------------------------------------
+# See if we need to void billings for lost checkin
+# ------------------------------------------------------------------
+sub checkin_handle_lost {
+    my $self = shift;
+    my $circ_lib = shift;
+    my $circ = $self->circ;
+
+    my $max_return = $U->ou_ancestor_setting_value(
+        $circ_lib, OILS_SETTING_MAX_ACCEPT_RETURN_OF_LOST, $self->editor) || 0;
+
+    if ($max_return) {
+
+        my $today = time();
+        my @tm = reverse($circ->due_date =~ /([\d\.]+)/og);
+        $tm[5] -= 1 if $tm[5] > 0;
+        my $due = timelocal(int($tm[1]), int($tm[2]), int($tm[3]), int($tm[4]), int($tm[5]), int($tm[6]));
+
+        my $last_chance = OpenSRF::Utils->interval_to_seconds($max_return) + int($due);
+        $logger->info("MAX OD: ".$max_return."  DUEDATE: ".$circ->due_date."  TODAY: ".$today."  DUE: ".$due."  LAST: ".$last_chance);
+
+        $max_return = 0 if $today < $last_chance;
+    }
+
+    if (!$max_return){  # there's either no max time to accept returns defined or we're within that time
+
+        my $void_lost = $U->ou_ancestor_setting_value(
+            $circ_lib, OILS_SETTING_VOID_LOST_ON_CHECKIN, $self->editor) || 0;
+        my $void_lost_fee = $U->ou_ancestor_setting_value(
+            $circ_lib, OILS_SETTING_VOID_LOST_PROCESS_FEE_ON_CHECKIN, $self->editor) || 0;
+        my $restore_od = $U->ou_ancestor_setting_value(
+            $circ_lib, OILS_SETTING_RESTORE_OVERDUE_ON_LOST_RETURN, $self->editor) || 0;
+
+        $self->checkin_handle_lost_now_found(3) if $void_lost;
+        $self->checkin_handle_lost_now_found(4) if $void_lost_fee;
+        $self->checkin_handle_lost_now_found_restore_od() if $restore_od;
+    }
+
+    $self->copy->status($U->copy_status(OILS_COPY_STATUS_RESHELVING));
+    $self->update_copy;
+}
+
+
 sub checkin_handle_backdate {
     my $self = shift;
 
@@ -2436,3 +2498,64 @@
 
 
 
+sub checkin_handle_lost_now_found {
+    my ($self, $bill_type) = @_;
+
+    # ------------------------------------------------------------------
+    # remove charge from patron's account if lost item is returned
+    # ------------------------------------------------------------------
+
+    my $bills = $self->editor->search_money_billing(
+        {
+            xact => $self->circ->id,
+            btype => $bill_type
+        }
+    );
+
+    $logger->debug("voiding lost item charge of  ".scalar(@$bills));
+    for my $bill (@$bills) {
+        if( !$U->is_true($bill->voided) ) {
+            $logger->info("lost item returned - voiding bill ".$bill->id);
+            $bill->voided('t');
+            $bill->void_time('now');
+            $bill->voider($self->editor->requestor->id);
+            my $note = ($bill->note) ? $bill->note . "\n" : '';
+            $bill->note("${note}System: VOIDED FOR LOST ITEM RETURNED");
+
+            $self->bail_on_events($self->editor->event)
+                unless $self->editor->update_money_billing($bill);
+        }
+    }
+}
+
+sub checkin_handle_lost_now_found_restore_od {
+    my $self = shift;
+
+    # ------------------------------------------------------------------
+    # restore those overdue charges voided when item was set to lost
+    # ------------------------------------------------------------------
+
+    my $ods = $self->editor->search_money_billing(
+        {
+                xact => $self->circ->id,
+                btype => 1
+        }
+    );
+
+    $logger->debug("returning overdue charges pre-lost  ".scalar(@$ods));
+    for my $bill (@$ods) {
+        if( $U->is_true($bill->voided) ) {
+                $logger->info("lost item returned - restoring overdue ".$bill->id);
+                $bill->voided('f');
+                $bill->clear_void_time;
+                $bill->voider($self->editor->requestor->id);
+                my $note = ($bill->note) ? $bill->note . "\n" : '';
+                $bill->note("${note}System: LOST RETURNED - OVERDUES REINSTATED");
+
+                $self->bail_on_events($self->editor->event)
+                        unless $self->editor->update_money_billing($bill);
+        }
+    }
+}
+
+

Modified: trunk/Open-ILS/src/perlmods/OpenILS/Const.pm
===================================================================
--- trunk/Open-ILS/src/perlmods/OpenILS/Const.pm	2009-03-16 19:58:55 UTC (rev 12547)
+++ trunk/Open-ILS/src/perlmods/OpenILS/Const.pm	2009-03-16 20:04:16 UTC (rev 12548)
@@ -83,9 +83,15 @@
 econst OILS_SETTING_HOLD_HARD_BOUNDARY => 'circ.hold_boundary.hard';
 econst OILS_SETTING_HOLD_EXPIRE => 'circ.hold_expire_interval';
 econst OILS_SETTING_HOLD_ESIMATE_WAIT_INTERVAL => 'circ.hold_estimate_wait_interval';
+econst OILS_SETTING_VOID_LOST_ON_CHECKIN                => 'circ.void_lost_on_checkin';
+econst OILS_SETTING_MAX_ACCEPT_RETURN_OF_LOST           => 'circ.max_accept_return_of_lost';
+econst OILS_SETTING_VOID_LOST_PROCESS_FEE_ON_CHECKIN    => 'circ.void_lost_proc_fee_on_checkin';
+econst OILS_SETTING_RESTORE_OVERDUE_ON_LOST_RETURN      => 'circ.restore_overdue_on_lost_return';
+econst OILS_SETTING_LOST_IMMEDIATELY_AVAILABLE          => 'circ.lost_immediately_available';
 
 
 
+
 econst OILS_HOLD_TYPE_COPY        => 'C';
 econst OILS_HOLD_TYPE_VOLUME      => 'V';
 econst OILS_HOLD_TYPE_TITLE       => 'T';



More information about the open-ils-commits mailing list