package FS::Report::Table::Daily;
use strict;
-use vars qw( @ISA );
-use FS::Report::Table;
+use base 'FS::Report::Table';
+use DateTime;
use FS::Conf;
-use Time::Local qw( timelocal );
-use Date::Format qw( time2str );
-
-@ISA = qw( FS::Report::Table );
=head1 NAME
'end_day' => 27,
#opt
'agentnum' => 54
+ 'cust_classnum' => [ 1,2,4 ],
'params' => [ [ 'paramsfor', 'item_one' ], [ 'item', 'two' ] ], # ...
'remove_empty' => 1, #collapse empty rows, default 0
'item_labels' => [ ], #useful with remove_empty
my $sday = $self->{'start_day'};
my $smonth = $self->{'start_month'};
- my $syear = $self->{'start_year'};
+ my $syear = $self->{'start_year'} + 1900; # temporary kludge
my $eday = $self->{'end_day'};
my $emonth = $self->{'end_month'};
- my $eyear = $self->{'end_year'};
+ my $eyear = $self->{'end_year'} + 1900;
my $agentnum = $self->{'agentnum'};
+ my $cust_classnum = $self->{'cust_classnum'} || [];
+ $cust_classnum = [ $cust_classnum ] if !ref($cust_classnum);
- my %data;
+ #these need to get generalized, sheesh
+ my %data = (
+ # rows (time intervals)
+ speriod => [], # start timestamps
+ eperiod => [], # end timestamps
+ label => [], # date labels
+ data => [], # arrayrefs of column values
+
+ # columns (observables + query parameters)
+ items => $self->{'items'},
+ item_labels => $self->{'item_labels'} || $self->{'items'},
+ colors => $self->{'colors'}, # no default?
+ links => $self->{'links'} || [],
+ );
- my $sdate = timelocal(0,0,0,$sday,$smonth-1,$syear);
- my $edate = timelocal(0,0,0,$eday,$emonth-1,$eyear);
+ my $sdate = DateTime->new(
+ day => $sday,
+ month => $smonth,
+ year => $syear,
+ time_zone => 'local'
+ );
+ my $edate = DateTime->new(
+ day => $eday,
+ month => $emonth,
+ year => $eyear,
+ time_zone => 'local'
+ )->add(days => 1); # include all of the end day
my $conf = FS::Conf->new;
my $date_format = $conf->config('date_format') || '%d/%m/%Y';
- #warn "daily range $sdate $edate\n";
-
- # XXX: use date_format config for the labels since we have day in the labels now?
- # XXX: leap seconds / DST
while ( $sdate < $edate ) {
- push @{$data{label}}, time2str($date_format, $sdate);
+ push @{$data{label}}, $sdate->strftime($date_format);
- my $speriod = $sdate;
- $sdate += 86400;
- my $eperiod = $sdate;
+ my $speriod = $sdate->epoch;
+ $sdate->add(days => 1);
+ my $eperiod = $sdate->epoch;;
push @{$data{speriod}}, $speriod;
push @{$data{eperiod}}, $eperiod;
for ( $i = 0; $i < scalar(@items); $i++ ) {
my $item = $items[$i];
my @param = $self->{'params'} ? @{ $self->{'params'}[$col] }: ();
+ push @param, 'cust_classnum' => $cust_classnum if @$cust_classnum;
my $value = $self->$item($speriod, $eperiod, $agentnum, @param);
push @{$data{data}->[$col++]}, $value;
}
}
- #these need to get generalized, sheesh
$data{'items'} = $self->{'items'};
$data{'item_labels'} = $self->{'item_labels'} || $self->{'items'};
$data{'colors'} = $self->{'colors'};
my @newdata = ();
my @newcolors = ();
my @newlinks = ();
+ my @indices = ();
foreach my $item ( @{$self->{'items'}} ) {
- if ( grep { $_ != 0 } @{$data{'data'}->[$col]} ) {
- push @newitems, $data{'items'}->[$col];
- push @newlabels, $data{'item_labels'}->[$col];
- push @newdata, $data{'data'}->[$col];
- push @newcolors, $data{'colors'}->[$col];
- push @newlinks, $data{'links'}->[$col];
- }
-
+ my $is_nonzero = scalar( grep { $_ != 0 } @{ $data{'data'}->[$col] });
+ next if ($self->{'remove_empty'} and $is_nonzero == 0);
+ # no daily reports can normalize yet
+ push @newitems, $data{'items'}->[$col];
+ push @newlabels, $data{'item_labels'}->[$col];
+ push @newdata, $data{'data'}->[$col];
+ push @newcolors, $data{'colors'}->[$col];
+ push @newlinks, $data{'links'}->[$col];
+ push @indices, $col;
+
+ } continue {
$col++;
}
$data{'data'} = \@newdata;
$data{'colors'} = \@newcolors;
$data{'links'} = \@newlinks;
+ $data{'indices'} = \@indices;
+ } else { # not doing remove_empty; report back that all columns are included
+ $data{'indices'} = [ 0 .. scalar( @{$self->{'items'}} ) - 1 ];
}
\%data;