X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=httemplate%2Fgraph%2Felements%2Fmonthly.html;h=cfe5a3c6d9fba8e354cfc206098fa322932260b6;hb=f654e068b6e7be55bdbd749293c1bda7737cf870;hp=c45113fa34e81193b0c67f8426f3296ad0230795;hpb=e65c6a26ca778166aec2b2d1dd3012ab84fa611a;p=freeside.git diff --git a/httemplate/graph/elements/monthly.html b/httemplate/graph/elements/monthly.html index c45113fa3..cfe5a3c6d 100644 --- a/httemplate/graph/elements/monthly.html +++ b/httemplate/graph/elements/monthly.html @@ -1,157 +1,196 @@ -<% - - # options example... - # - # 'title' => 'Page title', - # 'items' => \@items, - # 'params' => \@params, # opt, - # 'labels' => \@labels, # or \%labels (keys are items) - # 'graph_labels' => \%graph_labels, - # 'colors' => \%colors, - # 'links => \%link, #opt - # 'start_month' => $smonth, - # 'start_year' => $syear, - # 'end_month' => $emonth, - # 'end_year' => $eyear, - # 'agentnum' => $agentnum, #opt - # 'nototal' => 1, #opt, - # 'graph_type' => 'LinesPoints', #opt - - my(%opt) = @_; - my @items = @{ $opt{'items'} }; - - #foreach my $other (qw( labels graph_labels colors links )) { - foreach my $other (qw( labels graph_labels colors )) { - if ( ref($opt{$other}) eq 'HASH' ) { - $opt{$other} = [ map $opt{$other}{$_}, @items ]; - } - } - - my $report = new FS::Report::Table::Monthly ( - #'items' => $opt{'items'}, - 'items' => \@items, - 'params' => $opt{'params'}, - 'start_month' => $opt{'start_month'}, - 'start_year' => $opt{'start_year'}, - 'end_month' => $opt{'end_month'}, - 'end_year' => $opt{'end_year'}, - 'agentnum' => $opt{'agentnum'}, +<%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 + 'no_graph' => \@no_graph, # items to leave off the graph (subtotals) + + #optional, pulled from CGI params if not specified + 'start_month' => $smonth, + 'start_year' => $syear, + 'end_month' => $emonth, + 'end_year' => $eyear, + '12mo' => 0, + + #optional, pulled from CGI params if not specified, + #only if 'daily' option is given + 'start_day' => $sday, + 'end_day' => $eday, + + #optional + 'agentnum' => $agentnum, + 'refnum' => $refnum, + 'cust_classnum' => \@classnums, + 'nototal' => 1, + 'graph_type' => 'LinesPoints', + 'remove_empty' => 1, + 'bottom_total' => 1, + 'sprintf' => '%u', #sprintf format, overrides default %.2f + 'disable_money' => 1, ); - my $data = $report->data; - - if ( $cgi->param('_type') =~ /^(png)$/ ) { - - #my $chart = Chart::LinesPoints->new(1024,480); - #my $chart = Chart::LinesPoints->new(768,480); - - my $graph_type = 'LinesPoints'; - if ( $opt{'graph_type'} =~ /^(LinesPoints|Mountain)$/ ) { - $graph_type = $1; - } - my $class = "Chart::$graph_type"; - - my $chart = $class->new(976,384); - - my $d = 0; - $chart->set( - #'min_val' => 0, - 'legend' => 'bottom', - 'colors' => { ( - map { my $color = $_; - 'dataset'.$d++ => - [ map hex($_), unpack 'a2a2a2', $color ] - } - @{ $opt{'colors'} } - ), - #'grey_background' => [ 211, 211, 211 ], - 'grey_background' => 'white', - 'background' => [ 0xe8, 0xe8, 0xe8 ], #grey - }, - #'grey_background' => 'false', - 'legend_labels' => $opt{'graph_labels'}, - 'brush_size' => 4, - #'pt_size' => 12, - ); - - #my @data = map { $data->{$_} } ( 'label', @items ); - my @data = @{ $data->{data} }; - unshift @data, $data->{'label'}; - - http_header('Content-Type' => 'image/png' ); - - $chart->_set_colors(); - - %><%= $chart->scalar_png(\@data) %><% - - } else { - - my @mon = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec); - -%><%= include('/elements/header.html', $opt{'title'} ) %> - -<% $cgi->param('_type', 'png'); %> - -
- -<%= table('e8e8e8') %> - - - - - - <% foreach my $column ( @{$data->{label}} ) { - #$column =~ s/^(\d+)\//$mon[$1-1]
/e; - $column =~ s/^(\d+)\//$mon[$1-1]
/; - %> - <%= $column %> - <% } %> - - <% unless ( $opt{'nototal'} ) { %> - Total - <% } %> - - -<% foreach my $row (@items) { - - my $color = shift( @{ $opt{'colors'} } ); -%> - - - - <%= shift( @{ $opt{'labels'} } ) %> - - <% my $link = exists($opt{'links'}{$row}) - ? qq( - <%= $link ? $link. 'begin='. shift(@speriod). ';end='. shift(@eperiod). '">' : '' %>$<%= sprintf("%.2f", $column) %><%= $link ? '' : '' %> - - <% $total += $column; %> - - <% } %> - - <% unless ( $opt{'nototal'} ) { %> - - - <%= $link ? $link. 'begin='. @{$data->{speriod}}[0]. ';end='. @{$data->{eperiod}}[-1]. '">' : '' %>$<%= sprintf("%.2f", $total) %><%= $link ? '' : '' %> - - - <% } %> - - - -<% } %> - - - -<%= include('/elements/footer.html') %> + +<% include('report.html', + 'items' => $data->{'items'}, + 'data' => $data->{'data'}, + 'row_labels' => $data->{'item_labels'}, + 'graph_labels' => \@graph_labels, + 'col_labels' => $col_labels, + 'axis_labels' => $data->{label}, + 'colors' => \@colors, + 'links' => \@links, + 'no_graph' => \@no_graph, + 'bottom_link' => \@bottom_link, + 'transpose' => $opt{'daily'}, + 'sprintf_fields' => $sprintf_fields, + map { $_, $opt{$_} } (qw(title + nototal + graph_type + bottom_total + sprintf + disable_money + chart_options)), + ) %> +<%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'} }; +my $sprintf_fields = $opt{'sprintf_fields'}; + +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; + +$opt{'12mo'} ||= $cgi->param('12mo') ? 1 : 0; + +$opt{'projection'} ||= $cgi->param('projection') ? 1 : 0; + +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'}, + '12mo' => $opt{'12mo'}, + 'projection' => $opt{'projection'}, + 'agentnum' => $opt{'agentnum'}, + 'refnum' => $opt{'refnum'}, + 'cust_classnum'=> $opt{'cust_classnum'}, + 'remove_empty' => $opt{'remove_empty'}, + 'doublemonths' => $opt{'doublemonths'}, + 'normalize' => $opt{'normalize'}, +); + +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'}; + +my @colors; +my @graph_labels; +my @no_graph; +#if ( $opt{'remove_empty'} ) { # no, always do this + # then filter out per-item things for collapsed rows +foreach my $i (@{ $data->{'indices'} }) { + push @colors, $opt{'colors'}[$i]; + push @graph_labels, $opt{'graph_labels'}[$i]; + push @no_graph, $opt{'no_graph'}[$i]; +} + +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); + } +} -<% } %> +