New features for telephony currently in use at KCLS
[Evergreen.git] / Open-ILS / src / support-scripts / rollover_phone_to_print.pl
1 #!/usr/bin/perl
2
3 # This script asks the Evergreen Telephony mediator (eg-pbx-mediator) via
4 # XML-RPC call for the A/T event IDs involved in failed notifications.
5 #
6 # With those IDs in hand, it uses cstore to find the events and make new,
7 # similar events with a different event_defintion.  The idea is to make it
8 # possible to "rollover" failed telephony notification events as, say, print
9 # or email notification events.
10 #
11 # Search further in this file for 'CONFIGURE HERE'.
12
13 require "/openils/bin/oils_header.pl";
14
15 use strict;
16 use warnings;
17 use OpenSRF::Utils::Logger qw/$logger/;
18 use OpenSRF::Utils::SettingsClient;
19
20 use RPC::XML;
21 use RPC::XML::Client;
22 use Data::Dumper;
23
24 # Keys and values should both be event defintion IDs.  The keys should be
25 # the original event defintions, the values should be the rolled-over event
26 # definitions.
27 my %rollover_map = (
28     # CONFIGURE HERE. e.g.   24 => 1    # telephone overdue => email overdue
29 );
30
31 sub create_event_for_object {
32     my ($editor, $event_def, $target) = @_;
33
34     # there is no consideration of usr opt_in_settings, and no consideration of 
35     # delay_field here
36
37     my $event = Fieldmapper::action_trigger::event->new();
38     $event->target($target);
39     $event->event_def($event_def);
40     $event->run_time("now");
41
42     # state will be 'pending' by default
43
44     $editor->create_action_trigger_event($event);
45     return $event->id;
46 }
47
48 sub rollover_events_phone_to_print {
49     my ($editor, $event_ids) = @_;
50     my $finished = [];
51
52     foreach my $id (@$event_ids) {
53         my $event = $editor->retrieve_action_trigger_event($id);
54
55         if (not $event) {
56             $logger->warn("couldn't find event $id for rollover");
57             next;
58         } elsif (not exists $rollover_map{$event->event_def}) {
59             $logger->warn(
60                 sprintf(
61                     "event %d has event_def %d which is not in rollover map",
62                     $id, $event->event_def
63                 )
64             );
65             next;
66         } elsif (not $event->target) {
67             $logger->warn("event $id has no target, cannot rollover");
68             next;
69         }
70
71         if (my $new_id = create_event_for_object(
72             $editor,
73             $rollover_map{$event->event_def},
74             $event->target
75         )) {
76             $logger->info("rollover created event $new_id from event " . $event->id);
77             push @$finished, $new_id;
78         }
79     }
80
81     return $finished;
82 }
83
84 #############################################################################
85 ### main
86
87 if (not scalar keys %rollover_map) {
88     die("You must first define some mappings in \%rollover_map (see source)\n");
89 }
90
91 osrf_connect($ENV{SRF_CORE} || "/openils/conf/opensrf_core.xml");
92
93 my $settings = OpenSRF::Utils::SettingsClient->new;
94 my $mediator_host = $settings->config_value(notifications => telephony => "host");
95 my $mediator_port = $settings->config_value(notifications => telephony => "port");
96
97 my $url = "http://$mediator_host:$mediator_port/";
98
99 my $rpc_client = new RPC::XML::Client($url);
100 my $event_ids = $rpc_client->simple_request("get_failures");
101
102 my $editor =  new OpenILS::Utils::CStoreEditor("xact" => 1);
103
104 my $done = rollover_events_phone_to_print($editor, $event_ids);
105
106 $editor->commit;
107 my $acked = $rpc_client->simple_request("ack_failures", $done);
108 $logger->info("after rollover, mediator acknowledged $acked callfiles");
109
110 0;