diff options
| author | Mark Wells <mark@freeside.biz> | 2012-08-29 15:50:12 -0700 | 
|---|---|---|
| committer | Mark Wells <mark@freeside.biz> | 2012-08-29 15:50:12 -0700 | 
| commit | b69b7d879e91a875b2166002712a6d05f63d4fc9 (patch) | |
| tree | 246d2ea833d214bde32ac1fc54d1b8ce747abf36 /FS | |
| parent | 6582619e75b10d84d739c9422413e9d0754ce37b (diff) | |
after_event condition, #18687
Diffstat (limited to 'FS')
| -rw-r--r-- | FS/FS/part_event/Condition/after_event.pm | 78 | 
1 files changed, 78 insertions, 0 deletions
| 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..c59d84748 --- /dev/null +++ b/FS/FS/part_event/Condition/after_event.pm @@ -0,0 +1,78 @@ +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', }, +    '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; | 
