summaryrefslogtreecommitdiff
path: root/FS
diff options
context:
space:
mode:
authorIvan Kohler <ivan@freeside.biz>2013-01-11 23:09:09 -0800
committerIvan Kohler <ivan@freeside.biz>2013-01-11 23:09:09 -0800
commite722e522c695781f626adfdf36bf0d130698f665 (patch)
tree6acc32e80a6d8499ea36fd887d37b88e69daf55e /FS
parent66eaa4a82b7fc52e711ecdefc95feedf629f71b1 (diff)
start of tap3_12_export to generate GSM TAP3.12 tap-out file for partners, RT#20768
Diffstat (limited to 'FS')
-rw-r--r--FS/FS/cdr/gsm_tap3_12.pm276
1 files changed, 236 insertions, 40 deletions
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'
+ # }
},
}