summaryrefslogtreecommitdiff
path: root/FS/FS/cust_event.pm
diff options
context:
space:
mode:
authorMark Wells <mark@freeside.biz>2016-04-06 14:09:42 -0700
committerMark Wells <mark@freeside.biz>2016-04-06 14:10:50 -0700
commit4fcc2ecff984d1032cef03b7345c460024a345c9 (patch)
treecab771f97f82c0be433ccdfa9f980b39a79f7a02 /FS/FS/cust_event.pm
parent26e430087cb3edc1ea2d4a7e6ee2d7a3214a017e (diff)
add cust_event.no_action flag for events that conditionally execute, #36741
Diffstat (limited to 'FS/FS/cust_event.pm')
-rw-r--r--FS/FS/cust_event.pm53
1 files changed, 48 insertions, 5 deletions
diff --git a/FS/FS/cust_event.pm b/FS/FS/cust_event.pm
index 1d8af1e..3edfaef 100644
--- a/FS/FS/cust_event.pm
+++ b/FS/FS/cust_event.pm
@@ -54,6 +54,13 @@ L<Time::Local> and L<Date::Parse> for conversion functions.
=item statustext - additional status detail (i.e. error or progress message)
+=item no_action - 'Y' if the event action wasn't performed. Some actions
+contain an internal check to see if the action is going to be impossible (for
+example, emailing a notice to a customer who has no email address), and if so,
+won't attempt the action. It shouldn't be reported as a failure because
+there's no need to retry it. However, the action should set no_action = 'Y'
+so that there's a record.
+
=back
=head1 METHODS
@@ -141,6 +148,7 @@ sub check {
|| $self->ut_number('_date')
|| $self->ut_enum('status', [qw( new locked done failed initial)])
|| $self->ut_anything('statustext')
+ || $self->ut_flag('no_action')
;
return $error if $error;
@@ -372,11 +380,46 @@ sub search_sql_where {
push @search, "cust_event._date <= $1";
}
- if ( $param->{'failed'} ) {
- push @search, "statustext != ''",
- "statustext IS NOT NULL",
- "statustext != 'N/A'";
- }
+ #if ( $param->{'failed'} ) {
+ # push @search, "statustext != ''",
+ # "statustext IS NOT NULL",
+ # "statustext != 'N/A'";
+ #}
+ # huh?
+
+ if ( $param->{'event_status'} ) {
+
+ my @status;
+ my ($done_Y, $done_N);
+ foreach (@{ $param->{'event_status'} }) {
+ if ($_ eq 'done_Y') {
+ $done_Y = 1;
+ } elsif ( $_ eq 'done_N' ) {
+ $done_N = 1;
+ } else {
+ push @status, $_;
+ }
+ }
+ if ( $done_Y or $done_N ) {
+ push @status, 'done';
+ }
+ if ( @status ) {
+ push @search, "cust_event.status IN(" .
+ join(',', map "'$_'", @status) .
+ ')';
+ }
+
+ if ( $done_Y and not $done_N ) {
+ push @search, "cust_event.no_action IS NULL";
+ } elsif ( $done_N and not $done_Y ) {
+ push @search, "cust_event.no_action = 'Y'";
+ } # else they're both true, so don't add a constraint, or both false,
+ # and it doesn't matter.
+
+ } # event_status
+
+ # always hide initialization
+ push @search, 'cust_event.status != \'initial\'';
if ( $param->{'custnum'} =~ /^(\d+)$/ ) {
push @search, "cust_main.custnum = '$1'";