use Date::Format;
use Time::Local;
use List::Util qw( first min );
+use Text::CSV_XS;
use FS::UID qw( dbh );
use FS::Conf;
use FS::Record qw( qsearch qsearchs );
$self->billsec( $self->enddate - $self->answerdate );
}
+ if ( ! $self->enddate && $self->startdate && $self->duration ) {
+ $self->enddate( $self->startdate + $self->duration );
+ }
+
$self->set_charged_party;
#check the foreign keys even?
my $seconds_left = $part_pkg->option_cacheable('use_duration')
? $self->duration
: $self->billsec;
- # charge for the first (conn_sec) seconds
- my $seconds = min($seconds_left, $rate_detail->conn_sec);
- $seconds_left -= $seconds;
- $weektime += $seconds;
- my $charge = $rate_detail->conn_charge;
+
+ #no, do this later so it respects (group) included minutes
+ # # charge for the first (conn_sec) seconds
+ # my $seconds = min($seconds_left, $rate_detail->conn_sec);
+ # $seconds_left -= $seconds;
+ # $weektime += $seconds;
+ # my $charge = $rate_detail->conn_charge;
+ my $seconds = 0;
+ my $charge = 0;
+ my $connection_charged = 0;
my $etime;
while($seconds_left) {
$seconds += $charge_sec;
+
my $region_group = ($part_pkg->option_cacheable('min_included') || 0) > 0;
${$opt{region_group_included_min}} -= $minutes
)
)
{
+
+ #NOW do connection charges here... right?
+ #my $conn_seconds = min($seconds_left, $rate_detail->conn_sec);
+ my $conn_seconds = 0;
+ unless ( $connection_charged++ ) { #only one connection charge
+ $conn_seconds = min($charge_sec, $rate_detail->conn_sec);
+ $seconds_left -= $conn_seconds;
+ $weektime += $conn_seconds;
+ $charge += $rate_detail->conn_charge;
+ }
+
#should preserve (display?) this
- my $charge_min = 0 - $included_min->{$regionnum}{$ratetimenum};
+ my $charge_min = 0 - $included_min->{$regionnum}{$ratetimenum} - ( $conn_seconds / 60 );
$included_min->{$regionnum}{$ratetimenum} = 0;
- $charge += ($rate_detail->min_charge * $charge_min); #still not rounded
+ $charge += ($rate_detail->min_charge * $charge_min) if $charge_min > 0; #still not rounded
} elsif ( ${$opt{region_group_included_min}} > 0
&& $region_group
length($price) ? ($opt{money_char} . $price) : '';
};
+ my $src_sub = sub { $_[0]->clid || $_[0]->src };
+
%export_formats = (
'simple' => [
sub { time2str($date_format, shift->calldate_unix ) }, #DATE
sub { time2str($date_format, shift->calldate_unix ) }, #DATE
sub { time2str('%r', shift->calldate_unix ) }, #TIME
#'userfield', #USER
- 'src', #called from
+ $src_sub, #called from
'dst', #NUMBER_DIALED
$duration_sub, #DURATION
#sub { sprintf('%.3f', shift->upstream_price ) }, #PRICE
'accountcode_simple' => [
sub { time2str($date_format, shift->calldate_unix ) }, #DATE
sub { time2str('%r', shift->calldate_unix ) }, #TIME
- 'src', #called from
+ $src_sub, #called from
'accountcode', #NUMBER_DIALED
$duration_sub, #DURATION
$price_sub,
'sum_duration' => [
# for summary formats, the CDR is a fictitious object containing the
# total billsec and the phone number of the service
- 'src',
+ $src_sub,
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',
+ $src_sub,
sub { my($cdr, %opt) = @_; $opt{ratename} },
sub { my($cdr, %opt) = @_; $opt{count} },
$price_sub,
$price_sub,
],
);
- $export_formats{'source_default'} = [ 'src', @{ $export_formats{'default'} }, ];
+ $export_formats{'source_default'} = [ $src_sub, @{ $export_formats{'default'} }, ];
$export_formats{'accountcode_default'} =
[ @{ $export_formats{'default'} }[0,1],
'accountcode',
];
my @default = @{ $export_formats{'default'} };
$export_formats{'description_default'} =
- [ 'src', @default[0..2],
+ [ $src_sub, @default[0..2],
sub { my($cdr, %opt) = @_; $cdr->description },
@default[4,5] ];
#$opt{'money_char'} ||= $conf->config('money_char') || '$';
$opt{'money_char'} ||= FS::Conf->new->config('money_char') || '$';
- eval "use Text::CSV_XS;";
- die $@ if $@;
my $csv = new Text::CSV_XS;
my @columns =
keys %cdr_info
},
+ 'format_asn_formats' =>
+ { map { $_ => $cdr_info{$_}->{'asn_format'}; }
+ keys %cdr_info
+ },
+
'format_row_callbacks' => { map { $_ => $cdr_info{$_}->{'row_callback'}; }
keys %cdr_info
},