X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2Fcdr.pm;h=bf7a90706560f7715b7aca19c83a7620de65f2aa;hb=452b1135adcffac04acc10ead2bff1d3a280ca2b;hp=850f797bcd3fb2b39c2056e1d5319bb08f49c4ee;hpb=bda8c33f9b346ba6cd7aa4174ce0d3e37db7bd49;p=freeside.git diff --git a/FS/FS/cdr.pm b/FS/FS/cdr.pm index 850f797bc..bf7a90706 100644 --- a/FS/FS/cdr.pm +++ b/FS/FS/cdr.pm @@ -130,9 +130,9 @@ following fields are currently supported: =item svcnum - Link to customer service (see L) -=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. @@ -533,6 +553,10 @@ my %export_names = ( 'invoice_header' => "Date,Time,Called From,Destination,Duration,Price", #"Date,Time,Name,Called From,Destination,Duration,Price", }, + 'accountcode_simple' => { + 'name' => 'Simple with accountcode', + 'invoice_header' => "Date,Time,Called From,Account,Duration,Price", + }, 'basic' => { 'name' => 'Basic', 'invoice_header' => "Date/Time,Called Number,Min/Sec,Price", @@ -553,6 +577,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,Rate,Calls,Minutes,Price', + }, + 'sum_count' => { + 'name' => 'Summary (one line per service, with count)', + 'invoice_header' => 'Caller,Rate,Messages,Price', + }, ); my %export_formats = (); @@ -582,6 +614,24 @@ sub export_formats { } }; + my $price_sub = sub { + my ($cdr, %opt) = @_; + my $price; + if ( defined($opt{charge}) ) { + $price = $opt{charge}; + } + elsif ( $opt{inbound} ) { + my $term = $cdr->cdr_termination(1); # 1 = inbound + $price = $term->rated_price if defined $term; + } + else { + $price = $cdr->rated_price; + } + 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 @@ -590,23 +640,46 @@ sub export_formats { 'dst', #NUMBER_DIALED $duration_sub, #DURATION #sub { sprintf('%.3f', shift->upstream_price ) }, #PRICE - sub { my($cdr, %opt) = @_; $opt{money_char}. $opt{charge}; }, #PRICE + $price_sub, ], 'simple2' => [ 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 - sub { my($cdr, %opt) = @_; $opt{money_char}. $opt{charge}; }, #PRICE + $price_sub, + ], + 'accountcode_simple' => [ + sub { time2str($date_format, shift->calldate_unix ) }, #DATE + sub { time2str('%r', shift->calldate_unix ) }, #TIME + $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_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_sub, + sub { my($cdr, %opt) = @_; $opt{ratename} }, + sub { my($cdr, %opt) = @_; $opt{count} }, + $price_sub, ], 'basic' => [ sub { time2str('%d %b - %I:%M %p', shift->calldate_unix) }, 'dst', $duration_sub, - sub { my($cdr, %opt) = @_; $opt{money_char}. $opt{charge}; }, #PRICE + $price_sub, ], 'default' => [ @@ -628,14 +701,10 @@ sub export_formats { $duration_sub, #PRICE - sub { my($cdr, %opt) = @_; - $opt{charge} = '0.00' unless defined $opt{charge}; - $opt{money_char}.$opt{charge}; - }, - + $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', @@ -643,7 +712,7 @@ sub export_formats { ]; 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] ]; @@ -652,13 +721,19 @@ sub export_formats { =item downstream_csv OPTION => VALUE ... +Returns a string of formatted call details for display on an invoice. + Options: format -charge +charge - override the 'rated_price' field of the CDR + +seconds - override the 'billsec' field of the CDR + +count - number of usage events included in this record, for summary formats -seconds +ratename - name of the rate table used to rate this call granularity @@ -753,14 +828,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; } }