'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',
'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 = ();
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);
#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
$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};
+ },
],
);
'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;
}
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;
},
#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
},
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 );
}