customer signup date event condition, #16591
authorMark Wells <mark@freeside.biz>
Tue, 21 Feb 2012 07:02:16 +0000 (23:02 -0800)
committerMark Wells <mark@freeside.biz>
Tue, 21 Feb 2012 07:02:16 +0000 (23:02 -0800)
FS/FS/Mason.pm
FS/FS/part_event/Condition.pm
FS/FS/part_event/Condition/signupdate.pm [new file with mode: 0644]
httemplate/edit/part_event.html
httemplate/elements/selectlayers.html

index 6cc32bd..63eb47c 100644 (file)
@@ -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>][<\\/script>]ig;
     ${$_[0]} = "'". ${$_[0]}. "'";
   };
 
index 914256f..b969cf6 100644 (file)
@@ -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 (file)
index 0000000..30613a2
--- /dev/null
@@ -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;
index e005cbb..702471b 100644 (file)
@@ -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;
 
index 89fe41b..dd279bd 100644 (file)
@@ -162,6 +162,7 @@ Example:
 
 my $conf = new FS::Conf;
 my $money_char = $conf->config('money_char') || '$';
+my $date_noinit = 0;
 
 </%once>
 <%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 .= '</TABLE>';
   return $html;
 }