fix report day selection on daylight savings boundaries, RT#21879
authorIvan Kohler <ivan@freeside.biz>
Mon, 18 Mar 2013 02:11:33 +0000 (19:11 -0700)
committerIvan Kohler <ivan@freeside.biz>
Mon, 18 Mar 2013 02:11:33 +0000 (19:11 -0700)
FS/FS/Cron/bill.pm
FS/FS/Misc/DateTime.pm
FS/FS/UI/Web.pm
FS/FS/cust_main/Billing.pm
httemplate/search/pay_batch.cgi

index 6e110e8..98ce8fa 100644 (file)
@@ -201,7 +201,8 @@ sub bill_where {
   # generate where_pkg/where_event search clause
   ###
 
-  my $billtime = day_end($time);
+  my $conf = new FS::Conf;
+  my $billtime = $conf->exists('next-bill-ignore-time') ? day_end($time) : $time;
 
   # select * from cust_main where
   my $where_pkg = <<"END";
index 9c12e64..99ff409 100644 (file)
@@ -59,21 +59,14 @@ sub parse_datetime {
 
 =item day_end TIME
 
-If the next-bill-ignore-time configuration setting is turned off, just 
-returns the passed-in value.
-
-If the next-bill-ignore-time configuration setting is turned on, parses TIME
-as an integer UNIX timestamp and returns a new timestamp with the same date but
-23:59:59 for the time.
+Parses TIME as an integer UNIX timestamp and returns a new timestamp with the
+same date but 23:59:59 for the time.
 
 =cut
 
 sub day_end {
     my $time = shift;
 
-    my $conf = new FS::Conf;
-    return $time unless $conf->exists('next-bill-ignore-time');
-
     my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =
         localtime($time);
     mktime(59,59,23,$mday,$mon,$year,$wday,$yday,$isdst);
index d31bbf0..2e6d482 100644 (file)
@@ -6,7 +6,7 @@ use Exporter;
 use Carp qw( confess );
 use HTML::Entities;
 use FS::Conf;
-use FS::Misc::DateTime qw( parse_datetime );
+use FS::Misc::DateTime qw( parse_datetime day_end );
 use FS::Record qw(dbdef);
 use FS::cust_main;  # are sql_balance and sql_date_balance in the right module?
 
@@ -40,12 +40,7 @@ sub parse_beginning_ending {
   if ( $cgi->param($prefix.'end') =~ /^(\d+)$/ ) {
     $ending = $1 - 1;
   } elsif ( $cgi->param($prefix.'ending') =~ /^([ 0-9\-\/\:]{1,64})$/ ) {
-    #probably need an option to turn off the + 86399
-
-    #no, this should be add one day minus one second...
-    #  86399 is wrong twice a year when daylight savings time changes
-    #        and leap seconds too but only a second rather than an hour..
-    $ending = parse_datetime($1) + 86399;
+    $ending = day_end( parse_datetime($1) );
   }
 
   ( $beginning, $ending );
index 69fbda4..a45300c 100644 (file)
@@ -116,8 +116,13 @@ sub bill_and_collect {
   $options{'actual_time'} ||= time;
   my $job = $options{'job'};
 
+  my $actual_time = ( $conf->exists('next-bill-ignore-time')
+                        ? day_end( $options{actual_time} )
+                        : $options{actual_time}
+                    );
+
   $job->update_statustext('0,cleaning expired packages') if $job;
-  $error = $self->cancel_expired_pkgs( day_end( $options{actual_time} ) );
+  $error = $self->cancel_expired_pkgs( $actual_time );
   if ( $error ) {
     $error = "Error expiring custnum ". $self->custnum. ": $error";
     if    ( $options{fatal} && $options{fatal} eq 'return' ) { return $error; }
@@ -125,7 +130,7 @@ sub bill_and_collect {
     else                                                     { warn   $error; }
   }
 
-  $error = $self->suspend_adjourned_pkgs( day_end( $options{actual_time} ) );
+  $error = $self->suspend_adjourned_pkgs( $actual_time );
   if ( $error ) {
     $error = "Error adjourning custnum ". $self->custnum. ": $error";
     if    ( $options{fatal} && $options{fatal} eq 'return' ) { return $error; }
@@ -133,7 +138,7 @@ sub bill_and_collect {
     else                                                     { warn   $error; }
   }
 
-  $error = $self->unsuspend_resumed_pkgs( day_end( $options{actual_time} ) );
+  $error = $self->unsuspend_resumed_pkgs( $actual_time );
   if ( $error ) {
     $error = "Error resuming custnum ".$self->custnum. ": $error";
     if    ( $options{fatal} && $options{fatal} eq 'return' ) { return $error; }
@@ -915,6 +920,11 @@ sub _make_lines {
 
   $cust_pkg->pkgpart($part_pkg->pkgpart);
 
+  my $cmp_time = ( $conf->exists('next-bill-ignore-time')
+                     ? day_end( $time )
+                     : $time
+                 );
+
   ###
   # bill setup
   ###
@@ -928,7 +938,7 @@ sub _make_lines {
        and ( $options{'resetup'}
              || ( ! $cust_pkg->setup
                   && ( ! $cust_pkg->start_date
-                       || $cust_pkg->start_date <= day_end($time)
+                       || $cust_pkg->start_date <= $cmp_time
                      )
                   && ( ! $conf->exists('disable_setup_suspended_pkgs')
                        || ( $conf->exists('disable_setup_suspended_pkgs') &&
@@ -976,7 +986,7 @@ sub _make_lines {
                                      && ! $cust_pkg->option('no_suspend_bill',1)
                                   )
        and
-            ( $part_pkg->freq ne '0' && ( $cust_pkg->bill || 0 ) <= day_end($time) )
+            ( $part_pkg->freq ne '0' && ( $cust_pkg->bill || 0 ) <= $cmp_time )
          || ( $part_pkg->plan eq 'voip_cdr'
                && $part_pkg->option('bill_every_call')
             )
@@ -1000,7 +1010,7 @@ sub _make_lines {
 
     #over two params!  lets at least switch to a hashref for the rest...
     my $increment_next_bill = ( $part_pkg->freq ne '0'
-                                && ( $cust_pkg->getfield('bill') || 0 ) <= day_end($time)
+                                && ( $cust_pkg->getfield('bill') || 0 ) <= $cmp_time
                                 && !$options{cancel}
                               );
     my %param = ( %setup_param,
index 34e9fd7..00c6ba1 100755 (executable)
@@ -148,16 +148,10 @@ my $count_query = 'SELECT COUNT(*) FROM pay_batch';
 my($begin, $end) = ( '', '' );
 
 my @where;
-if ( $cgi->param('beginning')
-     && $cgi->param('beginning') =~ /^([ 0-9\-\/]{0,10})$/ ) {
-  $begin = parse_datetime($1);
-  push @where, "download >= $begin";
-}
-if ( $cgi->param('ending')
-      && $cgi->param('ending') =~ /^([ 0-9\-\/]{0,10})$/ ) {
-  $end = parse_datetime($1) + 86399;
-  push @where, "download < $end";
-}
+
+my($beginning,$ending) = FS::UI::Web::parse_beginning_ending($cgi);
+push @where, "download >= $beginning",
+             "download <= $ending";
 
 my @status;
 if ( $cgi->param('open') ) {