separate CDR summary by rate table, #15535
authormark <mark>
Wed, 21 Dec 2011 02:57:07 +0000 (02:57 +0000)
committermark <mark>
Wed, 21 Dec 2011 02:57:07 +0000 (02:57 +0000)
FS/FS/cdr.pm
FS/FS/part_pkg/voip_cdr.pm
FS/FS/part_pkg/voip_tiered.pm

index 1e40881..d7a4fbd 100644 (file)
@@ -575,11 +575,11 @@ my %export_names = (
   },
   'sum_duration' => {
     'name'           => 'Summary (one line per service, with duration)',
-    'invoice_header' => 'Caller,Calls,Minutes,Price',
+    'invoice_header' => 'Caller,Rate,Calls,Minutes,Price',
   },
   'sum_count' => {
     'name'           => 'Summary (one line per service, with count)',
-    'invoice_header' => 'Caller,Messages,Price',
+    'invoice_header' => 'Caller,Rate,Messages,Price',
   },
 );
 
@@ -650,12 +650,14 @@ sub export_formats {
       # for summary formats, the CDR is a fictitious object containing the 
       # total billsec and the phone number of the service
       'src',
+      sub { my($cdr, %opt) = @_; $opt{ratename} },
       sub { my($cdr, %opt) = @_; $opt{count} },
       sub { my($cdr, %opt) = @_; int($opt{seconds}/60).'m' },
       $price_sub,
     ],
     'sum_count' => [
       'src',
+      sub { my($cdr, %opt) = @_; $opt{ratename} },
       sub { my($cdr, %opt) = @_; $opt{count} },
       $price_sub,
     ],
@@ -711,9 +713,13 @@ Options:
 
 format
 
-charge
+charge - override the 'rated_price' field of the CDR
 
-seconds
+seconds - override the 'billsec' field of the CDR
+
+count - number of usage events included in this record, for summary formats
+
+ratename - name of the rate table used to rate this call
 
 granularity
 
index b92cb47..7865335 100644 (file)
@@ -427,6 +427,7 @@ sub calc_usage {
       my $seconds = '';
       my $weektime = '';
       my $regionname = '';
+      my $ratename = '';
       my $classnum = '';
       my $countrycode;
       my $number;
@@ -514,8 +515,9 @@ sub calc_usage {
             ? $cust_pkg->part_pkg->option('accountcode_tollfree_ratenum')
             : '';
 
-          my $intrastate_ratenum = $cust_pkg->part_pkg->option('accountcode_tollfree_ratenum');
+          my $intrastate_ratenum = $cust_pkg->part_pkg->option('intrastate_ratenum');
           if ( $intrastate_ratenum && !$cdr->is_tollfree ) {
+            $ratename = 'Interstate'; #until proven otherwise
             # this is relatively easy only because:
             # -assume all numbers are valid NANP numbers NOT in a fully-qualified format
             # -disregard toll-free
@@ -532,9 +534,12 @@ sub calc_usage {
             $srcprefix = qsearchs('rate_prefix', {   'countrycode' => '1',
                                                      'npa' => $1, 
                                                  }) || '';
-            $eff_ratenum = $intrastate_ratenum if ($srcprefix && $dstprefix
+            if ($srcprefix && $dstprefix
                 && $srcprefix->state && $dstprefix->state
-                && $srcprefix->state eq $dstprefix->state);
+                && $srcprefix->state eq $dstprefix->state) {
+              $eff_ratenum = $intrastate_ratenum;
+              $ratename = 'Intrastate'; # XXX possibly just use the ratename?
+            }
           }
 
           $eff_ratenum ||= $ratenum;
@@ -786,7 +791,6 @@ sub calc_usage {
             );
           }
         } #if(there is a rate_detail)
 
         #if ( $charge > 0 ) {
         # generate a detail record for every call; filter out $charge = 0 
@@ -821,6 +825,8 @@ sub calc_usage {
             regionname  => $regionname,
           };
         }
+        $call_details->{'ratename'} = $ratename;
+
         push @invoice_details_sort, [ $call_details, $cdr->calldate_unix ];
         #} $charge > 0
 
@@ -998,35 +1004,45 @@ sub sum_detail {
   my $self = shift;
   my $svc_x = shift;
   my $invoice_details = shift || [];
-  my $count = scalar(@$invoice_details);
-  return () if !$count;
-  my $sum_detail = {
-    amount    => 0,
-    format    => 'C',
-    classnum  => '', #XXX
-    duration  => 0,
-    phonenum  => $svc_x->phonenum,
-    accountcode => '', #XXX
-    startdate => '', #XXX
-    regionnam => '',
-  };
+  return () if !@$invoice_details;
+  my $details_by_rate = {};
   # combine the entire set of CDRs
   foreach ( @$invoice_details ) {
-    $sum_detail->{amount} += $_->[0]{amount};
-    $sum_detail->{duration} += $_->[0]{duration};
+    my $d = $_->[0];
+    my $sum = $details_by_rate->{ $d->{ratename} } ||= {
+      amount      => 0,
+      format      => 'C',
+      classnum    => '', #XXX
+      duration    => 0,
+      phonenum    => $svc_x->phonenum,
+      accountcode => '', #XXX
+      startdate   => '', #XXX
+      regionname  => '',
+      count       => 0,
+    };
+    $sum->{amount} += $d->{amount};
+    $sum->{duration} += $d->{duration};
+    $sum->{count}++;
   }
-  my $total_cdr = FS::cdr->new({
-      'billsec' => $sum_detail->{duration},
-      'src'     => $sum_detail->{phonenum},
-    });
-  $sum_detail->{detail} = $total_cdr->downstream_csv(
-    format    => $self->option('output_format'),
-    seconds   => $sum_detail->{duration},
-    charge    => sprintf('%.2f',$sum_detail->{amount}),
-    phonenum  => $sum_detail->{phonenum},
-    count     => $count,
-  );
-  return $sum_detail;
+  my @details;
+  foreach my $ratename ( sort keys(%$details_by_rate) ) {
+    my $sum = $details_by_rate->{$ratename};
+    next if $sum->{count} == 0;
+    my $total_cdr = FS::cdr->new({
+        'billsec' => $sum->{duration},
+        'src'     => $sum->{phonenum},
+      });
+    $sum->{detail} = $total_cdr->downstream_csv(
+      format    => $self->option('output_format'),
+      seconds   => $sum->{duration},
+      charge    => sprintf('%.2f',$sum->{amount}),
+      ratename  => $ratename,
+      phonenum  => $sum->{phonenum},
+      count     => $sum->{count},
+    );
+    push @details, $sum;
+  }
+  @details;
 }
 
 # and whether cust_bill should show a detail line for the service label 
index c1382fb..492e1f6 100644 (file)
@@ -98,6 +98,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 )