sub table { 'cdr'; }
+sub table_info {
+ {
+ 'fields' => {
+#XXX fill in some (more) nice names
+ #'acctid' => '',
+ 'calldate' => 'Call date',
+ 'clid' => 'Caller ID',
+ 'src' => 'Source',
+ 'dst' => 'Destination',
+ 'dcontext' => 'Dest. context',
+ 'channel' => 'Channel',
+ 'dstchannel' => 'Destination channel',
+ #'lastapp' => '',
+ #'lastdata' => '',
+ 'startdate' => 'Start date',
+ 'answerdate' => 'Answer date',
+ 'enddate' => 'End date',
+ 'duration' => 'Duration',
+ 'billsec' => 'Billable seconds',
+ 'disposition' => 'Disposition',
+ 'amaflags' => 'AMA flags',
+ 'accountcode' => 'Account code',
+ #'uniqueid' => '',
+ 'userfield' => 'User field',
+ #'cdrtypenum' => '',
+ 'charged_party' => 'Charged party',
+ #'upstream_currency' => '',
+ 'upstream_price' => 'Upstream price',
+ #'upstream_rateplanid' => '',
+ #'ratedetailnum' => '',
+ 'rated_price' => 'Rated price',
+ #'distance' => '',
+ #'islocal' => '',
+ #'calltypenum' => '',
+ #'description' => '',
+ #'quantity' => '',
+ 'carrierid' => 'Carrier ID',
+ #'upstream_rateid' => '',
+ 'svcnum' => 'Freeside service',
+ 'freesidestatus' => 'Freeside status',
+ 'freesiderewritestatus' => 'Freeside rewrite status',
+ 'cdrbatch' => 'Batch',
+ },
+
+ };
+
+}
+
=item insert
Adds this record to the database. If there is an error, returns the error,
sub set_charged_party {
my $self = shift;
- unless ( $self->charged_party ) {
+ my $conf = new FS::Conf;
- my $conf = new FS::Conf;
+ unless ( $self->charged_party ) {
if ( $conf->exists('cdr-charged_party-accountcode') && $self->accountcode ){
}
+# my $prefix = $conf->config('cdr-charged_party-truncate_prefix');
+# my $prefix_len = length($prefix);
+# my $trunc_len = $conf->config('cdr-charged_party-truncate_length');
+#
+# $self->charged_party( substr($self->charged_party, 0, $trunc_len) )
+# if $prefix_len && $trunc_len
+# && substr($self->charged_party, 0, $prefix_len) eq $prefix;
+
}
=item set_status_and_rated_price STATUS [ RATED_PRICE ]
sub { time2str('%D', shift->calldate_unix ) }, #DATE
sub { time2str('%r', shift->calldate_unix ) }, #TIME
#'userfield', #USER
- 'dst', #NUMBER_DIALED
'src', #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
return '' unless length($date); #that's okay, it becomes NULL
+ if ( $date =~ /^([a-z]{3})\s+([a-z]{3})\s+(\d{1,2})\s+(\d{1,2}):(\d{1,2}):(\d{1,2})\s+(\d{4})$/i && $7 > 1970 ) {
+ my $time = str2time($date);
+ return $time if $time > 100000; #just in case
+ }
+
my($year, $mon, $day, $hour, $min, $sec);
#$date =~ /^\s*(\d{4})[\-\/]\(\d{1,2})[\-\/](\d{1,2})\s+(\d{1,2}):(\d{1,2}):(\d{1,2})\s*$/
#taqua #2007-10-31 08:57:24.113000000
- if ( $date =~ /^\s*(\d{4})\D(\d{1,2})\D(\d{1,2})\s+(\d{1,2})\D(\d{1,2})\D(\d{1,2})(\D|$)/ ) {
+ if ( $date =~ /^\s*(\d{4})\D(\d{1,2})\D(\d{1,2})\D+(\d{1,2})\D(\d{1,2})\D(\d{1,2})(\D|$)/ ) {
($year, $mon, $day, $hour, $min, $sec) = ( $1, $2, $3, $4, $5, $6 );
} elsif ( $date =~ /^\s*(\d{1,2})\D(\d{1,2})\D(\d{4})\s+(\d{1,2})\D(\d{1,2})\D(\d{1,2})(\D|$)/ ) {
($mon, $day, $year, $hour, $min, $sec) = ( $1, $2, $3, $4, $5, $6 );
die "unparsable date: $date"; #maybe we shouldn't die...
}
- return '' if $year == 1900 && $mon == 1 && $day == 1
- && $hour == 0 && $min == 0 && $sec == 0;
+ return '' if ( $year == 1900 || $year == 1970 ) && $mon == 1 && $day == 1
+ && $hour == 0 && $min == 0 && $sec == 0;
if ($options{gmt}) {
timegm($sec, $min, $hour, $day, $mon-1, $year);