From 8a10cadd86e9c721fd6f81e2e28b4d0ccfd0d8da Mon Sep 17 00:00:00 2001 From: mark Date: Thu, 8 Apr 2010 01:15:26 +0000 Subject: [PATCH] RT#1382: beginning of package cost report --- FS/FS/Report/Table/Monthly.pm | 58 ++++++++++++++++++++ FS/FS/cust_pkg.pm | 29 ++++++---- httemplate/elements/menu.html | 1 + httemplate/graph/cust_pkg_cost.cgi | 61 ++++++++++++++++++++++ httemplate/graph/report_cust_pkg_cost.html | 26 +++++++++ httemplate/search/cust_pkg.cgi | 2 +- 6 files changed, 167 insertions(+), 10 deletions(-) create mode 100644 httemplate/graph/cust_pkg_cost.cgi create mode 100644 httemplate/graph/report_cust_pkg_cost.html diff --git a/FS/FS/Report/Table/Monthly.pm b/FS/FS/Report/Table/Monthly.pm index 9e7a2882f..4b866c4dc 100644 --- a/FS/FS/Report/Table/Monthly.pm +++ b/FS/FS/Report/Table/Monthly.pm @@ -307,6 +307,64 @@ sub _subtract_11mo { timelocal($sec,$min,$hour,$mday,$mon,$year); } +sub cust_pkg_setup_cost { + my( $self, $speriod, $eperiod, $agentnum, %opt ) = @_; + my $where = ''; + my $comparison = ''; + if ( $opt{'classnum'} =~ /^(\d+)$/ ) { + if ( $1 == 0 ) { + $comparison = 'IS NULL'; + } + else { + $comparison = "= $1"; + } + $where = "AND part_pkg.classnum $comparison"; + } + $agentnum ||= $opt{'agentnum'}; + + my $total_sql = " SELECT SUM(part_pkg.setup_cost) "; + $total_sql .= " FROM cust_pkg + LEFT JOIN cust_main USING ( custnum ) + LEFT JOIN part_pkg USING ( pkgpart ) + WHERE pkgnum != 0 + $where + AND ".$self->in_time_period_and_agent( + $speriod, $eperiod, $agentnum, 'cust_pkg.setup'); + return $self->scalar_sql($total_sql); +} + +sub cust_pkg_recur_cost { + my( $self, $speriod, $eperiod, $agentnum, %opt ) = @_; + my $where = ''; + my $comparison = ''; + if ( $opt{'classnum'} =~ /^(\d+)$/ ) { + if ( $1 == 0 ) { + $comparison = 'IS NULL'; + } + else { + $comparison = "= $1"; + } + $where = " AND part_pkg.classnum $comparison"; + } + $agentnum ||= $opt{'agentnum'}; + # duplication of in_time_period_and_agent + # because we do it a little differently here + $where .= " AND cust_main.agentnum = $agentnum" if $agentnum; + $where .= " AND ". + $FS::CurrentUser::CurrentUser->agentnums_sql('table' => 'cust_main'); + + my $total_sql = " SELECT SUM(part_pkg.recur_cost) "; + $total_sql .= " FROM cust_pkg + LEFT JOIN cust_main USING ( custnum ) + LEFT JOIN part_pkg USING ( pkgpart ) + WHERE pkgnum != 0 + $where + AND cust_pkg.setup < $eperiod + AND (cust_pkg.cancel > $speriod OR cust_pkg.cancel IS NULL) + "; + return $self->scalar_sql($total_sql); +} + sub cust_bill_pkg { my( $self, $speriod, $eperiod, $agentnum, %opt ) = @_; diff --git a/FS/FS/cust_pkg.pm b/FS/FS/cust_pkg.pm index e9cc7d935..cd628160c 100644 --- a/FS/FS/cust_pkg.pm +++ b/FS/FS/cust_pkg.pm @@ -2733,21 +2733,32 @@ sub search { '' => {}, ); - foreach my $field (qw( setup last_bill bill adjourn susp expire cancel )) { + if( exists($params->{'active'} ) ) { + # This overrides all the other date-related fields + my($beginning, $ending) = @{$params->{'active'}}; + push @where, + "cust_pkg.setup IS NOT NULL", + "cust_pkg.setup <= $ending", + "(cust_pkg.cancel IS NULL OR cust_pkg.cancel >= $beginning )", + "NOT (".FS::cust_pkg->onetime_sql . ")"; + } + else { + foreach my $field (qw( setup last_bill bill adjourn susp expire cancel )) { - next unless exists($params->{$field}); + next unless exists($params->{$field}); - my($beginning, $ending) = @{$params->{$field}}; + my($beginning, $ending) = @{$params->{$field}}; - next if $beginning == 0 && $ending == 4294967295; + next if $beginning == 0 && $ending == 4294967295; - push @where, - "cust_pkg.$field IS NOT NULL", - "cust_pkg.$field >= $beginning", - "cust_pkg.$field <= $ending"; + push @where, + "cust_pkg.$field IS NOT NULL", + "cust_pkg.$field >= $beginning", + "cust_pkg.$field <= $ending"; - $orderby ||= "ORDER BY cust_pkg.$field"; + $orderby ||= "ORDER BY cust_pkg.$field"; + } } $orderby ||= 'ORDER BY bill'; diff --git a/httemplate/elements/menu.html b/httemplate/elements/menu.html index db5befc8a..bb219bdd4 100644 --- a/httemplate/elements/menu.html +++ b/httemplate/elements/menu.html @@ -266,6 +266,7 @@ if($curuser->access_right('Financial reports')) { 'Employee Commission Report' => [ $fsurl.'search/report_employee_commission.html', '' ], 'Credit Report' => [ $fsurl.'search/report_cust_credit.html', 'Credit report (by employee and/or date range)' ], 'Refund Report' => [ $fsurl.'search/report_cust_refund.html', 'Refund report (by type and/or date range)' ], + 'Package Costs Report' => [ $fsurl.'graph/report_cust_pkg_cost.html', 'Package setup and recurring costs graph' ], ); $report_financial{'A/R Aging'} = [ $fsurl.'search/report_receivables.html', 'Accounts Receivable Aging report' ]; $report_financial{'Prepaid Income'} = [ $fsurl.'search/report_prepaid_income.html', 'Prepaid income (unearned revenue) report' ]; diff --git a/httemplate/graph/cust_pkg_cost.cgi b/httemplate/graph/cust_pkg_cost.cgi new file mode 100644 index 000000000..0aa7e3262 --- /dev/null +++ b/httemplate/graph/cust_pkg_cost.cgi @@ -0,0 +1,61 @@ +<% include('elements/monthly.html', + 'title' => $agentname. + 'Package Costs Report', + 'graph_type' => 'Lines', + 'items' => \@items, + 'labels' => \%label, + 'graph_labels' => \%label, + 'colors' => \%color, + 'links' => \%link, + 'agentnum' => $agentnum, + 'nototal' => scalar($cgi->param('12mo')), + ) +%> +<%init> + +die "access denied" + unless $FS::CurrentUser::CurrentUser->access_right('Financial reports'); + +#XXX or virtual +my( $agentnum, $agent ) = ('', ''); +if ( $cgi->param('agentnum') =~ /^(\d+)$/ ) { + $agentnum = $1; + $agent = qsearchs('agent', { 'agentnum' => $agentnum } ); + die "agentnum $agentnum not found!" unless $agent; +} + +my $agentname = $agent ? $agent->agent.' ' : ''; + +my @items = qw( cust_pkg_setup_cost cust_pkg_recur_cost ); +if ( $cgi->param('12mo') == 1 ) { + @items = map $_.'_12mo', @items; +} + +my %label = ( + 'cust_pkg_setup_cost' => 'Setup Costs', + 'cust_pkg_recur_cost' => 'Recurring Costs', +); + +$label{$_.'_12mo'} = $label{$_}. " (prev 12 months)" + foreach keys %label; + +my %color = ( + 'cust_pkg_setup_cost' => '0000cc', + 'cust_pkg_recur_cost' => '00cc00', +); +$color{$_.'_12mo'} = $color{$_} + foreach keys %color; + +my %link = ( + 'cust_pkg_setup_cost' => { 'link' => "${p}search/cust_pkg.cgi?agentnum=$agentnum;", + 'fromparam' => 'setup_begin', + 'toparam' => 'setup_end', + }, + 'cust_pkg_recur_cost' => { 'link' => "${p}search/cust_pkg.cgi?agentnum=$agentnum;", + 'fromparam' => 'active_begin', + 'toparam' => 'active_end', + }, +); +# XXX link 12mo? + + diff --git a/httemplate/graph/report_cust_pkg_cost.html b/httemplate/graph/report_cust_pkg_cost.html new file mode 100644 index 000000000..553db096b --- /dev/null +++ b/httemplate/graph/report_cust_pkg_cost.html @@ -0,0 +1,26 @@ +<% include('/elements/header.html', 'Package Costs Report' ) %> + +
+ + + +<% include('/elements/tr-select-from_to.html' ) %> + +<% include('/elements/tr-select-agent.html', + 'label' => 'For agent: ', + 'disable_empty' => 0, + ) +%> + +
+ +
+
+ +<% include('/elements/footer.html') %> +<%init> + +die "access denied" + unless $FS::CurrentUser::CurrentUser->access_right('Financial reports'); + + diff --git a/httemplate/search/cust_pkg.cgi b/httemplate/search/cust_pkg.cgi index 83cd206cb..adbec7a74 100755 --- a/httemplate/search/cust_pkg.cgi +++ b/httemplate/search/cust_pkg.cgi @@ -192,7 +192,7 @@ my %disable = ( '' => {}, ); -foreach my $field (qw( setup last_bill bill adjourn susp expire cancel )) { +foreach my $field (qw( setup last_bill bill adjourn susp expire cancel active )) { my($beginning, $ending) = FS::UI::Web::parse_beginning_ending($cgi, $field); -- 2.20.1