add "stagger" event condition, #16827
authorMark Wells <mark@freeside.biz>
Sun, 18 Mar 2012 00:03:25 +0000 (17:03 -0700)
committerMark Wells <mark@freeside.biz>
Sun, 18 Mar 2012 00:03:25 +0000 (17:03 -0700)
FS/FS/part_event/Condition/stagger.pm [new file with mode: 0644]

diff --git a/FS/FS/part_event/Condition/stagger.pm b/FS/FS/part_event/Condition/stagger.pm
new file mode 100644 (file)
index 0000000..1850c83
--- /dev/null
@@ -0,0 +1,45 @@
+package FS::part_event::Condition::stagger;
+
+use strict;
+use FS::Record qw( qsearch );
+use FS::part_event;
+use FS::cust_event;
+
+use base qw( FS::part_event::Condition );
+
+sub description { "Stagger this event across the month" }; #could be clearer?
+
+sub option_fields {
+  # delay? it's supposed to be arbitrary anyway
+}
+
+sub condition {
+  my($self, $object, %opt) = @_;
+
+  my $obj_pkey = $object->primary_key;
+  my $tablenum = $object->$obj_pkey();
+
+  my ($today) = (localtime($opt{'time'}))[3];
+
+  $today - 1 == ($tablenum - 1) % 28;
+}
+
+sub condition_sql {
+  my( $class, $table, %opt ) = @_;
+
+  my %tablenum = %{ FS::part_event->eventtable_pkey_sql };
+
+  my $today;
+  if ( $opt{'driver_name'} eq 'Pg' ) {
+    $today = "EXTRACT( DAY FROM TO_TIMESTAMP(".$opt{'time'}.") )::INTEGER";
+  }
+  elsif ( $opt{'driver_name'} eq 'mysql' ) {
+    $today = "DAY( FROM_UNIXTIME(".$opt{'time'}.") )";
+  }
+  else {
+    return 'true';
+  }
+  "($today - 1) = ($tablenum{$table} - 1) % 28";
+}
+
+1;