[freeside-commits] branch FREESIDE_3_BRANCH updated. 597a7252c466097eb3a0f5abe7278e5b131cfee8
Christopher Burger
burgerc at freeside.biz
Wed Dec 13 12:24:03 PST 2017
The branch, FREESIDE_3_BRANCH has been updated
via 597a7252c466097eb3a0f5abe7278e5b131cfee8 (commit)
via a2e5f1d30aae23c3d4eb845fa2e9e5b2ebebcdff (commit)
via aa916768d22f1f7dc9367962a5012adc91d95046 (commit)
from 2c8e6717e98dae679359aeac61eae3a2c9f74b0b (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit 597a7252c466097eb3a0f5abe7278e5b131cfee8
Author: Christopher Burger <burgerc at freeside.biz>
Date: Thu Nov 30 10:49:10 2017 -0500
RT# 78019 - updated csv and excel export to set two decimal for revenue columns.
diff --git a/httemplate/graph/elements/report.html b/httemplate/graph/elements/report.html
index 70c3a9e94..6e6c382f6 100644
--- a/httemplate/graph/elements/report.html
+++ b/httemplate/graph/elements/report.html
@@ -52,10 +52,10 @@ any delimiter and linked from the elements in @data.
%
% my @bottom_total = ();
% my $row = 0;
-% foreach ( @items ) {
+% foreach my $i ( @items ) {
%
% my $col = 0;
-% my @row = map { sprintf($sprintf, $_) } @{ shift(@data) };
+% my @row = map { sprintf($sprintf_fields->{$i} ? $sprintf_fields->{$i} : $sprintf, $_) } @{ shift(@data) };
% my $total = sum(@row);
% push @row, sprintf($sprintf, $total) unless $opt{'nototal'};
% unless ($opt{'no_graph'}[$row]) {
@@ -101,7 +101,7 @@ any delimiter and linked from the elements in @data.
% }
%
% my @bottom_total = ();
-% foreach ( @items ) {
+% foreach my $i ( @items ) {
% $row++;
% $col = 0;
% my $total = 0;
@@ -109,7 +109,7 @@ any delimiter and linked from the elements in @data.
% foreach ( @{ shift( @data ) } ) {
% $total += $_;
% $bottom_total[$col-1] += $_ unless $opt{no_graph}[$row];
-% $worksheet->write_number($row, $col++, sprintf($sprintf, $_) );
+% $worksheet->write_number($row, $col++, sprintf($sprintf_fields->{$i} ? $sprintf_fields->{$i} : $sprintf, $_) );
% }
% if ( !$opt{'nototal'} ) {
% $bottom_total[$col-1] += $total unless $opt{no_graph}[$row];
commit a2e5f1d30aae23c3d4eb845fa2e9e5b2ebebcdff
Author: Christopher Burger <burgerc at freeside.biz>
Date: Thu Nov 30 10:10:34 2017 -0500
RT# 78019 - Added revenue difference to package churn report
diff --git a/FS/FS/Report/Table.pm b/FS/FS/Report/Table.pm
index e3e0854ec..0c4d9bfa6 100644
--- a/FS/FS/Report/Table.pm
+++ b/FS/FS/Report/Table.pm
@@ -415,6 +415,18 @@ sub _subtract_11mo {
timelocal($sec,$min,$hour,$mday,$mon,$year);
}
+=item _subtract_months: subtracts the number of months from a given unix date stamp
+
+=cut
+
+sub _subtract_months {
+ my($self, $number_of_months, $time) = @_;
+ my ($sec,$min,$hour,$mday,$mon,$year) = (localtime($time) )[0,1,2,3,4,5];
+ $mon -= $number_of_months;
+ if ( $mon < 0 ) { $mon+=12; $year--; }
+ timelocal($sec,$min,$hour,$mday,$mon,$year);
+}
+
=item cust_pkg_setup_cost: The total setup costs of packages setup in the period
'classnum': limit to this package class.
@@ -867,7 +879,24 @@ sub total_revenue_pkg {
my $self = shift;
my $active_revenue = $self->revenue_pkg('active', @_);
my $setup_revenue = $self->revenue_pkg('setup', @_);
- my $return = sprintf("%.2f", $active_revenue + $setup_revenue);
+ my $return = $active_revenue + $setup_revenue;
+
+ return $return;
+}
+
+sub total_revenue_diff {
+ my $self = shift;
+
+ my @current_month = @_;
+ my @previous_month = @current_month;
+
+ $previous_month[0] = $self->_subtract_months(1,$current_month[0]);
+ $previous_month[1] = $self->_subtract_months(1,$current_month[1]);
+
+ my $previous_revenue = $self->revenue_pkg('active', @previous_month) + $self->revenue_pkg('setup', @previous_month);
+ my $current_revenue = $self->revenue_pkg('active', @current_month) + $self->revenue_pkg('setup', @current_month);
+
+ my $return = $current_revenue - $previous_revenue;
return $return;
}
@@ -889,7 +918,7 @@ sub revenue_pkg {
FROM $from
JOIN part_pkg ON (cust_pkg.pkgpart = part_pkg.pkgpart)
JOIN cust_main ON (cust_pkg.custnum = cust_main.custnum)
- JOIN h_cust_bill_pkg AS revenue ON (cust_pkg.pkgnum = revenue.pkgnum AND cust_pkg.history_date + 5 > revenue.history_date)
+ JOIN h_cust_bill_pkg AS revenue ON (cust_pkg.pkgnum = revenue.pkgnum AND cust_pkg.history_date < $speriod )
";
}
elsif ($status eq "setup") {
@@ -897,7 +926,8 @@ sub revenue_pkg {
FROM $from
JOIN part_pkg ON (cust_pkg.pkgpart = part_pkg.pkgpart)
JOIN cust_main ON (cust_pkg.custnum = cust_main.custnum)
- JOIN h_cust_bill_pkg AS revenue ON (cust_pkg.pkgnum = revenue.pkgnum AND cust_pkg.setup + 15 > revenue.history_date)
+ JOIN h_cust_bill_pkg AS revenue ON (cust_pkg.pkgnum = revenue.pkgnum AND
+ ( cust_pkg.setup > $speriod AND cust_pkg.setup < $eperiod) )
";
}
diff --git a/httemplate/graph/cust_pkg.html b/httemplate/graph/cust_pkg.html
index 68c5b2136..6aea10492 100644
--- a/httemplate/graph/cust_pkg.html
+++ b/httemplate/graph/cust_pkg.html
@@ -13,7 +13,7 @@
'disable_money' => 1,
'remove_empty' => (scalar(@group_keys) > 1 ? 1 : 0),
'nototal' => 1,
- 'no_graph' => [ 1, 0, 0, 0, 0, 1 ], # don't graph 'active, total_revenue'
+ 'no_graph' => [ 1, 0, 0, 0, 0, 1, 1 ], # don't graph 'active, total_revenue, total_revenue_diff'
&>
<%init>
@@ -34,7 +34,7 @@ if ( $cgi->param('agentnum') =~ /^(\d+)$/ ) {
my $agentname = $agent ? $agent->agent.' ' : '';
-my @base_items = qw( active_pkg setup_pkg susp_pkg unsusp_pkg cancel_pkg total_revenue_pkg );
+my @base_items = qw( active_pkg setup_pkg susp_pkg unsusp_pkg cancel_pkg total_revenue_pkg total_revenue_diff );
my %base_labels = (
'active_pkg' => 'Active packages',
@@ -42,7 +42,8 @@ my %base_labels = (
'susp_pkg' => 'Suspensions',
'unsusp_pkg' => 'Unsuspensions',
'cancel_pkg' => 'Cancellations',
- 'total_revenue_pkg' => 'Total Revenue'
+ 'total_revenue_pkg' => 'Total Revenue',
+ 'total_revenue_diff' => 'Revenue Difference',
);
my %base_colors = (
@@ -52,10 +53,12 @@ my %base_colors = (
'unsusp_pkg' => '44ff44', #light green
'cancel_pkg' => 'cc0000', #red
'total_revenue_pkg' => '0000ff', #blue
+ 'total_revenue_diff' => '0000ff', #blue
);
my $sprintf_fields = {
'total_revenue_pkg' => '%.2f', #format to 2 decimal places
+ 'total_revenue_diff' => '%.2f', #format to 2 decimal places
};
my %base_links;
commit aa916768d22f1f7dc9367962a5012adc91d95046
Author: Christopher Burger <burgerc at freeside.biz>
Date: Tue Oct 17 09:41:12 2017 -0400
RT# 78019 - Added total revenue line to Package churn report
diff --git a/FS/FS/Report/Table.pm b/FS/FS/Report/Table.pm
index 5fb56404d..e3e0854ec 100644
--- a/FS/FS/Report/Table.pm
+++ b/FS/FS/Report/Table.pm
@@ -863,6 +863,54 @@ sub unsusp_pkg {
$self->churn_pkg('unsusp', @_);
}
+sub total_revenue_pkg {
+ my $self = shift;
+ my $active_revenue = $self->revenue_pkg('active', @_);
+ my $setup_revenue = $self->revenue_pkg('setup', @_);
+ my $return = sprintf("%.2f", $active_revenue + $setup_revenue);
+
+ return $return;
+}
+
+sub revenue_pkg {
+ my $self = shift;
+ my ( $status, $speriod, $eperiod, $agentnum, %opt ) = @_;
+ my $totalrevenue;
+
+ my ($from, @where) =
+ FS::h_cust_pkg->churn_fromwhere_sql( $status, $speriod, $eperiod);
+
+ push @where, $self->pkg_where(%opt, 'agentnum' => $agentnum);
+
+ my $sql;
+
+ if ($status eq "active") {
+ $sql = "SELECT DISTINCT ON (revenue.pkgnum) revenue.pkgnum AS pkgnum, revenue.recur AS revenue
+ FROM $from
+ JOIN part_pkg ON (cust_pkg.pkgpart = part_pkg.pkgpart)
+ JOIN cust_main ON (cust_pkg.custnum = cust_main.custnum)
+ JOIN h_cust_bill_pkg AS revenue ON (cust_pkg.pkgnum = revenue.pkgnum AND cust_pkg.history_date + 5 > revenue.history_date)
+ ";
+ }
+ elsif ($status eq "setup") {
+ $sql = "SELECT DISTINCT ON (revenue.pkgnum) revenue.pkgnum AS pkgnum, revenue.setup AS revenue
+ FROM $from
+ JOIN part_pkg ON (cust_pkg.pkgpart = part_pkg.pkgpart)
+ JOIN cust_main ON (cust_pkg.custnum = cust_main.custnum)
+ JOIN h_cust_bill_pkg AS revenue ON (cust_pkg.pkgnum = revenue.pkgnum AND cust_pkg.setup + 15 > revenue.history_date)
+ ";
+ }
+
+ $sql .= ' WHERE '.join(' AND ', @where)
+ if scalar(@where);
+
+ $sql .= "ORDER BY revenue.pkgnum ASC, revenue.history_date DESC";
+
+ my $revenue_sql = "SELECT sum(rev.revenue) AS total_revenue FROM ( $sql ) AS rev";
+
+ $self->scalar_sql($revenue_sql);
+}
+
sub churn_pkg {
my $self = shift;
my ( $status, $speriod, $eperiod, $agentnum, %opt ) = @_;
diff --git a/FS/FS/h_cust_pkg.pm b/FS/FS/h_cust_pkg.pm
index 423b44250..f0746476c 100644
--- a/FS/FS/h_cust_pkg.pm
+++ b/FS/FS/h_cust_pkg.pm
@@ -140,9 +140,9 @@ sub churn_fromwhere_sql {
# XXX or should we include if they were created by a pkgpart change?
$from = "cust_pkg";
@where = (
- "setup >= $speriod",
- "setup < $eperiod",
- "change_pkgnum IS NULL"
+ "cust_pkg.setup >= $speriod",
+ "cust_pkg.setup < $eperiod",
+ "cust_pkg.change_pkgnum IS NULL"
);
} elsif ( $status eq 'cancel' ) {
# also simple, because packages should only be canceled once
diff --git a/httemplate/graph/cust_pkg.html b/httemplate/graph/cust_pkg.html
index 3b6552ba8..68c5b2136 100644
--- a/httemplate/graph/cust_pkg.html
+++ b/httemplate/graph/cust_pkg.html
@@ -7,12 +7,13 @@
'links' => \@links,
'params' => \@params,
'agentnum' => $agentnum,
- 'sprintf' => ( $normalize ? '%0.1f%%' : '%u'),
+ 'sprintf' => ( $normalize ? '%0.1f%%' : '%u'),
+ 'sprintf_fields' => $sprintf_fields,
'normalize' => ( $normalize ? 0 : undef ),
'disable_money' => 1,
'remove_empty' => (scalar(@group_keys) > 1 ? 1 : 0),
'nototal' => 1,
- 'no_graph' => [ 1, 0, 0, 0, 0 ], # don't graph 'active'
+ 'no_graph' => [ 1, 0, 0, 0, 0, 1 ], # don't graph 'active, total_revenue'
&>
<%init>
@@ -33,7 +34,7 @@ if ( $cgi->param('agentnum') =~ /^(\d+)$/ ) {
my $agentname = $agent ? $agent->agent.' ' : '';
-my @base_items = qw( active_pkg setup_pkg susp_pkg unsusp_pkg cancel_pkg );
+my @base_items = qw( active_pkg setup_pkg susp_pkg unsusp_pkg cancel_pkg total_revenue_pkg );
my %base_labels = (
'active_pkg' => 'Active packages',
@@ -41,6 +42,7 @@ my %base_labels = (
'susp_pkg' => 'Suspensions',
'unsusp_pkg' => 'Unsuspensions',
'cancel_pkg' => 'Cancellations',
+ 'total_revenue_pkg' => 'Total Revenue'
);
my %base_colors = (
@@ -49,8 +51,13 @@ my %base_colors = (
'susp_pkg' => 'ff9900', #yellow
'unsusp_pkg' => '44ff44', #light green
'cancel_pkg' => 'cc0000', #red
+ 'total_revenue_pkg' => '0000ff', #blue
);
+my $sprintf_fields = {
+ 'total_revenue_pkg' => '%.2f', #format to 2 decimal places
+};
+
my %base_links;
foreach my $status (qw(active setup cancel susp unsusp)) {
$base_links{$status.'_pkg'} =
diff --git a/httemplate/graph/elements/monthly.html b/httemplate/graph/elements/monthly.html
index 1a9428115..cfe5a3c6d 100644
--- a/httemplate/graph/elements/monthly.html
+++ b/httemplate/graph/elements/monthly.html
@@ -59,6 +59,7 @@ Example:
'no_graph' => \@no_graph,
'bottom_link' => \@bottom_link,
'transpose' => $opt{'daily'},
+ 'sprintf_fields' => $sprintf_fields,
map { $_, $opt{$_} } (qw(title
nototal
graph_type
@@ -79,6 +80,7 @@ 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' ) {
diff --git a/httemplate/graph/elements/report.html b/httemplate/graph/elements/report.html
index b5d214816..70c3a9e94 100644
--- a/httemplate/graph/elements/report.html
+++ b/httemplate/graph/elements/report.html
@@ -249,7 +249,7 @@ any delimiter and linked from the elements in @data.
% my $e = 0;
% foreach ( @$data_row ) {
% my $entry = $_;
-% $entry = $money_char . sprintf($sprintf, $entry);
+% $entry = $money_char . sprintf($sprintf_fields->{$row} ? $sprintf_fields->{$row} : $sprintf, $entry);
% $entry = $link_prefix . shift(@$links) . "\">$entry</A>" if $link_prefix;
% push @{$cell[$i]}, $entry;
% $bottom_total[$e++] += $_ unless $opt{no_graph}[$i-1];
@@ -343,6 +343,7 @@ my $conf = new FS::Conf;
my $money_char = $opt{'disable_money'} ? '' : $conf->config('money_char');
my @items = @{ $opt{'items'} };
+my $sprintf_fields = $opt{'sprintf_fields'};
foreach my $other (qw( col_labels row_labels graph_labels axis_labels colors links )) {
if ( ref($opt{$other}) eq 'HASH' ) {
-----------------------------------------------------------------------
Summary of changes:
FS/FS/Report/Table.pm | 78 ++++++++++++++++++++++++++++++++++
FS/FS/h_cust_pkg.pm | 6 +--
httemplate/graph/cust_pkg.html | 16 +++++--
httemplate/graph/elements/monthly.html | 2 +
httemplate/graph/elements/report.html | 11 ++---
5 files changed, 102 insertions(+), 11 deletions(-)
More information about the freeside-commits
mailing list