${$_[0]} =~ s/(['\\])/\\$1/g;
${$_[0]} =~ s/\r/\\r/g;
${$_[0]} =~ s/\n/\\n/g;
+ # prevent premature termination of the script
+ ${$_[0]} =~ s[</script>][<\\/script>]ig;
${$_[0]} = "'". ${$_[0]}. "'";
};
=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
--- /dev/null
+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;
'' => { '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;
'' => { 'description' => '*** Select event action ***', },
FS::part_event->actions();
+(tied %all_actions)->SortByValue;
+
my %action_labels = map { $_ => $all_actions{$_}->{'description'} }
keys %all_actions;
my $conf = new FS::Conf;
my $money_char = $conf->config('money_char') || '$';
+my $date_noinit = 0;
</%once>
<%init>
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?
'value' => ( $lf->{'value'} || $value ), #hmm.
'curr_value' => $value,
);
-
- }
+ }
+ } #foreach $field
$html .= '</TABLE>';
return $html;
}