add method for creating events by definition(s) (array accepted), including testing...
authormiker <miker@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Tue, 31 Mar 2009 20:32:04 +0000 (20:32 +0000)
committermiker <miker@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Tue, 31 Mar 2009 20:32:04 +0000 (20:32 +0000)
git-svn-id: svn://svn.open-ils.org/ILS/trunk@12742 dcc99617-32d9-48b4-a31d-7c20da2025e4

Open-ILS/src/perlmods/OpenILS/Application/Trigger.pm

index 577d718..5c14737 100644 (file)
@@ -91,6 +91,82 @@ __PACKAGE__->register_method(
     argc     => 3
 );
 
+sub create_event_for_object_and_def {
+    my $self = shift;
+    my $client = shift;
+    my $definitions = shift;
+    my $target = shift;
+    my $location = shift;
+
+    my $ident = $target->Identity;
+    my $ident_value = $target->$ident();
+
+    my @active = ($self->api_name =~ /inactive/o) ? () : ( active => 't' );
+
+    my $editor = new_editor(xact=>1);
+
+    my $orgs = $editor->json_query({ from => [ 'actor.org_unit_ancestors' => $location ] });
+    my $defs = $editor->search_action_trigger_event_definition(
+        { id => $definitions,
+          owner  => [ map { $_->{id} } @$orgs  ],
+          $active
+        }
+    );
+
+    my $hooks = $editor->search_action_trigger_hook(
+        { key       => [ map { $_->hook } @$defs ],
+          core_type => $target->json_hint
+        }
+    );
+
+    my %hook_hash = map { ($_->key, $_) } @$hooks;
+
+    for my $def ( @$defs ) {
+
+        my $date = DateTime->now;
+
+        if ($hook_hash{$def->hook}->passive eq 'f') {
+
+            if (my $dfield = $def->delay_field) {
+                if ($target->$dfield()) {
+                    $date = DateTime::Format::ISO8601->new->parse_datetime( clense_ISO8601($target->$dfield) );
+                } else {
+                    next;
+                }
+            }
+
+            $date->add( seconds => interval_to_seconds($def->delay) );
+        }
+
+        my $event = Fieldmapper::action_trigger::event->new();
+        $event->target( $ident_value );
+        $event->event_def( $def->id );
+        $event->run_time( $date->strftime( '%F %T%z' ) );
+
+        $editor->create_action_trigger_event( $event );
+
+        $client->respond( $event->id );
+    }
+
+    $editor->commit;
+
+    return undef;
+}
+__PACKAGE__->register_method(
+    api_name => 'open-ils.trigger.event.autocreate.by_definition',
+    method   => 'create_event_for_object_and_def',
+    api_level=> 1,
+    stream   => 1,
+    argc     => 3
+);
+__PACKAGE__->register_method(
+    api_name => 'open-ils.trigger.event.autocreate.by_definition.include_inactive',
+    method   => 'create_event_for_object_and_def',
+    api_level=> 1,
+    stream   => 1,
+    argc     => 3
+);
+
 
 # Retrieves events by object, or object type + filter
 #  $object : a target object or object type (class hint)