From: Ivan Kohler Date: Sat, 12 Jan 2013 07:09:09 +0000 (-0800) Subject: start of tap3_12_export to generate GSM TAP3.12 tap-out file for partners, RT#20768 X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=commitdiff_plain;h=e722e522c695781f626adfdf36bf0d130698f665 start of tap3_12_export to generate GSM TAP3.12 tap-out file for partners, RT#20768 --- diff --git a/FS/FS/cdr/gsm_tap3_12.pm b/FS/FS/cdr/gsm_tap3_12.pm index 4d0917cd6..8f50690bd 100644 --- a/FS/FS/cdr/gsm_tap3_12.pm +++ b/FS/FS/cdr/gsm_tap3_12.pm @@ -29,7 +29,7 @@ use Data::Dumper; 'src' => sub { shift->{mobileOriginatedCall}{basicCallInformation}{chargeableSubscriber}{simChargeableSubscriber}{msisdn} }, 'charged_party_imsi' => sub { shift->{mobileOriginatedCall}{basicCallInformation}{chargeableSubscriber}{simChargeableSubscriber}{imsi} }, 'dst' => sub { shift->{mobileOriginatedCall}{basicCallInformation}{destination}{calledNumber} }, #dialledDigits? - 'carrierid' => sub { shift->{mobileOriginatedCall}{locationInformation}{networkLocation}{recEntityCode} }, + 'carrierid' => sub { shift->{mobileOriginatedCall}{locationInformation}{networkLocation}{recEntityCode} }, #XXX translate to recEntityId via info in header 'userfield' => sub { shift->{mobileOriginatedCall}{operatorSpecInformation}[0] }, 'servicecode' => sub { shift->{mobileOriginatedCall}{basicServiceUsedList}[0]{basicService}{serviceCode}{teleServiceCode} }, 'upstream_price' => sub { sprintf('%.5f', shift->{mobileOriginatedCall}{basicServiceUsedList}[0]{chargeInformationList}[0]{chargeDetailList}[0]{charge} / 100000 ) }, #XXX numberOfDecimalPlaces in header @@ -77,6 +77,7 @@ sub tap3_12_export { # batchControlInfo ### + #optional $hash{batchControlInfo}->{fileCreationTimeStamp} = { 'localTimeStamp' => time2str('%Y%m%d%H%M%S', $now), 'utcTimeOffset' => $utcTimeOffset, }; @@ -100,7 +101,7 @@ sub tap3_12_export { $hash{networkInfo}->{utcTimeOffsetInfo}[0]{utcTimeOffset} = $utcTimeOffset; - #XXX receiver entity IDs? why two? + #XXX recording entity IDs, referenced by recEntityCode #$hash->{networkInfo}->{recEntityInfo}[0]{recEntityId} = '340010100'; #$hash->{networkInfo}->{recEntityInfo}[1]{recEntityId} = '240556000000'; @@ -108,7 +109,10 @@ sub tap3_12_export { # auditControlInfo ### + #mandatory $hash{auditControlInfo}->{callEventDetailsCount} = scalar(@cdrs); + + #these two are optional $hash{auditControlInfo}->{earliestCallTimeStamp} = { 'localTimeStamp' => time2str('%Y%m%d%H%M%S', $cdrs[0]->calldate_unix), 'utcTimeOffset' => $utcTimeOffset, }; @@ -116,6 +120,7 @@ sub tap3_12_export { 'utcTimeOffset' => $utcTimeOffset, }; + #mandatory my $totalCharge = 0; $totalCharge += $_->rated_price foreach @cdrs; $hash{totalCharge} = sprintf('%.5f', $totalCharge); @@ -124,62 +129,233 @@ sub tap3_12_export { # callEventDetails ### + #one of Mobile Originated Call, Mobile Terminated Call, Mobile Session, Messaging Event, Supplementary Service Event, Service Centre Usage, GPRS Call, Content Transaction or Location Service + # Each occurrence must have no more than one of these present + $hash{callEventDetails} = [ map { - { + { #either tele or bearer service usage originated by the mobile subscription (others?) 'mobileOriginatedCall' => { + + #identifies the Network Location, which includes the MSC responsible for handling the call and, where appropriate, the Geographical Location of the mobile 'locationInformation' => { 'networkLocation' => { - 'recEntityCode' => $_->carrierid, #XXX 1 + 'recEntityCode' => $_->carrierid, #XXX Recording Entity (per 2.5, from "Reference Tables") } }, + + #Operator Specific Information: beyond the scope of TAP and has been bilaterally agreed 'operatorSpecInformation' => [ $_->userfield, ##'|Seq: 178 Loc: 1|' ], + + #The type of service used together with all related charging information 'basicServiceUsedList' => [ { + #identifies the actual Basic Service used 'basicService' => { + #one of Teleservice Code or Bearer Service Code as determined by the service type used 'serviceCode' => { + #XXX + #00 All teleservices + #10 All Speech transmission services + #11 Telephony + #12 Emergency calls + #20 All SMS Services + #21 Short Message MT/PP + #22 Short Message MO/PP + #60 All Fax Services + #61 Facsimile Group 3 & alternative speech + #62 Automatic Facsimile Group 3 + #63 Automatic Facsimile Group 4 + #70 All data teleservices (compound) + #80 All teleservices except SMS (compound) + #90 All voice group call services + #91 Voice group call + #92 Voice broadcast call 'teleServiceCode' => $_->servicecode, #'11' + + #Bearer Service Code + # Must be present within group Service Code where the type of service used + # was a bearer service. Must not be present when the type of service used + # was a tele service and, therefore, Teleservice Code is present. + # Group Bearer Codes, identifiable by the description ‘All’, should only + # be used where details of the specific services affected are not + # available from the network. + #00 All Bearer Services + #20 All Data Circuit Asynchronous Services + #21 Duplex Asynch. 300bps data circuit + #22 Duplex Asynch. 1200bps data circuit + #23 Duplex Asynch. 1200/75bps data circuit + #24 Duplex Asynch. 2400bps data circuit + #25 Duplex Asynch. 4800bps data circuit + #26 Duplex Asynch. 9600bps data circuit + #27 General Data Circuit Asynchronous Service + #30 All Data Circuit Synchronous Services + #32 Duplex Synch. 1200bps data circuit + #34 Duplex Synch. 2400bps data circuit + #35 Duplex Synch. 4800bps data circuit + #36 Duplex Synch. 9600bps data circuit + #37 General Data Circuit Synchronous Service + #40 All Dedicated PAD Access Services + #41 Duplex Asynch. 300bps PAD access + #42 Duplex Asynch. 1200bps PAD access + #43 Duplex Asynch. 1200/75bps PAD access + #44 Duplex Asynch. 2400bps PAD access + #45 Duplex Asynch. 4800bps PAD access + #46 Duplex Asynch. 9600bps PAD access + #47 General PAD Access Service + #50 All Dedicated Packet Access Services + #54 Duplex Synch. 2400bps PAD access + #55 Duplex Synch. 4800bps PAD access + #56 Duplex Synch. 9600bps PAD access + #57 General Packet Access Service + #60 All Alternat Speech/Asynchronous Services + #70 All Alternate Speech/Synchronous Services + #80 All Speech followed by Data Asynchronous Services + #90 All Speech followed by Data Synchronous Services + #A0 All Data Circuit Asynchronous Services (compound) + #B0 All Data Circuit Synchronous Services (compound) + #C0 All Asynchronous Services (compound) } + #conditionally also contain the following for UMTS: Transparency Indicator, Fixed Network User + # Rate, User Protocol Indicator, Guaranteed Bit Rate and Maximum Bit Rate }, + + #Charge information is provided for all chargeable elements except within Messaging Event and Mobile Session call events + # must contain Charged Item and at least one occurrence of Charge Detail 'chargeInformationList' => [ { + #XXX + #mandatory + # the charging principle applied and the unitisation of Chargeable Units. It + # is not intended to identify the service used. + #A: Call set up attempt + #C: Content + #D: Duration based charge + #E: Event based charge + #F: Fixed (one-off) charge + #L: Calendar (for example daily usage charge) + #V: Volume (outgoing) based charge + #W: Volume (incoming) based charge + #X: Volume (total volume) based charge + #(?? fields to be used as a basis for the calculation of the correct Charge + # A: Chargeable Units (if present) + # D,V,W,X: Chargeable Units + # C: Depends on the content + # E: Not Applicable + # F: Not Applicable + # L: Call Event Start Timestamp) + 'chargedItem' => 'D', + + # the IOT used by the VPMN to price the call 'callTypeGroup' => { + + #The highest category call type in respect of the destination of the call + #0: Unknown/Not Applicable + #1: National + #2: International + #10: HGGSN/HP-GW + #11: VGGSN/VP-GW + #12: Other GGSN/Other P-GW + #100: WLAN 'callTypeLevel1' => $_->calltypenum, + + #the sub category of Call Type Level 1 + #0: Unknown/Not Applicable + #1: Mobile + #2: PSTN + #3: Non Geographic + #4: Premium Rate + #5: Satellite destination + #6: Forwarded call + #7: Non forwarded call + #10: Broadband + #11: Narrowband + #12: Conversational + #13: Streaming + #14: Interactive + #15: Background + 'callTypeLevel2' => 0, + + #the sub category of Call Type Level 2 'callTypeLevel3' => 0, - 'callTypeLevel2' => 0 }, + + #mandatory, at least one occurence must be present + #A repeating group detailing the Charge and/or charge element + # Note that, where a Charge has been levied, even where that Charge is zero, + # there must be one occurance, and only one, with a Charge Type of '00' 'chargeDetailList' => [ { + #mandatory + # after discounts have been deducted but before any tax is added 'charge' => $_->rated_price * 100000, #XXX numberOfDecimalPlaces + + #mandatory + # the type of charge represented + #00: Total charge for Charge Information (the invoiceable value) + #01: Airtime charge + #02: reserved + #03: Toll charge + #04: Directory assistance + #05–20: reserved + #21: VPMN surcharge + #50: Total charge for Charge Information according to the published IOT + # Note that the use of value 50 is only for use by bilateral agreement, use without + # bilateral agreement can be treated as per reserved values, that is ‘out of range’ + #69–99: reserved 'chargeType' => '00', + + #conditional + # the number of units which are chargeable within the Charge Detail, this may not + # correspond to the number of rounded units charged. + # The item Charged Item defines what the units represent. 'chargeableUnits' => $_->quantity_able, + + #optional + # the rounded number of units which are actually charged for 'chargedUnits' => $_->quantity, } ], - 'chargedItem' => 'D', #XXX or E? what's this do? - 'exchangeRateCode' => 1 + 'exchangeRateCode' => 1, #from header } ] } ], + + #MO Basic Call Information provides the basic detail of who made the call and where to in respect of mobile originated traffic. 'basicCallInformation' => { - 'totalCallEventDuration' => $_->duration, - 'destination' => { - 'calledNumber' => $_->dst, - #XXX 'dialledDigits' => '322221350' - }, - 'callEventStartTimeStamp' => { - 'localTimeStamp' => time2str('%Y%m%d%H%M%S', $_->startdate), - 'utcTimeOffsetCode' => 1 - }, + #mandatory + # the identification of the chargeable subscriber. + # The group must contain either the IMSI or the MIN of the Chargeable Subscriber, but not both. 'chargeableSubscriber' => { 'simChargeableSubscriber' => { - 'msisdn' => $_->charged_pary, #src + 'msisdn' => $_->charged_party, #src 'imsi' => $_->charged_party_imsi, } - } + }, + # the start of the call event + 'callEventStartTimeStamp' => { + 'localTimeStamp' => time2str('%Y%m%d%H%M%S', $_->startdate), + 'utcTimeOffsetCode' => 1 + }, + + # the actual total duration of a call event as a number of seconds + 'totalCallEventDuration' => $_->duration, + + #conditional + # the number dialled by the subscriber (Called Number) + # or the SMSC Address in case of SMS usage or in cases involving supplementary services + # such as call forwarding or transfer etc., the number to which the call is routed + 'destination' => { + #the international representation of the destination + 'calledNumber' => $_->dst, + + #the actual digits as dialled by the subscriber, i.e. unmodified, in establishing a call + # This will contain ‘+’ and ‘#’ where appropriate. + #'dialledDigits' => '322221350' + }, } } }; @@ -199,6 +375,8 @@ sub tap3_12_export { sub _TransferBatch { 'accountingInfo' => { + #mandatory + 'localCurrency' => 'USD', 'currencyConversionInfo' => [ { 'numberOfDecimalPlaces' => 5, @@ -207,43 +385,59 @@ sub _TransferBatch { } ], 'tapDecimalPlaces' => 5, - 'localCurrency' => 'USD' + #optional: may conditionally include taxation and discounting tables, and, optionally, TAP currency }, 'batchControlInfo' => { + #mandatory 'specificationVersionNumber' => 3, 'releaseVersionNumber' => 12, #11? + + #'sender' => 'MDGTM', + #'recipient' => 'GNQHT', + #'fileSequenceNumber' => '00178', + #'transferCutOffTimeStamp' => { # 'localTimeStamp' => '20121230050222', # 'utcTimeOffset' => '+0300' # }, - 'operatorSpecInformation' => [ - '', # XXX '|File proc MTH LUXMA: 1285348027|' - ], - #'recipient' => 'GNQHT', - #'fileCreationTimeStamp' => { - # 'localTimeStamp' => '20121230050222', - # 'utcTimeOffset' => '+0300' - # }, - #'sender' => 'MDGTM', - #'fileSequenceNumber' => '00178', #'fileAvailableTimeStamp' => { # 'localTimeStamp' => '20121230035052', # 'utcTimeOffset' => '+0100' # } + + #optional + #'fileCreationTimeStamp' => { + # 'localTimeStamp' => '20121230050222', + # 'utcTimeOffset' => '+0300' + # }, + + #optional: file type indicator which will only be present where the file represents test data + #optional: RAP File Sequence Number (used where the batch has previously been returned with a fatal error and is now being resubmitted) (not fileSequenceNumber?) + + #optional: beyond the scope of TAP and has been bilaterally agreed + 'operatorSpecInformation' => [ + '', # XXX '|File proc MTH LUXMA: 1285348027|' Operator Specific Information + ], + + }, + + #Network Information is a group of related information which pertains to the Sender PMN 'networkInfo' => { + #must be present where Recording Entity Codes are present within the TAP file 'recEntityInfo' => [ { - 'recEntityType' => 1, + 'recEntityType' => 1, #MSC #'recEntityId' => '340010100', 'recEntityCode' => 1 }, { - 'recEntityType' => 2, + 'recEntityType' => 2, #SMSC #'recEntityId' => '240556000000', 'recEntityCode' => 2 - } + }, ], + #mandatory 'utcTimeOffsetInfo' => [ { 'utcTimeOffset' => '+0300', @@ -252,18 +446,20 @@ sub _TransferBatch { ] }, 'auditControlInfo' => { - #'callEventDetailsCount' => 4, - 'totalTaxValue' => 0, + #'callEventDetailsCount' => 4, #mandatory + 'totalTaxValue' => 0, #mandatory + 'totalDiscountValue' => 0, #mandatory + #'totalCharge' => 50474, #mandatory + + #these two are optional #'earliestCallTimeStamp' => { # 'localTimeStamp' => '20121229102501', # 'utcTimeOffset' => '+0300' # }, - 'totalDiscountValue' => 0, - #'totalCharge' => 50474, - #'latestCallTimeStamp' => { - # 'localTimeStamp' => '20121229102807', - # 'utcTimeOffset' => '+0300' - # } + #'latestCallTimeStamp' => { + # 'localTimeStamp' => '20121229102807', + # 'utcTimeOffset' => '+0300' + # } }, }