From 9cdee88c5fbadc5c9ab61b8b04c20589a40e7277 Mon Sep 17 00:00:00 2001 From: mark Date: Fri, 16 Dec 2011 22:06:37 +0000 Subject: [PATCH] better summarization of zero-charge CDRs, #15535 --- FS/FS/part_pkg/voip_cdr.pm | 128 +++++++++++++++++++++++---------------------- 1 file changed, 66 insertions(+), 62 deletions(-) diff --git a/FS/FS/part_pkg/voip_cdr.pm b/FS/FS/part_pkg/voip_cdr.pm index 747965b69..4550e1ff8 100644 --- a/FS/FS/part_pkg/voip_cdr.pm +++ b/FS/FS/part_pkg/voip_cdr.pm @@ -788,40 +788,41 @@ sub calc_usage { } #if(there is a rate_detail) - if ( $charge > 0 ) { - #just use FS::cust_bill_pkg_detail objects? - my $call_details; - my $phonenum = $svc_x->phonenum; - - if ( scalar(@call_details) == 1 ) { - $call_details = - { format => 'C', - detail => $call_details[0], - amount => $charge, - classnum => $classnum, - phonenum => $phonenum, - accountcode => $cdr->accountcode, - startdate => $cdr->startdate, - duration => $seconds, - regionname => $regionname, - }; - } else { #only used for $rating_method eq 'upstream' now - # and for sum_ formats - $csv->combine(@call_details); - $call_details = - { format => 'C', - detail => $csv->string, - amount => $charge, - classnum => $classnum, - phonenum => $phonenum, - accountcode => $cdr->accountcode, - startdate => $cdr->startdate, - duration => $seconds, - regionname => $regionname, - }; - } - push @invoice_details_sort, [ $call_details, $cdr->calldate_unix ]; + #if ( $charge > 0 ) { + # generate a detail record for every call; filter out $charge = 0 + # later. + my $call_details; + my $phonenum = $svc_x->phonenum; + + if ( scalar(@call_details) == 1 ) { + $call_details = + { format => 'C', + detail => $call_details[0], + amount => $charge, + classnum => $classnum, + phonenum => $phonenum, + accountcode => $cdr->accountcode, + startdate => $cdr->startdate, + duration => $seconds, + regionname => $regionname, + }; + } else { #only used for $rating_method eq 'upstream' now + # and for sum_ formats + $csv->combine(@call_details); + $call_details = + { format => 'C', + detail => $csv->string, + amount => $charge, + classnum => $classnum, + phonenum => $phonenum, + accountcode => $cdr->accountcode, + startdate => $cdr->startdate, + duration => $seconds, + regionname => $regionname, + }; } + push @invoice_details_sort, [ $call_details, $cdr->calldate_unix ]; + #} $charge > 0 # if the customer flag is on, call "downstream_csv" or something # like it to export the call downstream! @@ -844,39 +845,42 @@ sub calc_usage { my @sorted_invoice_details = sort { @{$a}[1] <=> @{$b}[1] } @invoice_details_sort; foreach my $sorted_call_detail ( @sorted_invoice_details ) { - push @$details, @{$sorted_call_detail}[0]; + my $d = $sorted_call_detail->[0]; + push @$details, $d if $d->{amount} > 0; } } else { #$self->sum_usage - my $sum_detail = { - amount => 0, - format => 'C', - classnum => '', #XXX - duration => 0, - phonenum => $svc_x->phonenum, - accountcode => '', #XXX - startdate => '', #XXX - regionnam => '', - }; - # combine the entire set of CDRs - foreach ( @invoice_details_sort ) { - $sum_detail->{amount} += $_->[0]{amount}; - $sum_detail->{duration} += $_->[0]{duration}; - } - my $total_cdr = FS::cdr->new({ - 'billsec' => $sum_detail->{duration}, - 'src' => $sum_detail->{phonenum}, - }); - $sum_detail->{detail} = $total_cdr->downstream_csv( - format => $output_format, - seconds => $sum_detail->{duration}, - charge => sprintf('%.2f',$sum_detail->{amount}), - phonenum => $sum_detail->{phonenum}, - count => scalar(@invoice_details_sort), - ); - push @$details, $sum_detail; + my $count = scalar(@invoice_details_sort); + if ( $count > 0 ) { + my $sum_detail = { + amount => 0, + format => 'C', + classnum => '', #XXX + duration => 0, + phonenum => $svc_x->phonenum, + accountcode => '', #XXX + startdate => '', #XXX + regionnam => '', + }; + # combine the entire set of CDRs + foreach ( @invoice_details_sort ) { + $sum_detail->{amount} += $_->[0]{amount}; + $sum_detail->{duration} += $_->[0]{duration}; + } + my $total_cdr = FS::cdr->new({ + 'billsec' => $sum_detail->{duration}, + 'src' => $sum_detail->{phonenum}, + }); + $sum_detail->{detail} = $total_cdr->downstream_csv( + format => $output_format, + seconds => $sum_detail->{duration}, + charge => sprintf('%.2f',$sum_detail->{amount}), + phonenum => $sum_detail->{phonenum}, + count => $count, + ); + push @$details, $sum_detail; + } # if $count > 0 } #if $self->sum_usage - } # $cust_svc unshift @$details, { format => 'C', -- 2.11.0