rate tiers for vnes, RT#14903
[freeside.git] / FS / FS / cdr.pm
index 478dcff..850f797 100644 (file)
@@ -401,13 +401,15 @@ error, otherwise returns false.
 
 sub set_status_and_rated_price {
   my($self, $status, $rated_price, $svcnum, %opt) = @_;
-  if($opt{'inbound'}) {
+
+  if ($opt{'inbound'}) {
+
     my $term = qsearchs('cdr_termination', {
         acctid   => $self->acctid, 
         termpart => 1 # inbound
     });
     my $error;
-    if($term) {
+    if ( $term ) {
       warn "replacing existing cdr status (".$self->acctid.")\n" if $term;
       $error = $term->delete;
       return $error if $error;
@@ -419,13 +421,19 @@ sub set_status_and_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});
     return $term->insert;
-  }
-  else {
+
+  } else {
+
     $self->freesidestatus($status);
     $self->rated_price($rated_price);
+    $self->rated_seconds($opt{rated_seconds}) if exists($opt{rated_seconds});
+    $self->rated_minutes($opt{rated_minutes}) if exists($opt{rated_minutes});
     $self->svcnum($svcnum) if $svcnum;
     return $self->replace();
+
   }
 }
 
@@ -525,6 +533,10 @@ my %export_names = (
     'invoice_header' => "Date,Time,Called From,Destination,Duration,Price",
                        #"Date,Time,Name,Called From,Destination,Duration,Price",
   },
+  'basic' => {
+    'name'           => 'Basic',
+    'invoice_header' => "Date/Time,Called Number,Min/Sec,Price",
+  },
   'default' => {
     'name'           => 'Default',
     'invoice_header' => 'Date,Time,Number,Destination,Duration,Price',
@@ -537,6 +549,10 @@ my %export_names = (
     'name'           => 'Default plus accountcode',
     'invoice_header' => 'Date,Time,Account,Number,Destination,Duration,Price',
   },
+  'description_default' => {
+    'name'           => 'Default with description field as destination',
+    'invoice_header' => 'Caller,Date,Time,Number,Destination,Duration,Price',
+  },
 );
 
 my %export_formats = ();
@@ -548,17 +564,18 @@ sub export_formats {
   my $conf = new FS::Conf;
   my $date_format = $conf->config('date_format') || '%m/%d/%Y';
 
-  # This is now smarter, and shows the call duration in the 
-  # largest units that accurately reflect the granularity.
+  # call duration in the largest units that accurately reflect the  granularity
   my $duration_sub = sub {
     my($cdr, %opt) = @_;
     my $sec = $opt{seconds} || $cdr->billsec;
-    if ( length($opt{granularity}) && 
+    if ( defined $opt{granularity} && 
          $opt{granularity} == 0 ) { #per call
       return '1 call';
     }
-    elsif ( $opt{granularity} == 60 ) {#full minutes
-      return sprintf("%.0fm",$sec/60);
+    elsif ( defined $opt{granularity} && $opt{granularity} == 60 ) {#full minutes
+      my $min = int($sec/60);
+      $min++ if $sec%60;
+      return $min.'m';
     }
     else { #anything else
       return sprintf("%dm %ds", $sec/60, $sec%60);
@@ -585,6 +602,12 @@ sub export_formats {
       #sub { sprintf('%.3f', shift->upstream_price ) }, #PRICE
       sub { my($cdr, %opt) = @_; $opt{money_char}. $opt{charge}; }, #PRICE
     ],
+    'basic' => [
+      sub { time2str('%d %b - %I:%M %p', shift->calldate_unix) },
+      'dst',
+      $duration_sub,
+      sub { my($cdr, %opt) = @_; $opt{money_char}. $opt{charge}; }, #PRICE
+    ],
     'default' => [
 
       #DATE
@@ -605,7 +628,10 @@ sub export_formats {
       $duration_sub,
 
       #PRICE
-      sub { my($cdr, %opt) = @_; $opt{money_char}. $opt{charge}; },
+      sub { my($cdr, %opt) = @_; 
+        $opt{charge} = '0.00' unless defined $opt{charge};
+        $opt{money_char}.$opt{charge}; 
+      },
 
     ],
   );
@@ -615,10 +641,29 @@ sub export_formats {
       'accountcode',
       @{ $export_formats{'default'} }[2..5],
     ];
+  my @default = @{ $export_formats{'default'} };
+  $export_formats{'description_default'} = 
+    [ 'src', @default[0..2], 
+      sub { my($cdr, %opt) = @_; $cdr->description },
+      @default[4,5] ];
 
-  %export_formats
+  return %export_formats;
 }
 
+=item downstream_csv OPTION => VALUE ...
+
+Options:
+
+format
+
+charge
+
+seconds
+
+granularity
+
+=cut
+
 sub downstream_csv {
   my( $self, %opt ) = @_;
 
@@ -640,6 +685,8 @@ sub downstream_csv {
         }
     @{ $formats{$format} };
 
+  return @columns if defined $opt{'keeparray'};
+
   my $status = $csv->combine(@columns);
   die "FS::CDR: error combining ". $csv->error_input(). "into downstream CSV"
     unless $status;
@@ -886,7 +933,7 @@ my %import_options = (
                },
 
                           #drop the || 'csv' to allow auto xls for csv types?
-  'format_types' => { map { $_ => ( lc($cdr_info{$_}->{'type'}) || 'csv' ); }
+  'format_types' => { map { $_ => lc($cdr_info{$_}->{'type'} || 'csv'); }
                           keys %cdr_info
                     },
 
@@ -923,6 +970,14 @@ sub batch_import {
   my $iopt = _import_options;
   $opt->{$_} = $iopt->{$_} foreach keys %$iopt;
 
+  if ( defined $opt->{'cdrtypenum'} ) {
+        $opt->{'preinsert_callback'} = sub {
+                my($record,$param) = (shift,shift);
+                $record->cdrtypenum($opt->{'cdrtypenum'});
+                '';
+        };
+  }
+
   FS::Record::batch_import( $opt );
 
 }