diff options
author | mark <mark> | 2012-02-15 01:32:10 +0000 |
---|---|---|
committer | mark <mark> | 2012-02-15 01:32:10 +0000 |
commit | c6e4f9460f44a7440ef2fa7e67ed51dfe40a7668 (patch) | |
tree | e9df9004013e69645978fa0a3e1c66ad8c7ad6c2 /FS/FS/part_event.pm | |
parent | ca7ff572923114a72daae24e85f33ad89ebb5ab9 (diff) |
query billing events to see affected objects, #15142
Diffstat (limited to 'FS/FS/part_event.pm')
-rw-r--r-- | FS/FS/part_event.pm | 82 |
1 files changed, 53 insertions, 29 deletions
diff --git a/FS/FS/part_event.pm b/FS/FS/part_event.pm index dfbb6a5..31d2afd 100644 --- a/FS/FS/part_event.pm +++ b/FS/FS/part_event.pm @@ -253,31 +253,23 @@ sub templatename { } } -=item initialize PARAMS - -Identify all objects eligible for this event and create L<FS::cust_event> -records for each of them, as of the present time, with status "initial". When -combined with conditions that prevent an event from running more than once -(at all or within some period), this will exclude any objects that met the -conditions before the event was created. +=item targets -If an L<FS::part_event> object needs to be initialized, it should be created -in a disabled state to avoid running the event prematurely for any existing -objects. C<initialize> will enable it once all the cust_event records -have been created. +Returns all objects (of type C<FS::eventtable>, for this object's +C<eventtable>) eligible for processing under this event, as of right now. +The L<FS::cust_event> object used to test event conditions will be +included in each object as the 'cust_event' pseudo-field. -This may take some time, so it should be run from the job queue. +This is not used in normal event processing (which is done on a +per-customer basis to control timing of pre- and post-billing events) +but can be useful when configuring events. =cut -sub initialize { +sub targets { my $self = shift; my $time = time; # $opt{'time'}? - my $oldAutoCommit = $FS::UID::AutoCommit; - local $FS::UID::AutoCommit = 0; - my $dbh = dbh; - my $eventpart = $self->eventpart; $eventpart =~ /^\d+$/ or die "bad eventpart $eventpart"; my $eventtable = $self->eventtable; @@ -286,38 +278,70 @@ sub initialize { my $linkage = ''; # this is the 'object' side of the FROM clause if ( $eventtable ne 'cust_main' ) { - $linkage = ($self->eventtables_cust_join->{$eventtable} || '') . - ' LEFT JOIN cust_main USING (custnum) ' + $linkage = + ($self->eventtables_cust_join->{$eventtable} || '') . + ' LEFT JOIN cust_main USING (custnum) '; } # this is the 'event' side - my $join = FS::part_event_condition->join_conditions_sql( $eventtable ); + my $join = FS::part_event_condition->join_conditions_sql( $eventtable ); my $where = FS::part_event_condition->where_conditions_sql( $eventtable, 'time' => $time ); - $join = $linkage . + $join = $linkage . " INNER JOIN part_event ON ( part_event.eventpart = $eventpart ) $join"; $where .= ' AND cust_main.agentnum = '.$self->agentnum if $self->agentnum; - # don't enforce check_freq since this is a special, out-of-order check, - # and don't enforce disabled because we want to do this with the part_event - # disabled. + # don't enforce check_freq since this is a special, out-of-order check + # and don't enforce disabled because we want to be able to see targets + # for a disabled event + my @objects = qsearch({ table => $eventtable, hashref => {}, addl_from => $join, extra_sql => "WHERE $where", - debug => 1, }); - warn "initialize: ".(scalar @objects) ." $eventtable objects found\n" - if $DEBUG; - my $error = ''; + my @tested_objects; foreach my $object ( @objects ) { - # test conditions 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; + } + @tested_objects; +} + +=item initialize PARAMS + +Identify all objects eligible for this event and create L<FS::cust_event> +records for each of them, as of the present time, with status "initial". When +combined with conditions that prevent an event from running more than once +(at all or within some period), this will exclude any objects that met the +conditions before the event was created. + +If an L<FS::part_event> object needs to be initialized, it should be created +in a disabled state to avoid running the event prematurely for any existing +objects. C<initialize> will enable it once all the cust_event records +have been created. + +This may take some time, so it should be run from the job queue. + +=cut + +sub initialize { + my $self = shift; + my $error; + + my $oldAutoCommit = $FS::UID::AutoCommit; + local $FS::UID::AutoCommit = 0; + my $dbh = dbh; + + my @objects = $self->targets; + foreach my $object ( @objects ) { + my $cust_event = $object->get('cust_event'); $cust_event->status('initial'); $error = $cust_event->insert; last if $error; |