[freeside-commits] freeside/FS/FS/cdr asterisk.pm, NONE, 1.1 genband_meetme.pm, NONE, 1.1 genband.pm, NONE, 1.1 nt.pm, NONE, 1.1 openser.pm, NONE, 1.1 simple.pm, NONE, 1.1 taqua.pm, NONE, 1.1 unitel.pm, NONE, 1.1

Ivan,,, ivan at wavetail.420.am
Thu Jul 17 16:55:40 PDT 2008


Update of /home/cvs/cvsroot/freeside/FS/FS/cdr
In directory wavetail.420.am:/tmp/cvs-serv11911/cdr

Added Files:
	asterisk.pm genband_meetme.pm genband.pm nt.pm openser.pm 
	simple.pm taqua.pm unitel.pm 
Log Message:
CDR updates; modularize CDR import formats; add formats for OpenSER, Genband/Tekelec, and "NT"

--- NEW FILE: genband.pm ---
package FS::cdr::genband;

use vars qw(@ISA %info);
use FS::cdr qw(_cdr_date_parser_maker);

@ISA = qw(FS::cdr);

%info = (
  'name'          => 'GenBand (Tekelec)', #'Genband G6 (Tekelec T6000)',
  'weight'        => 140,
  'type'          => 'fixedlength',
  'fixedlength_format' => [qw(
    Type:2:1:2
    Sequence:4:3:6
    OIDCall:30:7:36
    StartTime:19:37:55
    AnswerTime:19:56:74
    EndTime:19:75:93
    SourceName:30:94:123
    SourceEndName:30:124:153
    SourceCallerID:20:154:173
    SourceCallerName:30:174:203
    DestinationName:30:204:233
    DestinationEndName:30:234:263
    DestCallerID:20:264:283
    DestCallerIDInfo:30:284:313
    DialedDigits:30:314:343
    Billing:30:344:373
    AuthCode:30:374:403
    CallDirection:1:404:404
    ExtendedCall:1:405:405
    ExternalCall:1:406:406
    Duration:9:407:415
    SIPCallID:64:416:479
    IncomingDigits:30:480:509
    OutpulsedDigits:30:510:539
    CarrierIdentificationCode:4:540:543
    CompletionReason:4:544:547
    OriginationPartition:30:548:577
    DestinationPartition:30:578:607
    BilledSourceDID:20:608:628
    VideoCall:1:629:630
  )],
  'import_fields' => [
    sub {}, #Type:2:1:2
    sub {}, #Sequence:4:3:6
    'uniqueid', #OIDCall:30:7:36
    _cdr_date_parser_maker('startdate'), #StartTime:19:37:55
    _cdr_date_parser_maker('answerdate'), #AnswerTime:19:56:74
    _cdr_date_parser_maker('enddate'), #EndTime:19:75:93
    #SourceName:30:94:123
    'channel', #SourceEndName:30:124:153
    'src', #SourceCallerID:20:154:173
    'clid', #SourceCallerName:30:174:203
    #DestinationName:30:204:233
    'dstchannel', #DestinationEndName:30:234:263
    'dst', #DestCallerID:20:264:283
    #DestCallerIDInfo:30:284:313
    #DialedDigits:30:314:343
    #Billing:30:344:373
    #AuthCode:30:374:403
    #CallDirection:1:404:404
    #ExtendedCall:1:405:405
    #ExternalCall:1:406:406
    'duration', #Duration:9:407:415
    #SIPCallID:64:416:479
    #IncomingDigits:30:480:509
    #OutpulsedDigits:30:510:539
    #CarrierIdentificationCode:4:540:543
    #CompletionReason:4:544:547
    #OriginationPartition:30:548:577
    #DestinationPartition:30:578:607
    #BilledSourceDID:20:608:628
    #VideoCall:1:629:630
  ],
);
#      acctid - primary key
#       calldate - Call timestamp (SQL timestamp)
#              clid - Caller*ID with text
#              src - Caller*ID number / Source number
#              dst - Destination extension
#       dcontext - Destination context
#              channel - Channel used
#              dstchannel - Destination channel if appropriate
#       lastapp - Last application if appropriate
#       lastdata - Last application data
#              startdate - Start of call (UNIX-style integer timestamp)
#              answerdate - Answer time of call (UNIX-style integer timestamp)
#              enddate - End time of call (UNIX-style integer timestamp)
#              duration - Total time in system, in seconds
#       billsec - Total time call is up, in seconds
#       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.
#       accountcode - CDR account number to use: account
#              uniqueid - Unique channel identifier (Unitel/RSLCOM Event ID)
#       userfield - CDR user-defined field
#       cdr_type - CDR type - see FS::cdr_type (Usage = 1, S&E = 7, OC&C = 8)
#       charged_party - Service number to be billed
#       upstream_currency - Wholesale currency from upstream
#       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
#       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;

--- NEW FILE: asterisk.pm ---
package FS::cdr::asterisk;

use vars qw(@ISA %info);
use FS::cdr qw(_cdr_date_parser_maker);

@ISA = qw(FS::cdr);

#http://www.the-asterisk-book.com/unstable/funktionen-cdr.html
my %amaflags = (
  DEFAULT       => 0,
  OMIT          => 1, #asterisk 1.4+
  IGNORE        => 1, #asterisk 1.2
  BILLING       => 2, #asterisk 1.4+
  BILL          => 2, #asterisk 1.2
  DOCUMENTATION => 3,
  #? '' => 0,
);

%info = (
  'name'          => 'Asterisk',
  'weight'        => 10,
  'import_fields' => [
    'accountcode',
    'src',
    'dst',
    'dcontext',
    'clid',
    'channel',
    'dstchannel',
    'lastapp',
    'lastdata',
    _cdr_date_parser_maker('startdate'),
    _cdr_date_parser_maker('answerdate'),
    _cdr_date_parser_maker('enddate'),
    'duration',
    'billsec',
    'disposition',
    sub { my($cdr, $amaflags) = @_; $cdr->amaflags($amaflags{$amaflags}); },
    'uniqueid',
    'userfield',
  ],
);

1;

--- NEW FILE: unitel.pm ---
package FS::cdr::unitel;

use vars qw(@ISA %info);
use FS::cdr;

@ISA = qw(FS::cdr);

%info = (
  'name'          => 'Unitel/RSLCOM',
  'weight'        => 500,
  'import_fields' => [
    'uniqueid',
    #'cdr_type',
    'cdrtypenum',
    'calldate', # may need massaging?  huh maybe not...
    #'billsec', #XXX duration and billsec?
                sub { $_[0]->billsec(  $_[1] );
                      $_[0]->duration( $_[1] );
                    },
    'src',
    'dst', # XXX needs to have "+61" prepended unless /^\+/ ???
    'charged_party',
    'upstream_currency',
    'upstream_price',
    'upstream_rateplanid',
    'distance',
    'islocal',
    'calltypenum',
    'startdate',  #XXX needs massaging
    'enddate',    #XXX same
    'description',
    'quantity',
    'carrierid',
    'upstream_rateid',
  ]
);

1;

--- NEW FILE: nt.pm ---
package FS::cdr::nt;

use vars qw(@ISA %info);
use FS::cdr qw(_cdr_date_parser_maker);

@ISA = qw(FS::cdr);

%info = (
  'name'          => 'NT', #XXX name???
  'weight'        => 200,
  'header'        => 1,
  'import_fields' => [
    'userfield',  #CallZoneData ???userfield
    'channel',    #OrigGw
    'dstchannel', #TermGw
    'duration',   #Duration
    'dst',        #CallDTMF
    'src',        #Ani
    'startdate',  #DateTimeInt
  ],
);

1;

--- NEW FILE: simple.pm ---
package FS::cdr::simple;

use vars qw(@ISA %info);
use FS::cdr;

@ISA = qw(FS::cdr);

%info = (
  'name'          => 'Simple',
  'weight'        => 20,
  'header'        => 1,
  'import_fields' => [

    # Date
    sub { my($cdr, $date) = @_;
          $date =~ /^(\d{1,2})\/(\d{1,2})\/(\d\d(\d\d)?)$/
            or die "unparsable date: $date"; #maybe we shouldn't die...
          #$cdr->startdate( timelocal(0, 0, 0 ,$2, $1-1, $3) );
          ($tmp_mday, $tmp_mon, $tmp_year) = ( $2, $1-1, $3 );
        },

    # Time
    sub { my($cdr, $time) = @_;
          #my($sec, $min, $hour, $mday, $mon, $year)= localtime($cdr->startdate);
          $time =~ /^(\d{1,2}):(\d{1,2}):(\d{1,2})$/
            or die "unparsable time: $time"; #maybe we shouldn't die...
          #$cdr->startdate( timelocal($3, $2, $1 ,$mday, $mon, $year) );
          $cdr->startdate(
            timelocal($3, $2, $1 ,$tmp_mday, $tmp_mon, $tmp_year)
          );
        },

    # Source_Number
    'src',

    # Terminating_Number
    'dst',

    # Duration
    sub { my($cdr, $min) = @_;
          my $sec = sprintf('%.0f', $min * 60 );
          $cdr->billsec(  $sec );
          $cdr->duration( $sec );
        },

  ],
);

1;

--- NEW FILE: openser.pm ---
package FS::cdr::openser;

use vars qw(@ISA %info);
use FS::cdr qw(_cdr_date_parser_maker);

@ISA = qw(FS::cdr);

%info = (
  'name'          => 'OpenSER',
  'weight'        => 15,
  'header'        => 1,
  'import_fields' => [
    _cdr_date_parser_maker('startdate'),
    _cdr_date_parser_maker('enddate'),
    'src',
    'dst',
    'duration',
    'channel',
    'dstchannel',
  ],
);

1;

--- NEW FILE: taqua.pm ---
package FS::cdr::taqua;

use vars qw(@ISA %info);
use FS::cdr qw(_cdr_date_parser_maker);

@ISA = qw(FS::cdr);

%info = (
  'name'          => 'Taqua',
  'weight'        => 130,
  'header'        => 1,
  'import_fields' => [  #some of these are kind arbitrary...
    sub { my($cdr, $field) = @_; },       #XXX interesting RecordType
             # easy to fix: Can't find cdr.cdrtypenum 1 in cdr_type.cdrtypenum

    sub { my($cdr, $field) = @_; },             #all10#RecordVersion
    sub { my($cdr, $field) = @_; },       #OrigShelfNumber
    sub { my($cdr, $field) = @_; },       #OrigCardNumber
    sub { my($cdr, $field) = @_; },       #OrigCircuit
    sub { my($cdr, $field) = @_; },       #OrigCircuitType
    'uniqueid',                           #SequenceNumber
    'accountcode',                        #SessionNumber
    'src',                                #CallingPartyNumber
    'dst',                                #CalledPartyNumber
    _cdr_date_parser_maker('startdate'),  #CallArrivalTime
    _cdr_date_parser_maker('enddate'),    #CallCompletionTime

    #Disposition
    #sub { my($cdr, $d ) = @_; $cdr->disposition( $disposition{$d}): },
    'disposition',
                                          #  -1 => '',
                                          #   0 => '',
                                          # 100 => '',
                                          # 101 => '',
                                          # 102 => '',
                                          # 103 => '',
                                          # 104 => '',
                                          # 105 => '',
                                          # 201 => '',
                                          # 203 => '',

    _cdr_date_parser_maker('answerdate'), #DispositionTime
    sub { my($cdr, $field) = @_; },       #TCAP
    sub { my($cdr, $field) = @_; },       #OutboundCarrierConnectTime
    sub { my($cdr, $field) = @_; },       #OutboundCarrierDisconnectTime

    #TermTrunkGroup
    #it appears channels are actually part of trunk groups, but this data
    #is interesting and we need a source and destination place to put it
    'dstchannel',                         #TermTrunkGroup


    sub { my($cdr, $field) = @_; },       #TermShelfNumber
    sub { my($cdr, $field) = @_; },       #TermCardNumber
    sub { my($cdr, $field) = @_; },       #TermCircuit
    sub { my($cdr, $field) = @_; },       #TermCircuitType
    sub { my($cdr, $field) = @_; },       #OutboundCarrierId
    'charged_party',                      #BillingNumber
    sub { my($cdr, $field) = @_; },       #SubscriberNumber
    'lastapp',                            #ServiceName
    sub { my($cdr, $field) = @_; },       #some weirdness #ChargeTime
    'lastdata',                           #ServiceInformation
    sub { my($cdr, $field) = @_; },       #FacilityInfo
    sub { my($cdr, $field) = @_; },             #all 1900-01-01 0#CallTraceTime
    sub { my($cdr, $field) = @_; },             #all-1#UniqueIndicator
    sub { my($cdr, $field) = @_; },             #all-1#PresentationIndicator
    sub { my($cdr, $field) = @_; },             #empty#Pin
    sub { my($cdr, $field) = @_; },       #CallType
    sub { my($cdr, $field) = @_; },           #Balt/empty #OrigRateCenter
    sub { my($cdr, $field) = @_; },           #Balt/empty #TermRateCenter

    #OrigTrunkGroup
    #it appears channels are actually part of trunk groups, but this data
    #is interesting and we need a source and destination place to put it
    'channel',                            #OrigTrunkGroup

    'userfield',                                #empty#UserDefined
    sub { my($cdr, $field) = @_; },             #empty#PseudoDestinationNumber
    sub { my($cdr, $field) = @_; },             #all-1#PseudoCarrierCode
    sub { my($cdr, $field) = @_; },             #empty#PseudoANI
    sub { my($cdr, $field) = @_; },             #all-1#PseudoFacilityInfo
    sub { my($cdr, $field) = @_; },       #OrigDialedDigits
    sub { my($cdr, $field) = @_; },             #all-1#OrigOutboundCarrier
    sub { my($cdr, $field) = @_; },       #IncomingCarrierID
    'dcontext',                           #JurisdictionInfo
    sub { my($cdr, $field) = @_; },       #OrigDestDigits
    sub { my($cdr, $field) = @_; },       #huh?#InsertTime
    sub { my($cdr, $field) = @_; },       #key
    sub { my($cdr, $field) = @_; },             #empty#AMALineNumber
    sub { my($cdr, $field) = @_; },             #empty#AMAslpID
    sub { my($cdr, $field) = @_; },             #empty#AMADigitsDialedWC
    sub { my($cdr, $field) = @_; },       #OpxOffHook
    sub { my($cdr, $field) = @_; },       #OpxOnHook

        #acctid - primary key
  #AUTO #calldate - Call timestamp (SQL timestamp)
#clid - Caller*ID with text
        #XXX src - Caller*ID number / Source number
        #XXX dst - Destination extension
        #dcontext - Destination context
        #channel - Channel used
        #dstchannel - Destination channel if appropriate
        #lastapp - Last application if appropriate
        #lastdata - Last application data
        #startdate - Start of call (UNIX-style integer timestamp)
        #answerdate - Answer time of call (UNIX-style integer timestamp)
        #enddate - End time of call (UNIX-style integer timestamp)
  #HACK#duration - Total time in system, in seconds
  #HACK#XXX billsec - Total time call is up, in seconds
        #disposition - What happened to the call: ANSWERED, NO ANSWER, BUSY
#INT amaflags - What flags to use: BILL, IGNORE etc, specified on a per channel basis like accountcode.
        #accountcode - CDR account number to use: account

        #uniqueid - Unique channel identifier (Unitel/RSLCOM Event ID)
        #userfield - CDR user-defined field

        #X cdrtypenum - CDR type - see FS::cdr_type (Usage = 1, S&E = 7, OC&C = 8)
        #XXX charged_party - Service number to be billed
#upstream_currency - Wholesale currency from upstream
#X 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
#calltypenum - Type of call - see FS::cdr_calltype
#X 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;

--- NEW FILE: genband_meetme.pm ---
package FS::cdr::genband_meetme;

use vars qw(@ISA %info);
use FS::cdr qw(_cdr_date_parser_maker);

@ISA = qw(FS::cdr);

%info = (
  'name'          => 'Genband (Tekelec) Meet-Me Conference', #'Genband G6 (Tekelec T6000) Meet-Me Conference Log Records',
  'weight'        => 145,
  'disabled'      => 1,
  'import_fields' => [
  ],
);

1;



More information about the freeside-commits mailing list