first pass at sales reports per agent and package class
authorivan <ivan>
Sun, 7 May 2006 20:27:21 +0000 (20:27 +0000)
committerivan <ivan>
Sun, 7 May 2006 20:27:21 +0000 (20:27 +0000)
15 files changed:
README.1.7.0
htetc/handler.pl
httemplate/docs/upgrade10.html
httemplate/elements/select-month_year.html
httemplate/elements/select-pkg_class.html
httemplate/elements/select-table.html
httemplate/elements/tr-select-from_to.html [new file with mode: 0644]
httemplate/elements/tr-select-pkg_class.html
httemplate/graph/cust_bill_pkg-graph.cgi [new file with mode: 0755]
httemplate/graph/cust_bill_pkg.cgi [new file with mode: 0644]
httemplate/graph/elements/monthly.html [new file with mode: 0644]
httemplate/graph/money_time-graph.cgi [deleted file]
httemplate/graph/money_time.cgi
httemplate/graph/report_cust_bill_pkg.html [new file with mode: 0644]
httemplate/graph/report_money_time.html

index 62d6232..30f7ec7 100644 (file)
@@ -1,5 +1,6 @@
 
 install DBIx::DBSchema 0.31 (or later)
+install Color::Scheme
 
 make install-perl-modules
 run "freeside-upgrade username" to uprade your database schema
index dcbe727..e8cd333 100644 (file)
@@ -113,6 +113,8 @@ sub handler
       use Business::CreditCard;
       use String::Approx qw(amatch);
       use Chart::LinesPoints;
+      use Chart::Mountain;
+      use Color::Scheme;
       use HTML::Widgets::SelectLayers 0.05;
       use Locale::Country;
       use FS;
index 8d90ab7..7cd1d8e 100644 (file)
@@ -31,7 +31,7 @@ Perl or Linux.
   <li>install NetAddr::IP, Chart::Base, Locale::SubCountry, Text::CSV_XS, 
 Spreadsheet::WriteExcel, IO-stringy (IO::Scalar), Frontier::RPC
 (Frontier::RPC2), MIME::Entity (MIME-tools), IPC::Run3, Net::Whois::Raw,
-JSON and Term::ReadKey
+JSON, Term::ReadKey and Color::Scheme
 <!-- and Crypt::YAPassGen-->
 
   <li>Apply the following changes to your database:
index a0ea74d..2866960 100644 (file)
@@ -5,13 +5,22 @@
   my $prefix = $opt{'prefix'} || '';
   my $disabled = $opt{'disabled'} || '';
   my $empty = $opt{'empty_option'} || '';
+  my $start_year = $opt{'start_year'};
+  my $end_year = $opt{'end_year'} || '2037';
+
+  my @mon;
+  if ( $opt{'show_month_abbr'} ) {
+    @mon = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec);
+  } else {
+    @mon = ( 1 .. 12 );
+  }
+
   my $date = $opt{'selected_date'} || '';
   $date = '' if $date eq '-';
   #$date ||= '01-2000' unless $empty;
-  my $start_year = $opt{'start_year'};
-  my $end_year = $opt{'end_year'} || '2037';
 
-  my( $mon, $year ) = (0, 0);
+  my $mon  = $opt{'selected_mon'}  || 0;
+  my $year = $opt{'selected_year'} || 0;
   if ( $date ) {
     if ( $date  =~ /^(\d{4})-(\d{1,2})-\d{1,2}$/ ) { #PostgreSQL date format
       ( $mon, $year ) = ( $2, $1 );
@@ -34,8 +43,8 @@
 
 <%= $empty ? '<OPTION VALUE="">' : '' %>
 
-<% for ( 1 .. 12 ) { %>
-   <OPTION<%= $_ == $mon ? ' SELECTED' : '' %> VALUE="<%= $_ %>"><%= $_ %>
+<% foreach ( 1 .. 12 ) { %>
+   <OPTION<%= $_ == $mon ? ' SELECTED' : '' %> VALUE="<%= $_ %>"><%= $mon[$_-1] %>
 <% } %>
 
 </SELECT>/<SELECT NAME="<%= $prefix %>_year" SIZE="1" <%= $disabled%>>
index 5486e08..032c7ab 100644 (file)
@@ -1,16 +1,17 @@
 <%
   my( $classnum, %opt ) = @_;
 
-  my %select_opt = ();
-  $select_opt{'records'} = $opt{'pkg_class'}
+  $opt{'records'} = delete $opt{'pkg_class'}
     if $opt{'pkg_class'};
 
+  #warn "***** select-pkg-class: \n". Dumper(%opt);
+
 %><%= include( '/elements/select-table.html',
                  'table'       => 'pkg_class',
                  'name_col'    => 'classname',
                  'value'       => $classnum,
                  'empty_label' => '(none)',
                  #'hashref'     => { 'disabled' => '' },
-                 #%select_opt,
+                 %opt,
              )
 %>
index 10cc8b9..96f0177 100644 (file)
   # 'empty_label' => '', #better specify it though, the default might change
   # 'hashref'     => {},
   # 'records'     => \@records, #instead of hashref
+  # 'pre_options' => [ 'value' => 'option' ], #before normal options
 
   my( %opt ) = @_;
 
+  #warn "***** select-table: \n". Dumper(%opt);
+
   my $key = dbdef->table($opt{'table'})->primary_key; #? $opt{'primary_key'} ||
 
   my $name_col = $opt{'name_col'};
     @records = qsearch( $opt{'table'}, ( $opt{'hashref'} || {} ) );
   }
 
+  my @pre_options = $opt{'pre_options'} ? @{ $opt{'pre_options'} } : ();
+
 %>
 
 <SELECT NAME="<%= $key %>">
 
-  <OPTION VALUE=""><%= $opt{'empty_label'} || 'all' %></OPTION>
+  <% while ( @pre_options ) { %>
+    <OPTION VALUE="<%= shift(@pre_options) %>"><%= shift(@pre_options) %>
+  <% } %>
+
+  <OPTION VALUE=""><%= $opt{'empty_label'} || 'all' %>
 
   <% foreach my $record ( sort { $a->$name_col() cmp $b->$name_col() }
                                @records
diff --git a/httemplate/elements/tr-select-from_to.html b/httemplate/elements/tr-select-from_to.html
new file mode 100644 (file)
index 0000000..d7e5a83
--- /dev/null
@@ -0,0 +1,51 @@
+<%
+
+  #my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
+  my ($curmon,$curyear) = (localtime(time))[4,5];
+  
+  #find first month
+  my $syear = 1899+$curyear;
+  my $smonth = $curmon+1;
+  
+  #want 12 month by default, not 13
+  $smonth++;
+  if ( $smonth > 12 ) { $smonth-=12; $syear++ }
+  
+  #find last month
+  my $eyear = 1900+$curyear;
+  my $emonth = $curmon+1;
+
+  my %hash = (
+    'show_month_abbr' => 1,
+    'start_year'      => '1999',
+    'end_year'        => '2012', #haha, well...
+     @_,
+  );
+
+%>
+
+<TR>
+  <TD ALIGN="right">From: </TD>
+  <TD>
+    <%= include('/elements/select-month_year.html',
+                  'prefix'        => 'start',
+                  'selected_mon'  => $smonth,
+                  'selected_year' => $syear,
+                  %hash,
+               )
+    %>
+  </TD>
+</TR>
+
+<TR>
+  <TD ALIGN="right">To: </TD>
+  <TD>
+    <%= include('/elements/select-month_year.html',
+                  'prefix'        => 'end',
+                  'selected_mon'  => $emonth,
+                  'selected_year' => $eyear,
+                  %hash,
+               )
+    %>
+  </TD>
+</TR>
index de10885..fbab0db 100644 (file)
@@ -1,16 +1,12 @@
 <%
   my( $classnum, %opt ) = @_;
 
-  my @pkg_class;
-  if ( $opt{'pkg_class'} ) {
-    @pkg_class = @{ $opt{'pkg_class'} };
-  } else {
-    @pkg_class = qsearch( 'pkg_class', {} ); # { disabled=>'' } );
-  }
+  $opt{'pkg_class'} ||= [ qsearch( 'pkg_class', {} ) ]; # { disabled=>'' } )
 
+  #warn "***** tr-select-pkg-class: \n". Dumper(%opt);
 %>
 
-<% if ( scalar(@pkg_class) == 0 ) { %>
+<% if ( scalar(@{ $opt{'pkg_class'} }) == 0 ) { %>
 
   <INPUT TYPE="hidden" NAME="classnum" VALUE="">
 
   <TR>
     <TD ALIGN="right"><%= $opt{'label'} || 'Package class' %></TD>
     <TD>
-      <%= include( '/elements/select-pkg_class.html', $classnum,
-                     'pkg_class' => \@pkg_class,
-                 )
-      %>
+      <%= include( '/elements/select-pkg_class.html', $classnum, %opt ) %>
     </TD>
   </TR>
 
diff --git a/httemplate/graph/cust_bill_pkg-graph.cgi b/httemplate/graph/cust_bill_pkg-graph.cgi
new file mode 100755 (executable)
index 0000000..637a3bf
--- /dev/null
@@ -0,0 +1,84 @@
+<%
+
+#my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
+my ($curmon,$curyear) = (localtime(time))[4,5];
+
+#find first month
+my $syear = $cgi->param('syear') || 1899+$curyear;
+my $smonth = $cgi->param('smonth') || $curmon+1;
+
+#find last month
+my $eyear = $cgi->param('eyear') || 1900+$curyear;
+my $emonth = $cgi->param('emonth') || $curmon+1;
+#if ( $emonth++>12 ) { $emonth-=12; $eyear++; }
+
+# XXX or virtual
+my $agentnum = '';
+if ( $cgi->param('agentnum') =~ /^(\d*)$/ ) {
+  $agentnum = $1;
+}
+
+#my @labels;
+#my %data;
+
+my @items = qw( invoiced netsales credits payments receipts );
+if ( $cgi->param('12mo') == 1 ) {
+  @items = map $_.'_12mo', @items;
+}
+
+my %label = (
+ 'invoiced' => 'Gross Sales (invoiced)', 
+ 'netsales' => 'Net Sales (invoiced - applied credits)',
+ 'credits'  => 'Credits',
+ 'payments' => 'Gross Receipts (payments)',
+ 'receipts' => 'Net Receipts/Cashflow (payments - refunds)',
+);
+$label{$_.'_12mo'} = $label{$_}. " (previous 12 months)"
+  foreach keys %label;
+
+my %color = (
+  'invoiced' => [ 153, 153, 255 ], #light blue
+  'netsales' => [   0,   0, 204 ], #blue
+  'credits'  => [ 204,   0,   0 ], #red
+  'payments' => [ 153, 204, 153 ], #light green
+  'receipts' => [   0, 204,   0 ], #green
+);
+$color{$_.'_12mo'} = $color{$_}
+  foreach keys %color;
+
+my $report = new FS::Report::Table::Monthly (
+  'items' => \@items,
+  'start_month' => $smonth,
+  'start_year'  => $syear,
+  'end_month'   => $emonth,
+  'end_year'    => $eyear,
+  'agentnum'    => $agentnum,
+);
+my %data = %{$report->data};
+
+#my $chart = Chart::LinesPoints->new(1024,480);
+#my $chart = Chart::LinesPoints->new(768,480);
+my $chart = Chart::LinesPoints->new(976,384);
+
+my $d = 0;
+$chart->set(
+  #'min_val' => 0,
+  'legend' => 'bottom',
+  'colors' => { ( map { 'dataset'.$d++ => $color{$_} } @items ),
+                #'grey_background' => [ 211, 211, 211 ],
+                'grey_background' => 'white',
+                'background' => [ 0xe8, 0xe8, 0xe8 ], #grey
+              },
+  #'grey_background' => 'false',
+  'legend_labels' => [ map { $label{$_} } @items ],
+  'brush_size' => 4,
+  #'pt_size' => 12,
+);
+
+my @data = map { $data{$_} } ( 'label', @items );
+
+http_header('Content-Type' => 'image/png' );
+
+$chart->_set_colors();
+
+%><%= $chart->scalar_png(\@data) %>
diff --git a/httemplate/graph/cust_bill_pkg.cgi b/httemplate/graph/cust_bill_pkg.cgi
new file mode 100644 (file)
index 0000000..0dbd222
--- /dev/null
@@ -0,0 +1,104 @@
+<%
+
+
+#find first month
+my $syear = $cgi->param('start_year'); # || 1899+$curyear;
+my $smonth = $cgi->param('start_month'); # || $curmon+1;
+
+#find last month
+my $eyear = $cgi->param('end_year'); # || 1900+$curyear;
+my $emonth = $cgi->param('end_month'); # || $curmon+1;
+
+#XXX or virtual
+my( $agentnum, $sel_agent ) = ('', '');
+if ( $cgi->param('agentnum') =~ /^(\d+)$/ ) {
+  $agentnum = $1;
+  $sel_agent = qsearchs('agent', { 'agentnum' => $agentnum } );
+  die "agentnum $agentnum not found!" unless $sel_agent;
+}
+my $title = $sel_agent ? $sel_agent->agent.' ' : '';
+
+my $classnum = 0;
+my @pkg_class = ();
+if ( $cgi->param('classnum') =~ /^(\d*)$/ ) {
+  $classnum = $1;
+  if ( $classnum ) {
+    @pkg_class = ( qsearchs('pkg_class', { 'classnum' => $classnum } ) );
+    die "classnum $classnum not found!" unless $pkg_class[0];
+    $title .= $pkg_class[0]->classname.' ';
+  } elsif ( $classnum eq '' ) {
+    $title .= 'Empty class ';
+    @pkg_class = ( '(empty class)' );
+  } elsif ( $classnum eq '0' ) {
+    @pkg_class = qsearch('pkg_class', {} ); # { 'disabled' => '' } );
+    push @pkg_class, '(empty class)';
+  }
+}
+
+my $hue = 0;
+my $hue_increment = 145;
+
+my @items = ();
+my @params = ();
+my @labels = ();
+my @colors = ();
+
+foreach my $agent ( $sel_agent || qsearch('agent', { 'disabled' => '' } ) ) {
+
+  my $col_scheme = Color::Scheme->new
+                     ->from_hue($hue)
+                     ->scheme('analogic')
+                   ;
+  my @recur_colors = ();
+  my @onetime_colors = ();
+
+  ### fixup the color handling for package classes...
+  my $n = 0;
+
+  foreach my $pkg_class ( @pkg_class ) {
+
+    push @items, 'cust_bill_pkg';
+
+
+    push @labels,
+      ( $sel_agent ? '' : $agent->agent.' ' ).
+      ( $classnum eq '0'
+          ? ( ref($pkg_class) ? $pkg_class->classname : $pkg_class ) 
+          : ''
+      );
+
+    # push some params
+    push @params,
+      [ 'classnum' => ( ref($pkg_class) ? $pkg_class->classnum : '' ) ];
+
+    @recur_colors = ($col_scheme->colors)[0,4,8,1,5,9]
+      unless @recur_colors;
+    @onetime_colors = ($col_scheme->colors)[2,6,10,3,7,11]
+      unless @onetime_colors;
+    push @colors, shift @recur_colors;
+
+  }
+
+  $hue += $hue_increment;
+
+}
+
+use Data::Dumper;
+warn Dumper(\@items);
+
+%><%= include('elements/monthly.html',
+                'title'        => $title. 'Sales Report',
+                'graph_type'   => 'Mountain',
+                'items'        => \@items,
+                'params'       => \@params,
+                'labels'       => \@labels,
+                'graph_labels' => \@labels,
+                'colors'       => \@colors,
+                #'links'        => \%link,
+                'start_month'  => $smonth,
+                'start_year'   => $syear,
+                'end_month'    => $emonth,
+                'end_year'     => $eyear,
+                'agentnum'     => $agentnum,
+             )
+%>
diff --git a/httemplate/graph/elements/monthly.html b/httemplate/graph/elements/monthly.html
new file mode 100644 (file)
index 0000000..c45113f
--- /dev/null
@@ -0,0 +1,157 @@
+<%
+
+  # 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'},
+  );
+  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'); %>
+<IMG SRC="<%= $cgi->self_url %>" WIDTH="976" HEIGHT="384">
+<BR>
+
+<%= table('e8e8e8') %>
+
+<TR>
+
+  <TD></TD>
+
+  <% foreach my $column ( @{$data->{label}} ) {
+       #$column =~ s/^(\d+)\//$mon[$1-1]<BR>/e;
+       $column =~ s/^(\d+)\//$mon[$1-1]<BR>/;
+  %>
+    <TH><%= $column %></TH>
+  <% } %>
+
+  <% unless ( $opt{'nototal'} ) { %>
+    <TH>Total</TH>
+  <% } %>
+
+</TR>
+
+<% foreach my $row (@items) {
+
+     my $color = shift( @{ $opt{'colors'} } );
+%>
+
+  <TR>
+
+    <TH><FONT COLOR="#<%= $color %>"><%= shift( @{ $opt{'labels'} } ) %></FONT></TH>
+
+    <% my $link = exists($opt{'links'}{$row})
+         ? qq(<A HREF="$opt{'links'}{$row})
+         : '';
+       my @speriod = @{$data->{speriod}};
+       my @eperiod = @{$data->{eperiod}};
+       my $total = 0;
+    %>
+    <% foreach my $column ( @{ shift( @{$data->{data}} ) } ) { # ( @{$data->{$row}} ) {
+    %>
+
+      <TD ALIGN="right" BGCOLOR="#ffffff">
+        <%= $link ? $link. 'begin='. shift(@speriod). ';end='. shift(@eperiod). '">' : '' %><FONT COLOR="#<%= $color %>">$<%= sprintf("%.2f", $column) %></FONT><%= $link ? '</A>' : '' %>
+      </TD>
+      <% $total += $column; %>
+
+    <% } %>
+
+    <% unless ( $opt{'nototal'} ) { %>
+
+      <TD ALIGN="right" BGCOLOR="#f5f6be">
+        <%= $link ? $link. 'begin='. @{$data->{speriod}}[0]. ';end='. @{$data->{eperiod}}[-1]. '">' : '' %><FONT COLOR="#<%= $color %>">$<%= sprintf("%.2f", $total) %></FONT><%= $link ? '</A>' : '' %>
+      </TD>
+
+    <% } %>
+
+  </TR>
+
+<% } %>
+
+</TABLE>
+
+<%= include('/elements/footer.html') %>
+
+<% } %>
diff --git a/httemplate/graph/money_time-graph.cgi b/httemplate/graph/money_time-graph.cgi
deleted file mode 100755 (executable)
index 637a3bf..0000000
+++ /dev/null
@@ -1,84 +0,0 @@
-<%
-
-#my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
-my ($curmon,$curyear) = (localtime(time))[4,5];
-
-#find first month
-my $syear = $cgi->param('syear') || 1899+$curyear;
-my $smonth = $cgi->param('smonth') || $curmon+1;
-
-#find last month
-my $eyear = $cgi->param('eyear') || 1900+$curyear;
-my $emonth = $cgi->param('emonth') || $curmon+1;
-#if ( $emonth++>12 ) { $emonth-=12; $eyear++; }
-
-# XXX or virtual
-my $agentnum = '';
-if ( $cgi->param('agentnum') =~ /^(\d*)$/ ) {
-  $agentnum = $1;
-}
-
-#my @labels;
-#my %data;
-
-my @items = qw( invoiced netsales credits payments receipts );
-if ( $cgi->param('12mo') == 1 ) {
-  @items = map $_.'_12mo', @items;
-}
-
-my %label = (
- 'invoiced' => 'Gross Sales (invoiced)', 
- 'netsales' => 'Net Sales (invoiced - applied credits)',
- 'credits'  => 'Credits',
- 'payments' => 'Gross Receipts (payments)',
- 'receipts' => 'Net Receipts/Cashflow (payments - refunds)',
-);
-$label{$_.'_12mo'} = $label{$_}. " (previous 12 months)"
-  foreach keys %label;
-
-my %color = (
-  'invoiced' => [ 153, 153, 255 ], #light blue
-  'netsales' => [   0,   0, 204 ], #blue
-  'credits'  => [ 204,   0,   0 ], #red
-  'payments' => [ 153, 204, 153 ], #light green
-  'receipts' => [   0, 204,   0 ], #green
-);
-$color{$_.'_12mo'} = $color{$_}
-  foreach keys %color;
-
-my $report = new FS::Report::Table::Monthly (
-  'items' => \@items,
-  'start_month' => $smonth,
-  'start_year'  => $syear,
-  'end_month'   => $emonth,
-  'end_year'    => $eyear,
-  'agentnum'    => $agentnum,
-);
-my %data = %{$report->data};
-
-#my $chart = Chart::LinesPoints->new(1024,480);
-#my $chart = Chart::LinesPoints->new(768,480);
-my $chart = Chart::LinesPoints->new(976,384);
-
-my $d = 0;
-$chart->set(
-  #'min_val' => 0,
-  'legend' => 'bottom',
-  'colors' => { ( map { 'dataset'.$d++ => $color{$_} } @items ),
-                #'grey_background' => [ 211, 211, 211 ],
-                'grey_background' => 'white',
-                'background' => [ 0xe8, 0xe8, 0xe8 ], #grey
-              },
-  #'grey_background' => 'false',
-  'legend_labels' => [ map { $label{$_} } @items ],
-  'brush_size' => 4,
-  #'pt_size' => 12,
-);
-
-my @data = map { $data{$_} } ( 'label', @items );
-
-http_header('Content-Type' => 'image/png' );
-
-$chart->_set_colors();
-
-%><%= $chart->scalar_png(\@data) %>
index 73f9d23..f085c22 100644 (file)
@@ -1,15 +1,12 @@
 <%
 
-#      #my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
-#      my ($curmon,$curyear) = (localtime(time))[4,5];
-
 #find first month
-my $syear = $cgi->param('syear'); # || 1899+$curyear;
-my $smonth = $cgi->param('smonth'); # || $curmon+1;
+my $syear = $cgi->param('start_year'); # || 1899+$curyear;
+my $smonth = $cgi->param('start_month'); # || $curmon+1;
 
 #find last month
-my $eyear = $cgi->param('eyear'); # || 1900+$curyear;
-my $emonth = $cgi->param('emonth'); # || $curmon+1;
+my $eyear = $cgi->param('end_year'); # || 1900+$curyear;
+my $emonth = $cgi->param('end_month'); # || $curmon+1;
 
 #XXX or virtual
 my( $agentnum, $agent ) = ('', '');
@@ -20,18 +17,6 @@ if ( $cgi->param('agentnum') =~ /^(\d+)$/ ) {
 }
 my $agentname = $agent ? $agent->agent.' ' : '';
 
-%>
-<%= include('/elements/header.html',
-              $agentname. 'Sales, Credits and Receipts Summary'
-           )
-%>
-
-<IMG SRC="money_time-graph.cgi?<%= $cgi->query_string %>" WIDTH="976" HEIGHT="384">
-<BR>
-
-<%= table('e8e8e8') %>
-<%
-
 my @items = qw( invoiced netsales credits payments receipts );
 if ( $cgi->param('12mo') == 1 ) {
   @items = map $_.'_12mo', @items;
@@ -44,9 +29,22 @@ my %label = (
   'payments' => 'Gross Receipts',
   'receipts' => 'Net Receipts',
 );
+
+my %graph_suffix = (
+ 'invoiced' => ' (invoiced)', 
+ 'netsales' => ' (invoiced - applied credits)',
+ 'credits'  => '',
+ 'payments' => ' (payments)',
+ 'receipts' => '/Cashflow (payments - refunds)',
+);
+my %graph_label = map { $_ => $label{$_}.$graph_suffix{$_} } keys %label;
+
 $label{$_.'_12mo'} = $label{$_}. " (previous 12 months)"
   foreach keys %label;
 
+$graph_label{$_.'_12mo'} = $graph_label{$_}. " (previous 12 months)"
+  foreach keys %graph_label;
+
 my %color = (
   'invoiced' => '9999ff', #light blue
   'netsales' => '0000cc', #blue
@@ -64,50 +62,19 @@ my %link = (
 );
 # XXX link 12mo?
 
-my $report = new FS::Report::Table::Monthly (
-  'items' => \@items,
-  'start_month' => $smonth,
-  'start_year'  => $syear,
-  'end_month'   => $emonth,
-  'end_year'    => $eyear,
-  'agentnum'    => $agentnum,
-);
-my $data = $report->data;
-
-my @mon = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec);
-
+%><%= include('elements/monthly.html',
+                'title'        => $agentname.
+                                  'Sales, Credits and Receipts Summary',
+                'items'        => \@items,
+                'labels'       => \%label,
+                'graph_labels' => \%graph_label,
+                'colors'       => \%color,
+                'links'        => \%link,
+                'start_month'  => $smonth,
+                'start_year'   => $syear,
+                'end_month'    => $emonth,
+                'end_year'     => $eyear,
+                'agentnum'     => $agentnum,
+                'nototal'      => scalar($cgi->param('12mo')),
+             )
 %>
-
-<TR><TD></TD>
-<% foreach my $column ( @{$data->{label}} ) {
-     #$column =~ s/^(\d+)\//$mon[$1-1]<BR>/e;
-     $column =~ s/^(\d+)\//$mon[$1-1]<BR>/;
-     %>
-     <TH><%= $column %></TH>
-<% } %>
-  <TH>Total</TH>
-</TR>
-
-<% foreach my $row (@items) { %>
-  <TR><TH><FONT COLOR="#<%= $color{$row} %>"><%= $label{$row} %></FONT></TH>
-  <% my $link = exists($link{$row})
-       ? qq(<A HREF="$link{$row})
-       : '';
-     my @speriod = @{$data->{speriod}};
-     my @eperiod = @{$data->{eperiod}};
-     my $total = 0;
-  %>
-  <% foreach my $column ( @{$data->{$row}} ) { %>
-    <TD ALIGN="right" BGCOLOR="#ffffff">
-      <%= $link ? $link. 'begin='. shift(@speriod). ';end='. shift(@eperiod). '">' : '' %><FONT COLOR="#<%= $color{$row} %>">$<%= sprintf("%.2f", $column) %></FONT><%= $link ? '</A>' : '' %>
-    </TD>
-    <% $total += $column; %>
-  <% } %>
-  <TD ALIGN="right" BGCOLOR="#f5f6be">
-    <%= $link ? $link. 'begin='. @{$data->{speriod}}[0]. ';end='. @{$data->{eperiod}}[-1]. '">' : '' %><FONT COLOR="#<%= $color{$row} %>">$<%= sprintf("%.2f", $total) %></FONT><%= $link ? '</A>' : '' %>
-  </TD>
-  </TR>
-<% } %>
-</TABLE>
-
-<%= include('/elements/footer.html') %>
diff --git a/httemplate/graph/report_cust_bill_pkg.html b/httemplate/graph/report_cust_bill_pkg.html
new file mode 100644 (file)
index 0000000..4f29b76
--- /dev/null
@@ -0,0 +1,29 @@
+<%= include('/elements/header.html', 'Sales Report' ) %>
+
+<FORM ACTION="cust_bill_pkg.cgi" METHOD="GET">
+
+<TABLE>
+
+<%= include('/elements/tr-select-from_to.html' ) %>
+
+<%= include('/elements/tr-select-agent.html', 'label' => 'For agent: ' ) %>
+
+<%= include('/elements/tr-select-pkg_class.html', '',
+              'pre_options' => [ '0' => 'all' ],
+              'empty_label' => '(empty class)',
+           )
+%>
+
+<!--
+<TR>
+  <TD ALIGN="right"><INPUT TYPE="checkbox" NAME="separate_0freq" VALUE="1"></TD>
+  <TD>Separate one-time vs. recurring sales</TD>
+</TR>
+-->
+
+</TABLE>
+
+<BR><INPUT TYPE="submit" VALUE="Display">
+</FORM>
+
+<%= include('/elements/footer.html') %>
index 6c7e427..5647496 100644 (file)
@@ -1,23 +1,3 @@
-<%
-
-#my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
-my ($curmon,$curyear) = (localtime(time))[4,5];
-
-#find first month
-my $syear = 1899+$curyear;
-my $smonth = $curmon+1;
-
-#want 12 month by default, not 13
-$smonth++;
-if ( $smonth > 12 ) { $smonth-=12; $syear++ }
-
-#find last month
-my $eyear = 1900+$curyear;
-my $emonth = $curmon+1;
-
-my @mon = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec);
-
-%>
 <%= include('/elements/header.html', 'Sales, Credits and Receipts Summary' ) %>
 
 <FORM ACTION="money_time.cgi" METHOD="GET">
@@ -34,38 +14,20 @@ my @mon = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec);
 <BR>
 -->
 
-From: <SELECT NAME="smonth">
-<% foreach my $mon ( 1..12 ) { %>
-<OPTION VALUE="<%= $mon %>"<%= $mon == $smonth ? ' SELECTED' : '' %>><%= $mon[$mon-1] %>
-<% } %>
-</SELECT>
-<SELECT NAME="syear">
-<% foreach my $y ( 1999 .. 2010 ) { %>
-<OPTION VALUE="<%= $y %>"<%= $y == $syear ? ' SELECTED' : '' %>><%= $y %>
-<% } %>
-</SELECT>
-<BR>
+<TABLE>
 
-To: <SELECT NAME="emonth">
-<% foreach my $mon ( 1..12 ) { %>
-<OPTION VALUE="<%= $mon %>"<%= $mon == $emonth ? ' SELECTED' : '' %>><%= $mon[$mon-1] %>
-<% } %>
-</SELECT>
-<SELECT NAME="eyear">
-<% foreach my $y ( 1999 .. 2010 ) { %>
-<OPTION VALUE="<%= $y %>"<%= $y == $eyear ? ' SELECTED' : '' %>><%= $y %>
-<% } %>
-</SELECT>
-<BR>
+<%= include('/elements/tr-select-from_to.html' ) %>
 
-For agent: <%= include('/elements/select-agent.html' ) %>
-<BR>
+<%= include('/elements/tr-select-agent.html', '', 'label' => 'For agent: ' ) %>
 
-<INPUT TYPE="checkbox" NAME="12mo" VALUE="1"> Show 12 month totals instead of monthly values.
-<BR>
+<TR>
+  <TD ALIGN="right"><INPUT TYPE="checkbox" NAME="12mo" VALUE="1"></TD>
+  <TD>Show 12 month totals instead of monthly values</TD>
+</TR>
+
+</TABLE>
 
-<INPUT TYPE="submit" VALUE="Display">
+<BR><INPUT TYPE="submit" VALUE="Display">
 </FORM>
 
 <%= include('/elements/footer.html') %>
-