From: Mark Wells Date: Tue, 21 Feb 2012 07:02:16 +0000 (-0800) Subject: customer signup date event condition, #16591 X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=commitdiff_plain;h=42c5857d4df6eb6108a7d5f79569c9273384a245 customer signup date event condition, #16591 --- diff --git a/FS/FS/Mason.pm b/FS/FS/Mason.pm index 6cc32bd04..63eb47cab 100644 --- a/FS/FS/Mason.pm +++ b/FS/FS/Mason.pm @@ -546,6 +546,8 @@ sub mason_interps { ${$_[0]} =~ s/(['\\])/\\$1/g; ${$_[0]} =~ s/\r/\\r/g; ${$_[0]} =~ s/\n/\\n/g; + # prevent premature termination of the script + ${$_[0]} =~ s[][<\\/script>]ig; ${$_[0]} = "'". ${$_[0]}. "'"; }; diff --git a/FS/FS/part_event/Condition.pm b/FS/FS/part_event/Condition.pm index 914256f45..b969cf6f8 100644 --- a/FS/FS/part_event/Condition.pm +++ b/FS/FS/part_event/Condition.pm @@ -269,6 +269,23 @@ sub option_label { =back +=item option_type OPTION + +Returns the type of the option, as a string: 'text', 'money', 'date', +or 'freq'. + +=cut + +sub option_type { + my( $self, $optionname ) = @_; + + my %option_fields = $self->option_fields; + + ref( $option_fields{$optionname} ) + ? $option_fields{$optionname}->{'type'} + : 'text' +} + =item option_age_from OPTION FROM_TIMESTAMP Retreives a condition option, parses it from a frequency (such as "1d", "1w" or diff --git a/FS/FS/part_event/Condition/signupdate.pm b/FS/FS/part_event/Condition/signupdate.pm new file mode 100644 index 000000000..30613a2ce --- /dev/null +++ b/FS/FS/part_event/Condition/signupdate.pm @@ -0,0 +1,48 @@ +package FS::part_event::Condition::signupdate; + +use strict; +use base qw( FS::part_event::Condition ); +use FS::Record qw(str2time_sql str2time_sql_closing); +use Date::Parse 'str2time'; + +sub description { 'Customer signed up during date range' } + +sub option_fields { + ( + # actually stored as strings + 'start' => { label => 'First day', + type => 'date', + format => '%Y-%m-%d', }, + 'end' => { label => 'Last day', + type => 'date', + format => '%Y-%m-%d', }, + ); +} + +sub condition { + + my($self, $object, %opt) = @_; + + my $cust_main = $self->cust_main($object); + my $start = $self->option('start'); + my $end = $self->option('end'); + + (!$start or $cust_main->signupdate >= str2time($start)) and + (!$end or $cust_main->signupdate < str2time($end) + 86400); +} + +sub condition_sql { + my( $class, $table, %opt ) = @_; + return 'true' if $opt{'driver_name'} ne 'Pg'; + + my $start = $class->condition_sql_option('start'); + my $end = $class->condition_sql_option('end'); + + $start = "$start IS NULL OR cust_main.signupdate >=" . + str2time_sql . "($start)::timestamp" . str2time_sql_closing; + $end = "$end IS NULL OR cust_main.signupdate < 86400 + " . + str2time_sql . "($end)::timestamp" . str2time_sql_closing; + "($start) AND ($end)"; +} + +1; diff --git a/httemplate/edit/part_event.html b/httemplate/edit/part_event.html index e005cbba0..702471b73 100644 --- a/httemplate/edit/part_event.html +++ b/httemplate/edit/part_event.html @@ -500,6 +500,9 @@ tie my %all_conditions, 'Tie::IxHash', '' => { 'description' => '*** Select new condition ***', }, FS::part_event_condition->conditions(); +# *** Select new condition *** sorts to the beginning anyway +(tied %all_conditions)->SortByValue; + my %condition_labels = map { $_ => $all_conditions{$_}->{'description'} } keys %all_conditions; @@ -539,6 +542,8 @@ tie my %all_actions, 'Tie::IxHash', '' => { 'description' => '*** Select event action ***', }, FS::part_event->actions(); +(tied %all_actions)->SortByValue; + my %action_labels = map { $_ => $all_actions{$_}->{'description'} } keys %all_actions; diff --git a/httemplate/elements/selectlayers.html b/httemplate/elements/selectlayers.html index 89fe41b1b..dd279bd16 100644 --- a/httemplate/elements/selectlayers.html +++ b/httemplate/elements/selectlayers.html @@ -162,6 +162,7 @@ Example: my $conf = new FS::Conf; my $money_char = $conf->config('money_char') || '$'; +my $date_noinit = 0; <%init> @@ -220,10 +221,24 @@ sub layer_callback { my $type = $lf->{type} || 'text'; my $include = $type; - $include = "input-$include" if $include =~ /^(text|money)$/; - $include = "tr-$include" unless $include eq 'hidden'; - $html .= include( "/elements/$include.html", + if ( $include eq 'date' ) { + # several important differences from other tr-* + $html .= include( '/elements/tr-input-date-field.html', + { + 'name' => "$layer_prefix$field", + 'value' => $value, + 'label' => $lf->{label}, + 'format'=> $lf->{format}, + 'noinit'=> $date_noinit, + } + ); + $date_noinit = 1; + } + else { + $include = "input-$include" if $include =~ /^(text|money)$/; + $include = "tr-$include" unless $include eq 'hidden'; + $html .= include( "/elements/$include.html", %$lf, 'field' => "$layer_prefix$field", 'id' => "$layer_prefix$field", #separate? @@ -233,8 +248,8 @@ sub layer_callback { 'value' => ( $lf->{'value'} || $value ), #hmm. 'curr_value' => $value, ); - - } + } + } #foreach $field $html .= ''; return $html; }