Allow fines to accrue during closings
authorMike Rylander <mrylander@gmail.com>
Fri, 23 Mar 2012 16:23:59 +0000 (12:23 -0400)
committerMike Rylander <mrylander@gmail.com>
Fri, 23 Mar 2012 16:48:51 +0000 (12:48 -0400)
Evergreen skips fines during scheduled closings.  With this commit, a new
Org Unit Setting labeled 'Charge fines on overdue circulations when closed'
is available to force fines to accrue during closures.

This work is sponsored by the NC Cardinal consortium in North Carolina.

Signed-off-by: Mike Rylander <mrylander@gmail.com>
Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Publisher/action.pm
Open-ILS/src/sql/Pg/950.data.seed-values.sql
Open-ILS/src/sql/Pg/upgrade/XXXX.data.fine-when-closed.sql [new file with mode: 0644]

index f6a4515..b448026 100644 (file)
@@ -14,6 +14,9 @@ use DateTime::Format::ISO8601;
 use OpenILS::Utils::Penalty;
 use POSIX qw(ceil);
 use OpenILS::Application::Circ::CircCommon;
+use OpenILS::Application::AppUtils;
+my $U = "OpenILS::Application::AppUtils";
+
 
 sub isTrue {
        my $v = shift;
@@ -901,6 +904,9 @@ sub generate_fines {
                        my $recurring_fine = int($c->$recurring_fine_method * 100);
                        my $max_fine = int($c->max_fine * 100);
 
+                       my $skip_closed_check = $U->ou_ancestor_setting_value($c->$circ_lib_method, 'circ.fines.charge_when_closed');
+                       $skip_closed_check = $skip_closed_check ? $skip_closed_check->{value} : 0;
+
                        my ($latest_billing_ts, $latest_amount) = ('',0);
                        for (my $bill = 1; $bill <= $pending_fine_count; $bill++) {
        
@@ -921,22 +927,24 @@ sub generate_fines {
                                        $current_bill_count--;
                                }
 
-                               my $dow = $billing_ts->day_of_week_0();
-                               my $dow_open = "dow_${dow}_open";
-                               my $dow_close = "dow_${dow}_close";
+                               if (!$skip_closed_check) {
+                                       my $dow = $billing_ts->day_of_week_0();
+                                       my $dow_open = "dow_${dow}_open";
+                                       my $dow_close = "dow_${dow}_close";
 
-                               if (my $h = $hoo{$c->$circ_lib_method}) {
-                                       next if ( $h->$dow_open eq '00:00:00' and $h->$dow_close eq '00:00:00');
+                                       if (my $h = $hoo{$c->$circ_lib_method}) {
+                                               next if ( $h->$dow_open eq '00:00:00' and $h->$dow_close eq '00:00:00');
+                                       }
+       
+                                       my $timestamptz = $billing_ts->strftime('%FT%T%z');
+                                       my @cl = actor::org_unit::closed_date->search_where(
+                                                       { close_start   => { '<=' => $timestamptz },
+                                                         close_end     => { '>=' => $timestamptz },
+                                                         org_unit      => $c->$circ_lib_method }
+                                       );
+                                       next if (@cl);
                                }
 
-                               my $timestamptz = $billing_ts->strftime('%FT%T%z');
-                               my @cl = actor::org_unit::closed_date->search_where(
-                                               { close_start   => { '<=' => $timestamptz },
-                                                 close_end     => { '>=' => $timestamptz },
-                                                 org_unit      => $c->$circ_lib_method }
-                               );
-                               next if (@cl);
-       
                                $current_fine_total += $recurring_fine;
                                $latest_amount += $recurring_fine;
                                $latest_billing_ts = $timestamptz;
index bc3321f..aa98c2e 100644 (file)
@@ -11409,6 +11409,26 @@ SELECT SETVAL('config.usr_activity_type_id_seq'::TEXT, 1000);
 INSERT INTO config.org_unit_setting_type 
     (name, label, description, grp, datatype) 
     VALUES (
+        'circ.fines.charge_when_closed',
+         oils_i18n_gettext(
+            'circ.fines.charge_when_closed',
+            'Charge fines on overdue circulations when closed',
+            'coust', 
+            'label'
+        ),
+        oils_i18n_gettext(
+            'circ.fines.charge_when_closed',
+            'Normally, fines are not charged when a library is closed.  When set to True, fines will be charged during scheduled closings and normal weekly closed days.',
+            'coust', 
+            'description'
+        ),
+        'circ',
+        'bool'
+    );
+
+INSERT INTO config.org_unit_setting_type 
+    (name, label, description, grp, datatype) 
+    VALUES (
         'circ.patron.usr_activity_retrieve.max',
          oils_i18n_gettext(
             'circ.patron.usr_activity_retrieve.max',
diff --git a/Open-ILS/src/sql/Pg/upgrade/XXXX.data.fine-when-closed.sql b/Open-ILS/src/sql/Pg/upgrade/XXXX.data.fine-when-closed.sql
new file mode 100644 (file)
index 0000000..e3989cd
--- /dev/null
@@ -0,0 +1,21 @@
+
+INSERT INTO config.org_unit_setting_type
+    (name, label, description, grp, datatype)
+    VALUES (
+        'circ.fines.charge_when_closed',
+         oils_i18n_gettext(
+            'circ.fines.charge_when_closed',
+            'Charge fines on overdue circulations when closed',
+            'coust',
+            'label'
+        ),
+        oils_i18n_gettext(
+            'circ.fines.charge_when_closed',
+            'Normally, fines are not charged when a library is closed.  When set to True, fines will be charged during scheduled closings and normal weekly closed days.',
+            'coust',
+            'description'
+        ),
+        'circ',
+        'bool'
+    );
+