summaryrefslogtreecommitdiff
path: root/FS
diff options
context:
space:
mode:
authorIvan Kohler <ivan@freeside.biz>2012-08-30 00:48:19 -0700
committerIvan Kohler <ivan@freeside.biz>2012-08-30 00:48:19 -0700
commit708baebde34a2442ec41db38902e04f3c6ec4269 (patch)
treed9b31a2372d82a4fdcaaf38a93986297e8e9003a /FS
parent7c9457296c5dd8985eda5a8325ba1254223ec953 (diff)
parent56fbf4de4af0a18b611daaa50e42b5dac047a937 (diff)
Merge branch 'master' of git.freeside.biz:/home/git/freeside
Diffstat (limited to 'FS')
-rw-r--r--FS/FS/part_event.pm4
-rw-r--r--FS/FS/part_event/Condition/after_event.pm81
2 files changed, 83 insertions, 2 deletions
diff --git a/FS/FS/part_event.pm b/FS/FS/part_event.pm
index 62f16fa1c..b7371c9ab 100644
--- a/FS/FS/part_event.pm
+++ b/FS/FS/part_event.pm
@@ -306,8 +306,8 @@ sub targets {
});
my @tested_objects;
foreach my $object ( @objects ) {
- my $cust_event = $self->new_cust_event($object);
- next unless $cust_event->test_conditions('time' => $time);
+ my $cust_event = $self->new_cust_event($object, 'time' => $time);
+ next unless $cust_event->test_conditions;
$object->set('cust_event', $cust_event);
push @tested_objects, $object;
diff --git a/FS/FS/part_event/Condition/after_event.pm b/FS/FS/part_event/Condition/after_event.pm
new file mode 100644
index 000000000..1d8d2124e
--- /dev/null
+++ b/FS/FS/part_event/Condition/after_event.pm
@@ -0,0 +1,81 @@
+package FS::part_event::Condition::after_event;
+
+use strict;
+use FS::Record qw( qsearchs );
+use FS::part_event;
+use FS::cust_event;
+
+use base qw( FS::part_event::Condition );
+
+sub description { "After running another event" }
+
+# Runs the event at least X days after the most recent time another event
+# ran on the same object.
+
+sub option_fields {
+ (
+ 'eventpart' => { label=>'Event', type=>'select-part_event',
+ disable_empty => 1,
+ hashref => { disabled => '' },
+ },
+ 'run_delay' => { label=>'Delay', type=>'freq', value=>'1', },
+ );
+}
+
+# Specification:
+# Given an event B that has this condition, where the "eventpart"
+# option is set to event A, and the "run_delay" option is set to
+# X days.
+# This condition is TRUE if:
+# - Event A last ran X or more days in the past,
+# AND
+# - Event B has not run since the most recent occurrence of event A.
+
+sub condition {
+ # similar to "once_every", but with a different eventpart
+ my($self, $object, %opt) = @_;
+
+ my $obj_pkey = $object->primary_key;
+ my $tablenum = $object->$obj_pkey();
+
+ my $before = $self->option_age_from('run_delay',$opt{'time'});
+ my $eventpart = $self->option('eventpart');
+
+ my %hash = (
+ 'eventpart' => $eventpart,
+ 'tablenum' => $tablenum,
+ 'status' => { op => '!=', value => 'failed' },
+ );
+
+ my $most_recent_other = qsearchs( {
+ 'table' => 'cust_event',
+ 'hashref' => \%hash,
+ 'order_by' => " ORDER BY _date DESC LIMIT 1",
+ } )
+ or return 0; # if it hasn't run at all, return false
+
+ return 0 if $most_recent_other->_date > $before; # we're still in the delay
+
+ # now see if there's been an instance of this event since the one we're
+ # following...
+ $hash{'eventpart'} = $self->eventpart;
+ if ( $opt{'cust_event'} and $opt{'cust_event'}->eventnum =~ /^(\d+)$/ ) {
+ $hash{'eventnum'} = { op => '!=', value => $1 };
+ }
+
+ my $most_recent_self = qsearchs( {
+ 'table' => 'cust_event',
+ 'hashref' => \%hash,
+ 'order_by' => " ORDER BY _date DESC LIMIT 1",
+ } );
+
+ return 0 if defined($most_recent_self)
+ and $most_recent_self->_date >= $most_recent_other->_date;
+ # the follower has already run
+
+ 1;
+}
+
+# condition_sql, maybe someday
+
+1;