summaryrefslogtreecommitdiff
path: root/FS/FS/cdr
diff options
context:
space:
mode:
authorMitch Jackson <mitch@freeside.biz>2019-01-31 21:39:10 -0500
committerMitch Jackson <mitch@freeside.biz>2019-01-31 21:55:57 -0500
commit911ad81c95f3ed15f84d926a93e12185c2c073a6 (patch)
tree0cce4521e56750220f150e30be9376d7bc9d7b9f /FS/FS/cdr
parente92db24ac60d0fdcb8f8d3b383ab727af6de6d44 (diff)
RT# 81941 Broadsoft R22.0 cdr module
Diffstat (limited to 'FS/FS/cdr')
-rw-r--r--FS/FS/cdr/broadsoft22.pm188
1 files changed, 188 insertions, 0 deletions
diff --git a/FS/FS/cdr/broadsoft22.pm b/FS/FS/cdr/broadsoft22.pm
new file mode 100644
index 0000000..437d31e
--- /dev/null
+++ b/FS/FS/cdr/broadsoft22.pm
@@ -0,0 +1,188 @@
+package FS::cdr::broadsoft22;
+
+=head1 NAME
+
+FS::cdr::broadsoft22 - CDR parse module for Broadsoft R22.0
+
+=head1 DESCRIPTION
+
+Ref: BW-AccountingCDRInterfaceSpec-R22.pdf
+
+=cut
+
+use strict;
+use base qw( FS::cdr );
+use vars qw( %info );
+use FS::cdr qw( _cdr_date_parser_maker _cdr_min_parser_maker );
+
+%info = (
+ name => 'Broadsoft R22',
+ weight => 500,
+ header => 1,
+ type => 'csv',
+ sep_char => ',',
+ disabled => 0,
+
+ import_fields => [
+
+ # 1: recordId
+ # 2: serviceProvider
+ skip(2),
+
+ # 3: type
+ sub {
+ my ( $cdr, $data, $conf, $param ) = @_;
+ $param->{skiprow} = 1
+ if lc($data) ne 'normal';
+ '';
+ },
+
+ # 4: userNumber
+ # 5: groupNumber
+ skip(2),
+
+ # 6: direction
+ 'dcontext',
+
+ # 7: callingNumber
+ trim('src'),
+
+ # 8: callingPresentationINdicator
+ skip(1),
+
+ # 9: calledNumber
+ trim('dst'),
+
+ # 10: startTime
+ _cdr_date_parser_maker('startdate'),
+
+ # 11: userTimeZone
+ skip(1),
+
+ # 12: answerIndicator
+ sub {
+ my( $cdr, $data ) = @_;
+ $cdr->disposition( lc($data) eq 'yes' ? 'ANSWERED' : 'NO ANSWER');
+ },
+
+ # 13: answerTime
+ _cdr_date_parser_maker('answerdate'),
+
+ # 14: releaseTime
+ _cdr_date_parser_maker('enddate'),
+
+ # 15: terminationCause
+ # 16: networkType
+ # 17: carrierIdentificationCode
+ # 18: dialedDigits
+ # 19: callCategory
+ # 20: networkCallType
+ # 21: networkTranslatedNumber
+ # 22: networkTranslatedGroup
+ # 23: releasingParty
+ # 24: route
+ # 25: networkCallID
+ # 26: codedc
+ # 27: accessDeviceAddress
+ # 28: accessCallID
+ # 29: spare
+ # 30: failoverCorrelationId
+ # 31: spare
+ # 32: group
+ # 33: department
+ skip(19),
+
+ # 34: accountCode
+ sub {
+ my( $cdr, $data ) = @_;
+ $cdr->set(
+ 'accountcode',
+ $cdr->is_tollfree ? substr( $cdr->dst, 0, 32 ) : $data
+ );
+ },
+
+ # 35: authorizationCode
+ # 36: originalCalledNumber
+ # 37: originalCalledPresentationIndicator
+ # 38: originalCalledReason
+ # 39: redirectingNumber
+ # 40: redirectingPresentationIndicator
+ # 41: redirectingReason
+ # 42: chargeIndicator
+ # 43: typeOfNetwork
+ # 44: voicePortalCalling.invocationTime
+ # 45: localCallId
+ # 46: remoteCallId
+ # 47: callingPartyCategory
+ #
+ # Also... cols 48 - 448 see Broadsoft documentation
+
+ ],
+
+);
+
+sub trim {
+ my $fieldname = shift;
+ return sub {
+ my($cdr, $data) = @_;
+ $data =~ s/^\+1//;
+ $cdr->$fieldname($data);
+ ''
+ }
+}
+
+sub skip {
+ map { undef } (1..$_[0]);
+}
+
+1;
+
+__END__
+
+list of freeside CDR fields, useful ones marked with *
+
+ acctid - primary key
+ *[1] calldate - Call timestamp (SQL timestamp)
+ clid - Caller*ID with text
+7 * src - Caller*ID number / Source number
+9 * dst - Destination extension
+ dcontext - Destination context
+ channel - Channel used
+ dstchannel - Destination channel if appropriate
+ lastapp - Last application if appropriate
+ lastdata - Last application data
+10 * startdate - Start of call (UNIX-style integer timestamp)
+13 answerdate - Answer time of call (UNIX-style integer timestamp)
+14 * enddate - End time of call (UNIX-style integer timestamp)
+ * duration - Total time in system, in seconds
+ * billsec - Total time call is up, in seconds
+12 *[2] disposition - What happened to the call: ANSWERED, NO ANSWER, BUSY
+ amaflags - What flags to use: BILL, IGNORE etc, specified on a per
+ channel basis like accountcode.
+4 *[3] accountcode - CDR account number to use: account
+ uniqueid - Unique channel identifier
+ userfield - CDR user-defined field
+ cdr_type - CDR type - see FS::cdr_type (Usage = 1, S&E = 7, OC&C = 8)
+ *[4] charged_party - Service number to be billed
+ upstream_currency - Wholesale currency from upstream
+ *[5] upstream_price - Wholesale price from upstream
+ upstream_rateplanid - Upstream rate plan ID
+ rated_price - Rated (or re-rated) price
+ distance - km (need units field?)
+ islocal - Local - 1, Non Local = 0
+ *[6] calltypenum - Type of call - see FS::cdr_calltype
+ description - Description (cdr_type 7&8 only) (used for
+ cust_bill_pkg.itemdesc)
+ quantity - Number of items (cdr_type 7&8 only)
+ carrierid - Upstream Carrier ID (see FS::cdr_carrier)
+ upstream_rateid - Upstream Rate ID
+ svcnum - Link to customer service (see FS::cust_svc)
+ freesidestatus - NULL, done (or something)
+
+[1] Auto-populated from startdate if not present
+[2] Package options available to ignore calls without a specific disposition
+[3] When using 'cdr-charged_party-accountcode' config
+[4] Auto-populated from src (normal calls) or dst (toll free calls) if not present
+[5] When using 'upstream_simple' rating method.
+[6] Set to usage class classnum when using pre-rated CDRs and usage class-based
+ taxation (local/intrastate/interstate/international)