X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2Fcdr.pm;h=478dcff6bfeb55e9350afa35a2de27ce921f41e4;hb=b49c1bd5510a5f10b05bffacc6cc8b6a1b2153e8;hp=cc25a171636de3866f80124b19aebda5ec956e5a;hpb=343befcb41d5ab76173645ceb8ac235ca7b92d35;p=freeside.git diff --git a/FS/FS/cdr.pm b/FS/FS/cdr.pm index cc25a1716..478dcff6b 100644 --- a/FS/FS/cdr.pm +++ b/FS/FS/cdr.pm @@ -285,7 +285,7 @@ sub check { # ; # return $error if $error; - for my $f ( grep { $self->$_ =~ /[a-z ]/i } qw( startdate enddate ) ) { + for my $f ( grep { $self->$_ =~ /\D/ } qw(startdate answerdate enddate)){ $self->$f( str2time($self->$f) ); } @@ -548,14 +548,20 @@ 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. my $duration_sub = sub { my($cdr, %opt) = @_; - if ( $opt{minutes} ) { - $opt{minutes}. ( $opt{granularity} ? 'm' : ' call' ); - } else { - #config if anyone really wants decimal minutes back - #sprintf('%.2fm', $cdr->billsec / 60 ); - int($cdr->billsec / 60).'m '. ($cdr->billsec % 60).'s'; + my $sec = $opt{seconds} || $cdr->billsec; + if ( length($opt{granularity}) && + $opt{granularity} == 0 ) { #per call + return '1 call'; + } + elsif ( $opt{granularity} == 60 ) {#full minutes + return sprintf("%.0fm",$sec/60); + } + else { #anything else + return sprintf("%dm %ds", $sec/60, $sec%60); } }; @@ -672,6 +678,50 @@ sub invoice_header { $export_names{$format}->{'invoice_header'}; } +=item clear_status + +Clears cdr and any associated cdr_termination statuses - used for +CDR reprocessing. + +=cut + +sub clear_status { + my $self = shift; + + local $SIG{HUP} = 'IGNORE'; + local $SIG{INT} = 'IGNORE'; + local $SIG{QUIT} = 'IGNORE'; + local $SIG{TERM} = 'IGNORE'; + local $SIG{TSTP} = 'IGNORE'; + local $SIG{PIPE} = 'IGNORE'; + + my $oldAutoCommit = $FS::UID::AutoCommit; + local $FS::UID::AutoCommit = 0; + my $dbh = dbh; + + $self->freesidestatus(''); + my $error = $self->replace; + if ( $error ) { + $dbh->rollback if $oldAutoCommit; + return $error; + } + + my @cdr_termination = qsearch('cdr_termination', + { 'acctid' => $self->acctid } ); + foreach my $cdr_termination ( @cdr_termination ) { + $cdr_termination->status(''); + $error = $cdr_termination->replace; + if ( $error ) { + $dbh->rollback if $oldAutoCommit; + return $error; + } + } + + $dbh->commit or die $dbh->errstr if $oldAutoCommit; + + ''; +} + =item import_formats Returns an ordered list of key value pairs containing import format names @@ -782,6 +832,10 @@ sub _cdr_date_parse { } elsif ( $date =~ /^\s*(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})$/ ) { # WIP: 20100329121420 ($year, $mon, $day, $hour, $min, $sec) = ( $1, $2, $3, $4, $5, $6 ); + } elsif ( $date =~ /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})Z$/) { + # Telos + ($year, $mon, $day, $hour, $min, $sec) = ( $1, $2, $3, $4, $5, $6 ); + $options{gmt} = 1; } else { die "unparsable date: $date"; #maybe we shouldn't die... } @@ -849,6 +903,11 @@ my %import_options = ( keys %cdr_info }, + 'format_xml_formats' => + { map { $_ => $cdr_info{$_}->{'xml_format'}; } + keys %cdr_info + }, + 'format_row_callbacks' => { map { $_ => $cdr_info{$_}->{'row_callback'}; } keys %cdr_info },