X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=blobdiff_plain;f=FS%2FFS%2Fpart_pkg%2Fvoip_cdr.pm;h=747965b6959d3db668962b76ff1ff5c74ff6bb98;hp=02992277d4d8b83ad779aa9aa891bbac8d9c5cd9;hb=392d0c1164bf5d222826164195502906252ba2dd;hpb=fdb9aecd3c4bcaef6f13becbe209e7cd7475204b diff --git a/FS/FS/part_pkg/voip_cdr.pm b/FS/FS/part_pkg/voip_cdr.pm index 02992277d..747965b69 100644 --- a/FS/FS/part_pkg/voip_cdr.pm +++ b/FS/FS/part_pkg/voip_cdr.pm @@ -403,6 +403,7 @@ sub calc_usage { my %options = ( 'disable_src' => $self->option('disable_src'), 'default_prefix' => $self->option('default_prefix'), + 'cdrtypenum' => $self->option('use_cdrtypenum'), 'status' => '', 'for_update' => 1, ); # $last_bill, $$sdate ) @@ -434,6 +435,8 @@ sub calc_usage { if ( $rating_method eq 'prefix' ) { my $da_rewrote = 0; + # this will result in those CDRs being marked as done... is that + # what we want? if ( length($cdr->dst) && grep { $cdr->dst eq $_ } @dirass ){ $cdr->dst('411'); $da_rewrote = 1; @@ -448,6 +451,8 @@ sub calc_usage { warn "not charging for CDR ($reason)\n" if $DEBUG; $charge = 0; + # this will result in those CDRs being marked as done... is that + # what we want? } else { @@ -767,17 +772,19 @@ sub calc_usage { warn "Incrementing \$charges by $charge. Now $charges\n" if $DEBUG; $charges += $charge; - @call_details = ( - $cdr->downstream_csv( 'format' => $output_format, - 'granularity' => $rate_detail->sec_granularity, - 'seconds' => ($use_duration ? - $cdr->duration : - $cdr->billsec), - 'charge' => $charge, - 'pretty_dst' => $pretty_destnum, - 'dst_regionname' => $regionname, - ) - ); + if ( !$self->sum_usage ) { + @call_details = ( + $cdr->downstream_csv( 'format' => $output_format, + 'granularity' => $rate_detail->sec_granularity, + 'seconds' => ($use_duration ? + $cdr->duration : + $cdr->billsec), + 'charge' => $charge, + 'pretty_dst' => $pretty_destnum, + 'dst_regionname' => $regionname, + ) + ); + } } #if(there is a rate_detail) @@ -788,33 +795,31 @@ sub calc_usage { if ( scalar(@call_details) == 1 ) { $call_details = - [ 'C', - $call_details[0], - $charge, - $classnum, - $phonenum, - $cdr->accountcode, - $cdr->startdate, - $seconds, - $regionname, - ]; + { 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 = - [ 'C', - $csv->string, - $charge, - $classnum, - $phonenum, - $cdr->accountcode, - $cdr->startdate, - $seconds, - $regionname, - ]; + { format => 'C', + detail => $csv->string, + amount => $charge, + classnum => $classnum, + phonenum => $phonenum, + accountcode => $cdr->accountcode, + startdate => $cdr->startdate, + duration => $seconds, + regionname => $regionname, + }; } - warn " adding details on charge to invoice: [ ". - join(', ', @{$call_details} ). " ]" - if ( $DEBUG && ref($call_details) ); push @invoice_details_sort, [ $call_details, $cdr->calldate_unix ]; } @@ -833,22 +838,50 @@ sub calc_usage { } } # $cdr - - my @sorted_invoice_details = sort { @{$a}[1] <=> @{$b}[1] } @invoice_details_sort; - foreach my $sorted_call_detail ( @sorted_invoice_details ) { + + if ( !$self->sum_usage ) { + #sort them + 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]; + } } + 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; + } #if $self->sum_usage } # $cust_svc - unshift @$details, [ 'C', - FS::cdr::invoice_header($output_format), - '', - '', - '', - '', - '', - ] + unshift @$details, { format => 'C', + detail => FS::cdr::invoice_header($output_format), + } if @$details && $rating_method ne 'upstream'; # if ( $spool_cdr && length($downstream_cdr) ) { @@ -929,6 +962,7 @@ sub check_chargable { && $cdr->carrierid ne $opt{'use_carrierid'} #ne otherwise 0 matches '' && ! $flags{'da_rewrote'}; + # unlike everything else, use_cdrtypenum is applied in FS::svc_x::get_cdrs. return "cdrtypenum != $opt{'use_cdrtypenum'}" if length($opt{'use_cdrtypenum'}) && $cdr->cdrtypenum ne $opt{'use_cdrtypenum'}; #ne otherwise 0 matches '' @@ -1005,5 +1039,20 @@ sub calc_units { $count; } +# tells whether cust_bill_pkg_detail should return a single line for +# each phonenum +sub sum_usage { + my $self = shift; + $self->option('output_format') =~ /^sum_/; +} + +# and whether cust_bill should show a detail line for the service label +# (separate from usage details) +sub hide_svc_detail { + my $self = shift; + $self->option('output_format') =~ /^sum_/; +} + + 1;