From 32365ef65ca6a40b5262cf166543b1d84c6aa57d Mon Sep 17 00:00:00 2001 From: Mark Wells Date: Fri, 3 Jul 2015 11:38:23 -0700 Subject: [PATCH] make new gross sales calculation optional, #25943 --- FS/FS/Report/Table/Monthly.pm | 8 +++++- FS/FS/cust_bill/Search.pm | 47 +++++++++++++++++++++------------ httemplate/graph/elements/monthly.html | 5 +++- httemplate/graph/money_time.cgi | 40 +++++++++++++++------------- httemplate/graph/report_money_time.html | 22 ++++++++++++--- httemplate/search/cust_bill.html | 11 +++++--- httemplate/search/report_cust_bill.html | 7 ++++- 7 files changed, 95 insertions(+), 45 deletions(-) diff --git a/FS/FS/Report/Table/Monthly.pm b/FS/FS/Report/Table/Monthly.pm index 0ff7efd16..f4ba02008 100644 --- a/FS/FS/Report/Table/Monthly.pm +++ b/FS/FS/Report/Table/Monthly.pm @@ -182,9 +182,15 @@ sub data { push @{$data{label}}, "$smonth/$syear"; # sprintf? my $speriod = timelocal(0,0,0,1,$smonth-1,$syear); - push @{$data{speriod}}, $speriod; if ( ++$smonth == 13 ) { $syear++; $smonth=1; } my $eperiod = timelocal(0,0,0,1,$smonth-1,$syear); + # 12-month mode: show results in a sliding window ending at $eperiod, + # but starting 12 months before. + if ( $self->{'12mo'}) { + $speriod = timelocal(0,0,0,1,$smonth-1,$syear-1); + } + + push @{$data{speriod}}, $speriod; push @{$data{eperiod}}, $eperiod; my $col = 0; # a "column" here is the data corresponding to an item diff --git a/FS/FS/cust_bill/Search.pm b/FS/FS/cust_bill/Search.pm index 62c55d6df..38f11d165 100644 --- a/FS/FS/cust_bill/Search.pm +++ b/FS/FS/cust_bill/Search.pm @@ -7,6 +7,7 @@ use FS::Record qw( qsearchs dbh ); use FS::cust_main; use FS::access_user; use FS::Conf; +use charnames ':full'; =item search HASHREF @@ -18,7 +19,9 @@ following additional parameters valid: =over 4 -=item newest_percust +=item newest_percust - only show the most recent invoice for each customer + +=item invoiced - show the invoiced amount (excluding discounts) instead of gross sales =back @@ -27,7 +30,8 @@ following additional parameters valid: sub search { my( $class, $params ) = @_; - my( $count_query, $count_addl ) = ( '', '' ); + my $count_query = ''; + my @count_addl; #some false laziness w/cust_bill::re_X @@ -77,21 +81,30 @@ sub search { my $money = (FS::Conf->new->config('money_char') || '$') . '%.2f'; - $count_query = 'SELECT COUNT(*), '. join(', ', - map "SUM($_)", - ( 'charged + discounted', - 'discounted', - 'credited', - 'charged - credited', - 'charged - credited - paid', - ) - ); - $count_addl = [ "$money sales (gross)", - "− $money discounted", - "− $money credited", - "= $money sales (net)", + my @sums = ( 'credited', # credits + 'charged - credited', # net sales + 'charged - credited - paid', # balance due + ); + + @count_addl = ( "\N{MINUS SIGN} $money credited", + "= $money net sales", "$money outstanding balance", - ]; + ); + + if ( $params->{'invoiced'} ) { + + unshift @sums, 'charged'; + unshift @count_addl, "$money invoiced"; + + } else { + + unshift @sums, 'charged + discounted', 'discounted'; + unshift @count_addl, "$money gross sales", + "\N{MINUS SIGN} $money discounted"; + + } + + $count_query = 'SELECT COUNT(*), '. join(', ', map "SUM($_)", @sums); } $count_query .= " FROM cust_bill $join $extra_sql"; @@ -115,7 +128,7 @@ sub search { 'order_by' => 'ORDER BY '. ( $params->{'order_by'} || 'cust_bill._date' ), 'count_query' => $count_query, - 'count_addl' => $count_addl, + 'count_addl' => \@count_addl, }; } diff --git a/httemplate/graph/elements/monthly.html b/httemplate/graph/elements/monthly.html index 4b988f166..1a9428115 100644 --- a/httemplate/graph/elements/monthly.html +++ b/httemplate/graph/elements/monthly.html @@ -27,7 +27,7 @@ Example: '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 @@ -96,6 +96,8 @@ $opt{'start_year'} ||= $cgi->param('start_year'); # || 1899+$curyear; $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 @@ -119,6 +121,7 @@ my %reportopts = ( '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'}, diff --git a/httemplate/graph/money_time.cgi b/httemplate/graph/money_time.cgi index b44adeaf8..aa17eb2f4 100644 --- a/httemplate/graph/money_time.cgi +++ b/httemplate/graph/money_time.cgi @@ -41,35 +41,35 @@ my $referralname = $part_referral ? $part_referral->referral.' ' : ''; # need to clean this up. the false symmetry of "gross" and "net" everything # makes it aesthetically hard to make this report more useful. -my @items = qw( gross netsales - discounted +my @items = ($cgi->param('exclude_discount') ? 'invoiced' : 'gross'); +push @items, + qw( discounted netsales credits netcredits payments receipts refunds netrefunds cashflow netcashflow - ); -if ( $cgi->param('12mo') == 1 ) { - @items = map $_.'_12mo', @items; -} + ); my %label = ( 'gross' => 'Gross Sales', - 'netsales' => 'Net Sales', + 'invoiced' => 'Invoiced Sales', + 'netsales' => 'Net Sales', 'discounted' => 'Discounts', 'credits' => 'Gross Credits', - 'netcredits' => 'Net Credits', + 'netcredits' => 'Net Credits', 'payments' => 'Gross Receipts', - 'receipts' => 'Net Receipts', + 'receipts' => 'Net Receipts', 'refunds' => 'Gross Refunds', - 'netrefunds' => 'Net Refunds', + 'netrefunds' => 'Net Refunds', 'cashflow' => 'Gross Cashflow', - 'netcashflow' => 'Net Cashflow', + 'netcashflow' => 'Net Cashflow', ); my %graph_suffix = ( 'gross' => ' (invoiced + discounts)', + 'invoiced' => '', 'netsales' => ' (invoiced - applied credits)', - 'discounted' => ' (discounts)', + 'discounted' => '', 'credits' => ' (credited)', 'netcredits' => ' (applied credits)', 'payments' => ' (payments)', @@ -81,14 +81,9 @@ my %graph_suffix = ( ); my %graph_label = map { $_ => $label{$_}.$graph_suffix{$_} } keys %label; -$label{$_.'_12mo'} = $label{$_}. " (prev 12 months)" - foreach keys %label; - -$graph_label{$_.'_12mo'} = $graph_label{$_}. " (prev 12 months)" - foreach keys %graph_label; - my %color = ( 'gross' => '9999ff', #light blue + 'invoiced' => '9999ff', #light blue 'netsales' => '0000cc', #blue 'credits' => 'ff9999', #light red 'netcredits' => 'cc0000', #red @@ -108,6 +103,7 @@ $ar .= ";cust_classnum=$_" foreach @classnums; my %link = ( 'gross' => "${p}search/cust_bill.html?$ar;", + 'invoiced' => "${p}search/cust_bill.html?$ar;invoiced=1;", 'netsales' => "${p}search/cust_bill.html?$ar;net=1;", 'credits' => "${p}search/cust_credit.html?$ar;", 'netcredits' => "${p}search/cust_credit_bill.html?$ar;", @@ -119,4 +115,12 @@ my %link = ( ); # XXX link 12mo? +if ( $cgi->param('12mo') ) { + $label{$_} .= " (prev 12 months)" + foreach keys %label; + + $graph_label{$_} .= " (prev 12 months)" + foreach keys %graph_label; +} + diff --git a/httemplate/graph/report_money_time.html b/httemplate/graph/report_money_time.html index 315d31bc5..8f534c0be 100644 --- a/httemplate/graph/report_money_time.html +++ b/httemplate/graph/report_money_time.html @@ -36,9 +36,25 @@ ) %> - - - Show 12 month totals instead of monthly values + + + + <& /elements/checkbox.html, + field => '12mo', + value => 1, + &> + <% emt('Show 12 month totals instead of monthly values') %> + + + + + <& /elements/checkbox.html, + field => 'exclude_discount', + value => 1, + curr_value => 0, + &> + <% emt('Exclude discounts from total sales') %> + diff --git a/httemplate/search/cust_bill.html b/httemplate/search/cust_bill.html index 662673676..017e8298f 100755 --- a/httemplate/search/cust_bill.html +++ b/httemplate/search/cust_bill.html @@ -8,7 +8,7 @@ 'count_addl' => $count_addl, 'redirect' => $link, 'header' => [ emt('Invoice #'), - emt('Gross Amount'), + emt($invoiced ? 'Charged' : 'Gross Amount'), emt('Discount'), emt('Credits'), emt('Net Amount'), @@ -18,7 +18,7 @@ ], 'fields' => [ 'display_invnum', - 'gross', + $invoiced ? 'charged' : 'gross', 'discounted', 'credited', 'net', @@ -28,7 +28,7 @@ ], 'sort_fields' => [ 'COALESCE( agent_invid, invnum )', - 'gross', + $invoiced ? 'charged' : 'gross', 'discounted', 'credited', 'net', @@ -87,6 +87,9 @@ my( $count_query, $sql_query ); my $count_addl = ''; my %search = (); +# show invoiced amount (charged) instead of gross sales +my $invoiced = $cgi->param('invoiced') ? 1 : 0; + if ( $cgi->param('invnum') =~ /^\s*(FS-)?(\d+)\s*$/ ) { my $join_cust_main = FS::UI::Web::join_cust_main('cust_bill'); @@ -132,7 +135,7 @@ if ( $cgi->param('invnum') =~ /^\s*(FS-)?(\d+)\s*$/ ) { #scalars for (qw( agentnum custnum cust_status refnum invnum_min invnum_max - open net newest_percust + open net newest_percust invoiced )) { diff --git a/httemplate/search/report_cust_bill.html b/httemplate/search/report_cust_bill.html index e80c6e895..bd40b969b 100644 --- a/httemplate/search/report_cust_bill.html +++ b/httemplate/search/report_cust_bill.html @@ -88,7 +88,12 @@ <% mt('Show only open invoices') |h %> - + + + + + <% emt('Exclude discounts from gross amount billed'), %> + % unless ( $custnum ) { -- 2.11.0