1 package OpenILS::Application::Trigger;
2 use OpenILS::Application;
3 use base qw/OpenILS::Application/;
5 use OpenSRF::EX qw/:try/;
7 use OpenSRF::AppSession;
8 use OpenSRF::Utils::SettingsClient;
9 use OpenSRF::Utils::Logger qw/:level/;
10 use OpenSRF::Utils qw/:datetime/;
13 use DateTime::Format::ISO8601;
15 use OpenILS::Utils::Fieldmapper;
16 use OpenILS::Utils::CStoreEditor q/:funcs/;
17 use OpenILS::Application::Trigger::Event;
20 my $log = 'OpenSRF::Utils::Logger';
25 sub create_events_for_object {
32 my $ident = $target->Identity;
33 my $ident_value = $target->$ident();
35 my $editor = new_editor(xact=>1);
37 my $hooks = $editor->search_action_trigger_hook([
39 core_type => $target->json_hint
44 my %hook_hash = map { ($_->id, $_) } @$hooks;
46 my $orgs = $editor->json_query({ from => [ 'actor.org_unit_ancestors' => $location ] });
47 my $defs = $editor->search_action_trigger_event_definition([
49 owner => [ map { $_->{id} } @$orgs ],
55 for my $def ( @$defs ) {
57 my $date = DateTime->now;
59 if ($hook_hash{$def->hook}->passive eq 'f') {
61 if (my $dfield = $def->delay_field) {
62 if ($target->$dfield()) {
63 $date = DateTime::Format::ISO8601->new->parse_datetime( clense_ISO8601($target->$dfield) );
69 $date->add( seconds => interval_to_seconds($def->delay) );
72 my $event = Fieldmapper::action_trigger::event->new();
73 $event->target( $ident_value );
74 $event->event_def( $def->id );
75 $event->run_time( $date->strftime( '%G %T%z' ) );
77 $event = $editor->create_action_trigger_event( $event );
79 $client->respond( $event->id );
86 __PACKAGE__->register_method(
87 api_name => 'open-ils.trigger.event.autocreate',
88 method => 'create_events_for_object',
95 sub fire_single_event {
100 my $e = OpenILS::Application::Trigger::Event->new($event_id);
102 if ($e->validate->valid) {
108 reacted => $e->reacted,
109 cleanedup => $e->cleanedup,
113 __PACKAGE__->register_method(
114 api_name => 'open-ils.trigger.event.fire',
115 method => 'fire_single_event',
123 my $events = shift; # expects events ready for reaction
126 if (ref($events) eq 'ARRAY') {
129 for my $e ( @$events ) {
130 for my $evn_part ( keys %{ $e->environment } ) {
131 if ($env_part eq 'target') {
132 push @{ $$evn{target} }, $e->environment->{target};
133 } elsif ($env_part eq 'event') {
134 push @{ $$evn{event} }, $e->environment->{event};
136 push @{ $$evn{$evn_part} }, $e->environment->{$evn_part};
141 $env = $events->environment;
146 for my $e ( @$events ) {
147 next unless ($e->valid);
148 push @event_list, $e;
151 $event_list[0]->react( $env );
152 $event_list[0]->cleanup( $env );
155 reacted => $event_list[0]->reacted,
156 cleanedup => $event_list[0]->cleanedup,
157 events => @event_list == 1 ? $event_list[0] : \@event_list
160 __PACKAGE__->register_method(
161 api_name => 'open-ils.trigger.event.run_validated',
162 method => 'fire_single_event',
172 my $editor = new_editor();
174 return $editor->search_action_trigger_event([
175 { state => 'pending', run_time => {'<' => 'now'} },
179 __PACKAGE__->register_method(
180 api_name => 'open-ils.trigger.event.find_pending',
181 method => 'pending_events',
190 my ($events) = $self->method_lookup('open-ils.trigger.event.find_pending')->run();
192 my %groups = ( '*' => [] );
194 for my $e_id ( @$events ) {
195 my $e = OpenILS::Application::Trigger::Event->new($e_id);
196 if ($e->validate->valid) {
197 if (my $group = $event->event->event_def->group_field) {
199 # split the grouping link steps
200 my @steps = split '.', $group;
202 # find the grouping object
203 my $node = $event->target;
204 $node = $node->$_() for ( @steps );
206 # get the pkey value for the grouping object on this event
207 my $node_ident = $node->Identity;
208 my $ident_value = $node->$node_ident();
210 # push this event onto the event+grouping_pkey_value stack
211 $groups{$e->event->event_def->id}{$ident_value} ||= [];
212 push @{ $groups{$e->event->event_def->id}{$ident_value} }, $e_id;
214 # it's a non-grouped event
215 push @{ $groups{'*'} }, $e_id;
222 __PACKAGE__->register_method(
223 api_name => 'open-ils.trigger.event.found_by_group',
224 method => 'grouped_events',