X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=blobdiff_plain;f=FS%2FFS%2FReport%2FTable%2FDaily.pm;h=8d623e7666bd9bb66b4a14232c44aa407a98d15c;hp=5bbd6e4e758a7316d3ce04f37e4ed6ba2c846ae1;hb=9aee669886202be7035e6c6049fc71bc99dd3013;hpb=20950bb21ee5dd8839a05dfcd58efa0a98e48e5a diff --git a/FS/FS/Report/Table/Daily.pm b/FS/FS/Report/Table/Daily.pm index 5bbd6e4e7..8d623e766 100644 --- a/FS/FS/Report/Table/Daily.pm +++ b/FS/FS/Report/Table/Daily.pm @@ -1,11 +1,9 @@ package FS::Report::Table::Daily; use strict; -use vars qw( @ISA ); -use FS::Report::Table; -use Time::Local qw( timelocal ); - -@ISA = qw( FS::Report::Table ); +use base 'FS::Report::Table'; +use DateTime; +use FS::Conf; =head1 NAME @@ -25,6 +23,7 @@ FS::Report::Table::Daily - Tables of report data, indexed daily '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 @@ -47,31 +46,51 @@ sub data { 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; - - my $sdate = timelocal(0,0,0,$sday,$smonth-1,$syear); - my $edate = timelocal(0,0,0,$eday,$emonth-1,$eyear); + #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'} || [], + ); - warn "daily range $sdate $edate\n"; + 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'; - # XXX: use date_format config for the labels since we have day in the labels now? - # XXX: leap seconds / DST while ( $sdate < $edate ) { - my($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($sdate); - $mon++; - $year += 1900; - warn "label=$mday/$mon/$year\n"; - push @{$data{label}}, "$mday/$mon/$year"; + 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; @@ -82,12 +101,12 @@ sub data { 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'}; @@ -102,16 +121,20 @@ sub data { 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++; } @@ -120,7 +143,10 @@ sub data { $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;