CDR type separation and summary formats, #15535
[freeside.git] / FS / FS / cdr.pm
index 850f797..190ffe2 100644 (file)
@@ -130,9 +130,9 @@ following fields are currently supported:
 
 =item svcnum - Link to customer service (see L<FS::cust_svc>)
 
-=item freesidestatus - NULL, done (or something)
+=item freesidestatus - NULL, processing-tiered, done
 
-=item freesiderewritestatus - NULL, done (or something)
+=item freesiderewritestatus - NULL, done, skipped
 
 =item cdrbatch
 
@@ -404,10 +404,7 @@ sub set_status_and_rated_price {
 
   if ($opt{'inbound'}) {
 
-    my $term = qsearchs('cdr_termination', {
-        acctid   => $self->acctid, 
-        termpart => 1 # inbound
-    });
+    my $term = $self->cdr_termination( 1 ); #1: inbound
     my $error;
     if ( $term ) {
       warn "replacing existing cdr status (".$self->acctid.")\n" if $term;
@@ -419,10 +416,10 @@ sub set_status_and_rated_price {
         termpart    => 1,
         rated_price => $rated_price,
         status      => $status,
-        svcnum      => $svcnum,
     });
     $term->rated_seconds($opt{rated_seconds}) if exists($opt{rated_seconds});
     $term->rated_minutes($opt{rated_minutes}) if exists($opt{rated_minutes});
+    $term->svcnum($svcnum) if $svcnum;
     return $term->insert;
 
   } else {
@@ -437,6 +434,29 @@ sub set_status_and_rated_price {
   }
 }
 
+=item cdr_termination [ TERMPART ]
+
+=cut
+
+sub cdr_termination {
+  my $self = shift;
+
+  if ( scalar(@_) && $_[0] ) {
+    my $termpart = shift;
+
+    qsearchs('cdr_termination', { acctid   => $self->acctid,
+                                  termpart => $termpart,
+                                }
+            );
+
+  } else {
+
+    qsearch('cdr_termination', { acctid => $self->acctid, } );
+
+  }
+
+}
+
 =item calldate_unix 
 
 Parses the calldate in SQL string format and returns a UNIX timestamp.
@@ -553,6 +573,14 @@ my %export_names = (
     'name'           => 'Default with description field as destination',
     'invoice_header' => 'Caller,Date,Time,Number,Destination,Duration,Price',
   },
+  'sum_duration' => {
+    'name'           => 'Summary (one line per service, with duration)',
+    'invoice_header' => 'Caller,Calls,Minutes,Price',
+  },
+  'sum_count' => {
+    'name'           => 'Summary (one line per service, with count)',
+    'invoice_header' => 'Caller,Messages,Price',
+  },
 );
 
 my %export_formats = ();
@@ -602,6 +630,19 @@ sub export_formats {
       #sub { sprintf('%.3f', shift->upstream_price ) }, #PRICE
       sub { my($cdr, %opt) = @_; $opt{money_char}. $opt{charge}; }, #PRICE
     ],
+    'sum_duration' => [ 
+      # 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{count} },
+      sub { my($cdr, %opt) = @_; int($opt{seconds}/60).'m' },
+      sub { my($cdr, %opt) = @_; $opt{money_char}. $opt{charge}; },
+    ],
+    'sum_count' => [
+      'src',
+      sub { my($cdr, %opt) = @_; $opt{count} },
+      sub { my($cdr, %opt) = @_; $opt{money_char}. $opt{charge}; },
+    ],
     'basic' => [
       sub { time2str('%d %b - %I:%M %p', shift->calldate_unix) },
       'dst',
@@ -652,6 +693,8 @@ sub export_formats {
 
 =item downstream_csv OPTION => VALUE ...
 
+Returns a string of formatted call details for display on an invoice.
+
 Options:
 
 format
@@ -753,14 +796,13 @@ sub clear_status {
     return $error;
   } 
 
-  my @cdr_termination = qsearch('cdr_termination', 
-                               { 'acctid' => $self->acctid } );
-  foreach my $cdr_termination ( @cdr_termination ) {
-      $cdr_termination->status('');
-      $error = $cdr_termination->replace;
+  foreach my $cdr_termination ( $self->cdr_termination ) {
+      #$cdr_termination->status('');
+      #$error = $cdr_termination->replace;
+      $error = $cdr_termination->delete;
       if ( $error ) {
-       $dbh->rollback if $oldAutoCommit;
-       return $error;
+        $dbh->rollback if $oldAutoCommit;
+        return $error;
       } 
   }