<%doc> Example: include('elements/monthly.html', #required 'title' => 'Page title', 'items' => \@items, 'labels' => \@labels, # or \%labels (keys are items) #required? 'colors' => \@colors, # or \%colors, #recommended 'graph_labels' => \@graph_labels, # or \%graph_labels, #optional 'params' => \@params, # opt, 'links' => \@links, # or \%link, #opt 'link_fromparam' => 'param_from', #defaults to 'begin' 'link_toparam' => 'param_to', #defaults to 'end' 'daily' => 1, # omit for monthly granularity #optional, pulled from CGI params if not specified 'start_month' => $smonth, 'start_year' => $syear, 'end_month' => $emonth, 'end_year' => $eyear, #optional, pulled from CGI params if not specified, #only if 'daily' option is given 'start_day' => $sday, 'end_day' => $eday, #optional 'agentnum' => $agentnum, 'nototal' => 1, 'graph_type' => 'LinesPoints', 'remove_empty' => 1, 'bottom_total' => 1, 'sprintf' => '%u', #sprintf format, overrides default %.2f 'disable_money' => 1, ); <% include('report.html', 'items' => $data->{'items'}, 'data' => $data->{'data'}, 'row_labels' => $data->{'item_labels'}, 'graph_labels' => $opt{'graph_labels'} || $data->{'item_labels'}, 'col_labels' => $col_labels, 'axis_labels' => $data->{label}, 'colors' => $data->{colors}, 'links' => \@links, 'bottom_link' => \@bottom_link, map { $_, $opt{$_} } (qw(title nototal graph_type bottom_total sprintf disable_money)), ) %> <%init> my(%opt) = @_; $opt{'debug'} ||= $cgi->param('debug'); my $conf = new FS::Conf; my $money_char = $opt{'disable_money'} ? '' : $conf->config('money_char'); my $fromparam = $opt{'link_fromparam'} || 'begin'; my $toparam = $opt{'link_toparam'} || 'end'; my @items = @{ $opt{'items'} }; foreach my $other (qw( labels graph_labels colors links )) { if ( ref($opt{$other}) eq 'HASH' ) { $opt{$other} = [ map $opt{$other}{$_}, @items ]; } } my @mon = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec); #find first month $opt{'start_month'} ||= $cgi->param('start_month'); # || $curmon+1; $opt{'start_year'} ||= $cgi->param('start_year'); # || 1899+$curyear; #find last month $opt{'end_month'} ||= $cgi->param('end_month'); # || $curmon+1; $opt{'end_year'} ||= $cgi->param('end_year'); # || 1900+$curyear; #find end of projection $opt{'project_month'} ||= $cgi->param('project_month') || 0; $opt{'project_year'} ||= $cgi->param('project_year') || 0; # setting these to zero prevents projection on reports that don't support it if ( $opt{'daily'} ) { # daily granularity $opt{'start_day'} ||= $cgi->param('start_day'); $opt{'end_day'} ||= $cgi->param('end_day'); } my %reportopts = ( 'items' => \@items, 'params' => $opt{'params'}, 'item_labels' => ( $cgi->param('_type') =~ /^(png)$/ ? $opt{'graph_labels'} : $opt{'labels'} ), 'colors' => $opt{'colors'}, 'links' => $opt{'links'}, 'start_day' => $opt{'start_day'}, 'start_month' => $opt{'start_month'}, 'start_year' => $opt{'start_year'}, 'end_day' => $opt{'end_day'}, 'end_month' => $opt{'end_month'}, 'end_year' => $opt{'end_year'}, 'project_day' => $opt{'project_day'}, 'project_month' => $opt{'project_month'}, 'project_year' => $opt{'project_year'}, 'agentnum' => $opt{'agentnum'}, 'remove_empty' => $opt{'remove_empty'}, 'doublemonths' => $opt{'doublemonths'}, ); warn Dumper({ 'REPORTOPTS' => \%reportopts }) if $opt{'debug'}; my $report; $report = new FS::Report::Table::Daily(%reportopts) if $opt{'daily'}; $report = new FS::Report::Table::Monthly(%reportopts) unless $opt{'daily'}; my $data = $report->data; warn Dumper({'DATA' => $data}) if $opt{'debug'}; if ( $data->{'error'} ) { die $data->{'error'}; # could be smarter } my $col_labels = [ map { my $m = $_; $m =~ s/^(\d+)\//$mon[$1-1] / ; $m } @{$data->{label}} ]; $col_labels = $data->{label} if $opt{'daily'}; if ( $opt{'remove_empty'} ) { # need to filter out series labels for collapsed rows $opt{'graph_labels'} = [ map { $opt{'graph_labels'}[$_] } @{ $data->{indices} } ]; } my @links; foreach my $link (@{ $data->{'links'} }) { my @speriod = @{$data->{'speriod'}}; my @eperiod = @{$data->{'eperiod'}}; my ($begin, $end) = ($fromparam, $toparam); my @new = ( $link ); if(ref($link)) { $begin = $link->{'fromparam'}; $end = $link->{'toparam'}; @new = ( $link->{'link'} ); } while(@speriod) { push @new, "$begin=". shift(@speriod).";$end=".shift(@eperiod); } if(! $opt{'nototal'}) { push @new, "$begin=". $data->{'speriod'}[0] . ";$end=". $data->{'eperiod'}[-1]; } push @links, \@new; } my @bottom_link; if($opt{'bottom_link'}) { my @speriod = (@{$data->{'speriod'}}, $data->{'speriod'}[0]); my @eperiod = (@{$data->{'eperiod'}}, $data->{'eperiod'}[-1]); push @bottom_link, $opt{'bottom_link'}; while(@speriod) { push @bottom_link, "$fromparam=". shift(@speriod). ";$toparam=". shift(@eperiod); } }