[open-ils-commits] r10281 - trunk/Open-ILS/src/support-scripts

svn at svn.open-ils.org svn at svn.open-ils.org
Wed Aug 6 17:33:50 EDT 2008


Author: erickson
Date: 2008-08-06 17:33:40 -0400 (Wed, 06 Aug 2008)
New Revision: 10281

Added:
   trunk/Open-ILS/src/support-scripts/generate_circ_notices.pl
Log:

This is a remodeled version of Evergreen/src/support-scripts/eg_gen_overdue.pl.

This version is built to work for both overdue and predue (courtesy) notices.

What we have so far is circ searching and retrieval of associated data.

TODO
- Add some tuning for sub-day notice intervals
- Plug in Template Toolkit for template generation
- Set up and test emailing of templates
- Handle global XML file generation (send all loaded data to a TT XML template as a last step?)
- Add sample templates to repo
- Add sample config to opensrf.xml.example



Added: trunk/Open-ILS/src/support-scripts/generate_circ_notices.pl
===================================================================
--- trunk/Open-ILS/src/support-scripts/generate_circ_notices.pl	                        (rev 0)
+++ trunk/Open-ILS/src/support-scripts/generate_circ_notices.pl	2008-08-06 21:33:40 UTC (rev 10281)
@@ -0,0 +1,220 @@
+#!/usr/bin/perl
+# ---------------------------------------------------------------
+# Copyright (C) 2008  Georgia Public Library Service
+# Bill Erickson <erickson at esilibrary.com>
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#  ---------------------------------------------------------------
+use strict; use warnings;
+require 'oils_header.pl';
+use vars qw/$logger/;
+use DateTime;
+use Data::Dumper;
+use Email::Send;
+use Getopt::Long;
+use Unicode::Normalize;
+use DateTime::Format::ISO8601;
+use OpenSRF::Utils qw/:datetime/;
+use OpenSRF::Utils::JSON;
+use OpenSRF::Utils::SettingsClient;
+use OpenSRF::AppSession;
+use OpenILS::Const qw/:const/;
+use OpenILS::Application::AppUtils;
+use OpenILS::Const qw/:const/;
+my $U = 'OpenILS::Application::AppUtils';
+
+my $settings = undef;
+my $e = OpenILS::Utils::CStoreEditor->new;
+
+my ($osrf_config, $send_email, $gen_day_intervals, $days_back) = 
+    ('/openils/conf/opensrf_core.xml', 1, 0, 0); 
+
+GetOptions(
+    'osrf_osrf_config=s' => \$osrf_config,
+    'send-emails' => \$send_email,
+    'generate-day-intervals' => \$gen_day_intervals,
+    'days-back=s' => \$days_back,
+);
+
+sub help {
+    print <<HELP;
+        --config <config_file>
+        
+        --send-emails If set, generate email notices
+
+        --generate-day-intervals If set, notices which have a notify_interval of >= 1 day will be processed.
+
+        --days-back <days_back_comma_separted>  This is used to set the effective run date of the script.
+            This is useful if you don't want to generate notices on certain days.  For example, if you don't 
+            generate notices on the weekend, you would run this script on weekdays and set --days-back to 
+            0,1,2 when it's run on Monday to capture any notices from Saturday and Sunday. 
+HELP
+}
+
+
+sub main {
+    osrf_connect($osrf_config);
+    $settings = OpenSRF::Utils::SettingsClient->new;
+
+    my $smtp_server = $settings->config_value(notifications => 'smtp_server');
+    my $sender_address = $settings->config_value(notifications => 'sender_address');
+    my $od_sender_addr = $settings->config_value(notifications => overdue => 'sender_address') || $sender_address;
+    my $pd_sender_addr = $settings->config_value(notifications => predue => 'sender_address') || $sender_address;
+    my $overdue_notices = $settings->config_value(notifications => overdue => 'notice');
+    my $predue_notices = $settings->config_value(notifications => predue => 'notice');
+
+    $overdue_notices = [$overdue_notices] unless ref $overdue_notices eq 'ARRAY'; 
+    $predue_notices = [$predue_notices] unless ref $predue_notices eq 'ARRAY'; 
+
+    my @overdues = sort { 
+        OpenSRF::Utils->interval_to_seconds($a->{notify_interval}) <=> 
+        OpenSRF::Utils->interval_to_seconds($b->{notify_interval}) } @$overdue_notices;
+
+    my @predues = sort { 
+        OpenSRF::Utils->interval_to_seconds($a->{notify_interval}) <=> 
+        OpenSRF::Utils->interval_to_seconds($b->{notify_interval}) } @$predue_notices;
+
+    generate_notice_set($_, $od_sender_addr, 'overdue') for @overdues;
+    generate_notice_set($_, $pd_sender_addr, 'predue') for @predues;
+}
+
+
+sub generate_notice_set {
+    my($notice, $smtp_sender, $type) = @_;
+
+    my $notify_interval = OpenSRF::Utils->interval_to_seconds($notice->{notify_interval});
+    $notify_interval = -$notify_interval if $type eq 'overdue';
+
+    my ($start_date, $end_date) = make_date_range(-$days_back + $notify_interval);
+
+    $logger->info("notice: retrieving circs with due date in range $start_date -> $end_date");
+
+    my $QUERY = {
+        select => {
+            circ => ['id']
+        }, 
+        from => 'circ', 
+        where => {
+            '+circ' => {
+                checkin_time => undef, 
+                '-or' => [
+                    {stop_fines => ["LOST","LONGOVERDUE","CLAIMSRETURNED"]},
+                    {stop_fines => undef}
+                ],
+				due_date => {between => [$start_date, $end_date]},
+            }
+        }
+    };
+
+    # if a circ duration is defined for this type of notice
+    if(my $durs = $settings->{circ_duration_range}) {
+        $QUERY->{where}->{'+circ'}->{duration} = {between => [$durs->{from}, $durs->{to}]};
+    }
+
+    my $ses = OpenSRF::AppSession->create('open-ils.cstore');
+    my $req = $ses->request('open-ils.cstore.json_query', $QUERY);
+    my @circs;
+    my $resp;
+    push(@circs, $resp->content->{id}) while ($resp = $req->recv(timeout=>1800));
+    process_circs($notice, @circs);
+}
+
+
+sub process_circs {
+    my $notice = shift;
+    my $type = shift;
+    my @circs = @_;
+
+	return unless @circs;
+
+	$logger->info("notice: processing $type notices with notify interval ". 
+        $notice->{notify_interval}."  and ".scalar(@circs)." circs");
+
+	my $org; 
+	my $patron;
+	my @current;
+
+	my $x = 0;
+	for my $circ (@circs) {
+		$circ = $e->retrieve_action_circulation($circ);
+
+		if( !defined $org or 
+				$circ->circ_lib != $org  or $circ->usr ne $patron ) {
+			$org = $circ->circ_lib;
+			$patron = $circ->usr;
+			generate_notice($notice, @current) if @current;
+			@current = ();
+		}
+
+		push( @current, $circ );
+		$x++;
+	}
+
+	$logger->info("notice: processed $x circs");
+	generate_notice($notice, @current);
+}
+
+sub generate_notice {
+    my $notice = shift;
+    my @circs = @_;
+
+	my $org = $circs[0]->circ_lib;
+	my $usr = $circs[0]->usr;
+	$logger->debug("notice: printing user:$usr org:$org");
+
+    my $circ_objs = $e->batch_retrieve_action_circulation([
+        \@circs,
+        {   flesh => 3,
+            flesh_fields => {
+                circ => [q/target_copy circ_lib usr/],
+                acp => ['call_number'],
+                acn => ['record'],
+                aou => [qw/billing_address mailing_address/],
+                au => [qw/card billing_address mailing_address/] 
+            }
+        }
+    ]);
+
+    print $_->circ_lib->shortname . ' : ' . $_->usr->usrname . 
+        ' : ' .  $_->target_copy->barcode . "\n" for @$circ_objs;
+}
+
+=head
+	if( $circ->copy->call_number->id == OILS_PRECAT_CALL_NUMBER ) {
+		$data->{title} = $copy->dummy_title || '';
+		$data->{author} = $copy->dummy_author || '';
+    } else {
+        $data->{mvr} = $U->record_to_mvr($copy->call_number->record);
+		$data->{title} = $data->{mvr}->title || '';
+		$data->{author} = $data->{mvr}->author || '';
+    }
+=cut
+
+sub make_date_range {
+	my $offset = shift;
+    #my $is_day_precision = shift; # window?
+
+	my $epoch = CORE::time + $offset;
+	my $date = DateTime->from_epoch(epoch => $epoch, time_zone => 'local');
+
+	$date->set_hour(0);
+	$date->set_minute(0);
+	$date->set_second(0);
+	my $start = "$date";
+	
+	$date->set_hour(23);
+	$date->set_minute(59);
+	$date->set_second(59);
+
+	return ($start, "$date");
+}
+
+main();


Property changes on: trunk/Open-ILS/src/support-scripts/generate_circ_notices.pl
___________________________________________________________________
Name: svn:executable
   + *



More information about the open-ils-commits mailing list