From: ivan Date: Fri, 10 Jul 2009 00:00:37 +0000 (+0000) Subject: sansay CDRs, RT#5495 X-Git-Tag: root_of_svc_elec_features~1044 X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=commitdiff_plain;h=f1f09d882038f5b9950598be62d94fc1486596d3 sansay CDRs, RT#5495 --- diff --git a/FS/FS/cdr.pm b/FS/FS/cdr.pm index 8ade4ea41..77f3ec6dc 100644 --- a/FS/FS/cdr.pm +++ b/FS/FS/cdr.pm @@ -753,7 +753,7 @@ sub _cdr_date_parse { 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 ) { + 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 } diff --git a/FS/FS/cdr/sansay.pm b/FS/FS/cdr/sansay.pm new file mode 100644 index 000000000..44accdce5 --- /dev/null +++ b/FS/FS/cdr/sansay.pm @@ -0,0 +1,408 @@ +package FS::cdr::sansay; + +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' => 'Sansay VSX', + 'weight' => 135, + 'header' => 1, #0 default, set to 1 to ignore the first line, or + # to higher numbers to ignore that number of lines + 'type' => 'csv', #csv (default), fixedlength or xls + 'sep_char' => ';', #for csv, defaults to , + 'disabled' => 0, #0 default, set to 1 to disable + + + #listref of what to do with each field from the CDR, in order + 'import_fields' => [ + + # "Header" (I do not think this means what you think it means) + #002452502;V1.10;R; + + # Record Sequence Number 9 Unique identification of this record + 'uniqueid', + + '', #Version Number 5 Format version number of records to follow + # "V1.10" + '', #Record Type 1 Type of CDR being generated + # R ­ Normal CDR record, A - Audit + + # "Body" + #WithMedia;181-1071459514@192.188.0.28;0001;Mon Dec 15 11:38:34 2003;Mon Dec 15 11:38:41 2003;Mon Dec 15 11:38:48 2003;480;EndedByRemoteUser;3;T;000200;H323;;192.188.0.38;9001;192.188.0.28;f0faff54-2e6c-11d8-8c4b-bd4d562c2265;192.188.0.38;18044;192.188.0.28;10756;G.729b;240;460;6066;14060;0;0;0;000200;H323;;192.188.0.28;8811;192.188.0.38;e83af3d3-1d2d-d811-9f98-003048424934;192.188.0.38;19236;192.188.0.28;10758;G.729b;460;240;14060;6066;0;0;0;F;9001;305;2;15;305000;00000011 44934567 45231267 2300BCC0;8587542200; + + '', #ConnectionType 16 Type of connection : Media or No Media + '', #SessionID 32 Unique ID assigned to the call by + # SSM subsystem + '', #XXX #Release Cause 4 2.4 Internal process Release Cause + + #Cause Code Descriptions + #01 Normal answered call + #02 No Answer, tear down by originator + #03 No answer, tear down by the termination + #04 NORMAL_NO_ANSWER, tear down by + # system + #402 Service Not Available + #403 Termination capability un-compatible + #404 Outbound digit translation failed + #405 Termination reject for some other reasons + #406 Termination Route is blocked + #500 Originator is not in the Authorized list + # (source verification failed) + #501 Origination digit translation failed + #502 Origination direction is not bi-directional or + # inbound + #503 Origination is not in service state + #600 Max system call handling reached + #601 System reject call + #602 System outbound digit translation error + # (maybe invalid configuration) + #603 System inbound digit translation error + # (Maybe invalid configuration) + + + #Start Time of Date 32 Indicates Time of Date when the call + # entered the system + _cdr_date_parser_maker('startddate'), + + #Answer Time of Date 32 Indicates TOD when the call was + # answered + _cdr_date_parser_maker('answerdate'), + + #Release TOD 32 Indicates the TOD when the call was + # disconnected + _cdr_date_parser_maker('enddate'), + + #Minutes West of 32 Minutes West of Greenwich Mean + #Greenwich Mean Time Time. Used to calculate the time + # zone. + '', #XXX use this + + #Release Cause from 32 Release cause string from either H323 + #Protocol Stack or SIP protocol stack + #4. Release Cause String (Field #8 in CDR) + #- a string of text further identifying the teardown circumstance from terminating protocol message. + '', + + #Binary Value of Release 4 Binary value of the protocol release + #Cause from Protocol cause + #stack + # + #3. Release Cause from Stack ( Field # 9 in CDR) + #- an integer value based on the releasing dialogues protocol. + # a. For a H.323 call leg originated release it will be the real Q.931 value received from the far + # side. + #Some of the Q.931 release causes; + #3: No route to destination + #16; Normal Clearing + #17: User Busy + #19: NO Answer from User + #21; Call Rejected + #28: Address Incomplete + #34: No Circuit Channel Available + #.... + # b. For a SIP call leg originated release, it's a RFC 3261 release cause value received from the + # far side. + #The following is the list that VSX generated if certain event happen: + #"400 Parse Failed" - Malformed Message + #"405 Method Not Allowed" - Unsupported Method + #"480 Temporarily Unavailable" - Overload Throttle Rejection, Max Sessions + #Exceeded, Demo License Expired, Capacity Exceeded on Route, Radius Server Timeout + #"415 No valid codec" - No valid codec could be supported between origination and + #term call legs. + #"481 Transaction Does Not Exist" - Unknown Transaction or Dialog + #"487 Transaction Terminated" - Origination Cancel + #"488 ReInvite Rejected" - Relay of ReInvite was Rejected + #"504 Server Time-out" - Internal VSX Failure + #"500 Sequence Out of Order" - CSeq counter violation + # c. For a VSX system originated release, it an internal release cause for teardown. + #If the VSX initiates a call teardown, the following cause values and strings are written into the CDR: + #999, "Demo Licence Expired!" + #999, "VSX Capacity Exceeded" + #999, "VSX Operator Reset" + #999, "Route Rejected" + #999, "Radius Rejected" + #999, "Radius Access Timeout" + #999, "Gatekeeper Reject" + #999, "Enum Server Reject" + #999, "Enum Server Timeout" + #999, "DNS Server Reject" + #999, "DNS/GK Timeout" + #999, "Could not allocate media" + #999, "No Response to INVITE" + #999, "Ring No Answer Timeout" + #999, "200 OK Timeout" + #999, "Maximum Duration Exceeded" + #987, "Termination Capacity Exceeded" + #987, "Origination Capacity Exceeded" + #987, "Term CPS Capacity Exceeded" + #987, "Orig CPS Capacity Exceeded" + #987, "Max H323 Legs Exceeded" + '', + + #1st release dialogue 1 O: origination, T: termination + #2. 1st Release Dialogue ( Field #10 in CDR) + #- one character value identifying the side of the call that i + # ,,O ­ origination initiated the teardown. + # ,,T ­ termination initiated the teardown. + # ,,N ­ the VSX internally initiated the teardown. + '', + + #Trunk ID -- Origination 6 TrunkID for origination GW(resources) + 'accountcode', # right? # use cdr-charged_party-accountcode + + #VoIP Protocol - Origination 6 VoIP protocol for origination dialogue + '', + + #Origination Source Number 128 Source Number in Origination Dialogue + 'src', + + #Origination Source Host Name 128 FQDN or IP address for Source GW in Origination Dialogue + 'channel', + + #Origination Destination Number 128 Destination Number in Origination + #Dialogue + 'dst', + + #Origination Destination Host Name 128 FQDN or IP address for Destination + #GW in Origination Dialogue + 'dstchannel', + + #Origination Call ID 128 Unique ID for the origination dialogue(leg) + '', #'clid', #? that's not really the same call ID + + #Origination Remote 16 Remote Payload IP address for + # Payload IP origination dialogue + # Address + '', + + #Origination Remote 6 Remote Payload UDP address for + # Payload UDP origination dialogue + # Address + '', + + #Origination Local 16 Local(SG) Payload IP address for + # Payload IP origination dialogue + # Address + '', + + #Origination Local 6 Local(SG) Payload UDP address for + # Payload UDP origination dialogue + # Address + '', + + #Origination Codec List 128 Supported Codec list( separated by + # comma) for origination dialogue + '', + + #Origination Ingress 10 Number of Ingress( into Sansay + # Packets system) payload packets in + # origination dialogue + '', + + #Origination Egress 10 Number of Egress( out from Sansay + # Packets system) payload packets in + # origination dialogue + '', + + #Origination Ingress 10 Number of Ingress( into Sansay + # Octets system) payload octets in origination + # dialogue + '', + + #Origination Egress 10 Number of Egress( out from Sansay + # Octets system) payload octets in origination + # dialogue + '', + + #Origination Ingress 10 Number of Ingress( into Sansay + # Packet Loss system) payload packet loss in + # origination dialogue + '', + + #Origination Ingress 10 Average Ingress( into Sansay system) + # Delay payload packets delay ( in ms) in + # origination dialogue + '', + + #Origination Ingress 10 Average of Ingress( into Sansay + # Packet Jitter system) payload packet Jitter ( in ms) + # in origination dialogue + '', + + #Trunk ID -- Termination 6 Trunk ID for termination GW(resources) + 'carrierid', + + #VoIP Protocol - 6 VoIP protocol from termination GW + # Termination + '', + + #Termination Source 128 Source Number in Termination + # Number Dialogue + '', + + #Termination Source Host 128 FQDN or IP address for Source GW + # Name in Termination Dialogue + '', + + #Termination Destination 128 Destination Number in Termination + # Number Dialogue + '', + + #Termination Destination 128 FQDN or IP address for Destination + # Host Name GW in Termination Dialogue + '', + + #Termination Call ID 128 Unique ID for the termination + # dialogue(leg) + '', + + #Termination Remote 16 Remote Payload IP address for + # Payload IP termination dialogue + # Address + '', + + #Termination Remote 6 Remote Payload UDP address for + # Payload UDP termination dialogue + # Address + '', + + #Termination Local 16 Local(SG) Payload IP address for + # Payload IP termination dialogue + # Address + '', + + #Termination Local 6 Local(SG) Payload UDP address for + # Payload UDP termination dialogue + # Address + '', + + #Termination Codec List 128 Supported Codec list( separated by + # comma) for termination dialogue + '', + + #Termination Ingress 10 Number of Ingress( into Sansay + # Packets system) payload packets in + # termination dialogue + '', + + #Termination Egress 10 Number of Egress( out from Sansay + # Packets system) payload packets in + # termination dialogue + '', + + #Termination Ingress 10 Number of Ingress( into Sansay + # Octets system) payload octets in + # termination dialogue + '', + + #Termination Egress 10 Number of Egress( out from Sansay + # Octets system) payload octets in + # termination dialogue + '', + + #Termination Ingress 10 Number of Ingress( into Sansay + # Packet Loss system) payload packet loss in + # termination dialogue + '', + + #Termination Ingress 10 Average Ingress( into Sansay system) + # Delay payload packets delay ( in ms) in + # termination dialogue + '', + + #Termination Ingress 10 Average of Ingress( into Sansay + # Packet Jitter system) payload packet Jitter ( in ms) + # in termination dialogue + '', + + #Final Route Indication 1 F: Final Route Selection, + # I: Intermediate Route Attempts + '', + + #Routing Digits 64 Routing Digit (Digit after Inbound + # translation, before Outbound + # Translation). This may also be the + # LRN if LNP feature is enabled + '', + + #Call Duration in Second 6 Call Duration in Seconds. 0 if this is + # failed call + 'billsec', + + #Post Dial Delay in 6 Post dial delay (from call attempt to + # Seconds ring). 0 if this is failed call + '', + + #Ring Time in Second 6 Ring Time in Seconds. 0 if this is + # failed call + '', + + #Duration in milliseconds 10 Call duration in milliseconds. + '', + + #Conf ID 36 Unique Conference ID for this call in + # Cisco format + '', + + #RPID/ANI 32 Inbound Remote Party ID line or + # Proxy Asserted Identity if provided + 'clid', #? + + ], + +); + +1; + +__END__ + +list of freeside CDR fields, useful ones marked with * + +N/A acctid - primary key +FILLED_IN *[1] calldate - Call timestamp (SQL timestamp) +DONE clid - Caller*ID with text +DONE * src - Caller*ID number / Source number +DONE * dst - Destination extension + dcontext - Destination context +DONE channel - Channel used +DONE dstchannel - Destination channel if appropriate + lastapp - Last application if appropriate + lastdata - Last application data +DONE * startdate - Start of call (UNIX-style integer timestamp) +DONE answerdate - Answer time of call (UNIX-style integer timestamp) +DONE * enddate - End time of call (UNIX-style integer timestamp) +* duration - Total time in system, in seconds +DONE * billsec - Total time call is up, in seconds +*[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. +DONE *[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) +FILLED_IN *[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) +DONE 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) + diff --git a/eg/cdr_template.pm b/eg/cdr_template.pm index 5499d2267..31ccedff4 100644 --- a/eg/cdr_template.pm +++ b/eg/cdr_template.pm @@ -29,6 +29,7 @@ use FS::cdr qw( _cdr_date_parser_maker _cdr_min_parser_maker ); #premade subref factory for date+time parsing, understands dates like: # 10/31/2007 08:57:24 # 2007-10-31 08:57:24.113000000 + # Mon Dec 15 11:38:34 2003 _cdr_date_parser_maker('startddate'), #for example #premade subref factory for decimal minute parsing @@ -71,7 +72,7 @@ list of freeside CDR fields, useful ones marked with * amaflags - What flags to use: BILL, IGNORE etc, specified on a per channel basis like accountcode. *[3] accountcode - CDR account number to use: account - uniqueid - Unique channel identifier (Unitel/RSLCOM Event ID) + 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