This chapter describes the steps necessary to rate calls and export rated CDRs (call detail records) to external systems.
Service billing on the NGCP is based on billing profiles, which may be assigned to customers and SIP peerings. The design focuses on a simple, yet flexible approach, to support arbitrary dial-plans without introducing administrative overhead for the system administrators. The billing profiles may define a base fee and free time or free money per billing interval. Unused free time or money automatically expires at the end of the billing interval.
Each profile may have call destinations (usually based on E.164 number prefix matching) with configurable fees attached. Call destination fees each support individual intervals and rates, with a different duration and/or rate for the first interval. (e.g.: charge the first minute when the call is opened, then every 30 seconds, or make it independent of the duration at all) It is also possible to specify different durations and/or rates for peak and off-peak hours. Peak time may be specified based on weekdays, with additional support for manually managed dates based on calendar days. The call destinations can finally be grouped for an overview on user’s invoices by specifying a zone in two detail levels. (E.g.: national landline, national mobile, foreign 1, foreign 2, etc.)
The first step when setting up billing data is to create a billing profile, which will be the container for all other billing related data. Go to Settings→Billing and click on Create Billing Profile.
The fields Reseller, Handle and Name are mandatory.
Each Billing Profile holds multiple Billing Fees.
To set up billing fees, click on the Fees button of the billing profile you want to configure. Billing fees may be uploaded using a configurable CSV file format, or entered directly via the web interface by clicking Create Fee Entry. To configure the CSV field order for the file upload, rearrange the entries in the www_admin→fees_csv→element_order array in /etc/ngcp-config/config.yml and execute the command ngcpcfg apply changed fees element order
. The following is an example of working CSV file to upload (pay attention to double quotes):
".","^1",out,"EU","ZONE EU",5.37,60,5.37,60,5.37,60,5.37,60,0,0 "^01.+$","^02145.+$",out,"AT","ZONE Test",0.06250,1,0.06250,1,0.01755,1,0.01733,1,0
For input via the web interface, just fill in the text fields accordingly.
In both cases, the following information may be specified independently for every destination:
foreign zone 1
)
^.*@sip\.example\.org$
or ^someone@sip\.sipwise\.com$
or just .
to match everything). If you leave this field empty, the default pattern .
matching everything will be set implicitly. Internally, this pattern will be matched against the <source_cli>@<source_domain>
fields of the CDR.
someone@sip\.example\.org
or ^43
). This field must be set.
Outbound
for standard origination fees (applies to callers placing a call and getting billed for that) or Inbound
for termination fees (applies to callees if you want to charge them for receiving various calls, e.g. for 800-numbers). If in doubt, use Outbound. If you upload fees via CSV files, use out
or in
, respectively.
important | |
The {source, destination, direction} combination needs to be unique for a billing profile. The system will return an error if such a set is specified twice, both for the file upload and the input via the web interface. |
important | |
There are several internal services (vsc, conference, voicebox) which will need a specific destination entry with a domain-based destination. If you don’t want to charge the same (or nothing) for those services, add a fee for destination |
To be able to differentiate between on-peak and off-peak calls, the platform stores off-peak times for every billing profile based on weekdays and/or calendar days. To edit the settings for a billing profile, go to Settings→Billing and press the Off-Peaktimes button on the billing profile you want to configure.
To set off-peak times for a weekday, click on Edit next to the according weekday. You will be presented with two input fields which both receive a timestamp in the form of hh:mm:ss specifying a time of day for the start and end of the off-peak period. If any of the fields is left empty, the system will automatically insert 00:00:00
(start field) or 23:59:59 (end field). Click on Add to store the setting in the database. You may create more than one off-peak period per weekday. To delete a range, just click Delete next to the entry. Click the close icon when done.
To specify off-peak ranges based on calendar dates, click on Create Special Off-Peak Date. Enter a date in the form of YYYY-MM-DD hh:mm:ss into the Start Date/Time input field and End Date/Time input field to define a range for the off-peak period.
The NGCP supports a fraud detection feature, which is designed to detect accounts causing unusually high customer costs, and then to perform one of several actions upon those accounts. This feature can be enabled and configured through two sets of billing profile options described in Section 9.1.1, “Creating Billing Profiles”, namely the monthly (fraud monthly limit, fraud monthly lock and fraud monthly notify) and daily limits (fraud daily limit, fraud daily lock and fraud daily notify). Either monthly/daily limits or both of them can be active at the same time.
Monthly fraud limit check runs once a day, shortly after midnight local time and daily fraud limit check runs every 30min. A background script (managed by cron daemon) automatically checks all accounts which are linked to a billing profile enabled for fraud detection, and selects those which have caused a higher cost than the fraud monthly limit configured in the billing profile, within the currently active billing interval (e.g. in the current month), or a higher cost than the fraud daily limit configured in the billing profile, within the calendar day. It then proceeds to perform at least one of the following actions on those accounts:
Fraud lock levels are various protection (and notification) settings that are applied to subscribers of a Customer, if fraud detection is enabled in the currently active billing profile and the Customer’s daily or monthly fraud limit has been exceeded.
The following lock levels are available:
none
: no account locking will happen
foreign calls
: only calls within the subscriber’s own domain, and emergency
calls, are allowed
all outgoing calls
: subscribers of the customer cannot place any calls, except
calls to free and emergency destinations
incoming and outgoing
: subscribers of the customer cannot place and receive
any calls, except calls to free and emergency destinations
global
: same restrictions as at incoming and outgoing
level, additionally
subscribers are not allowed to access the Customer Self Care (CSC) interface
ported
: only automatic call forwarding, due to number porting, is allowed
important | |
You can override fraud detection and locking settings of a billing profile on a per-account basis via REST API or the Admin interface. |
caution | |
Accounts that were automatically locked by the fraud detection feature will not be automatically unlocked when the next billing interval starts. This has to be done manually through the administration panel or through the provisioning interface. |
important | |
If fraud detection is configured to only send an email and not lock the affected accounts, it will continue to do so for over-limit accounts every day. The accounts must either be locked in order to stop the emails (only currently active accounts are considered when the script looks for over-limit accounts) or some other action to resolve the conflict must be taken, such as disabling fraud detection for those accounts. |
info | |
It is possible to fetch the list of fraud events and thus get fraud status
of Customers by using the REST API and referring to the resource: |
Regular billing data export is done using CSV (comma separated values) files which may be downloaded from the platform using the cdrexport user which has been created during the installation.
There are two types of exports. One is CDR (Call Detail Records) used to charge for calls made by subscribers, and the other is EDR (Event Detail Records) used to charge for provisioning events like enabling certain features.
Billing records contain fields that hold data of various entities that play a role in the phone service offered by Sipwise NGCP. For a better understanding of billing data please refer to the glossary provided here:
In order to be able to easily identify billing files, the file names are constructed by the following fixed-length fields:
<prefix><separator><version><separator><timestamp><separator><sequence number><suffix>
The definition of the specific fields is as follows:
Table 8. CDR/EDR export file name format
File name element | Length | Description |
---|---|---|
| 7 | A fixed string. Always |
| 1 | A fixed character. Always |
| 3 | The format version, a three digit number. Currently |
| 14 | The file creation timestamp in the format |
| 10 | A unique 10-digit zero-padded sequence number for quick identification. |
| 4 | A fixed string. Always |
A valid example filename for a CDR billing file created at 2012-03-10 14:30:00 and being the 42nd file exported by the system, is:
sipwise_007_20130310143000_0000000042.cdr
Each billing file consists of three parts: one header line, zero to 5000 body lines and one trailer line.
The billing file header is one single line, which is constructed by the following fields:
<version>,<number of records>
The definition of the specific fields is as follows:
Table 9. CDR/EDR export file header line format
Body Element | Length | Type | Description |
---|---|---|---|
| 3 | zero-padded uint | The format version. Currently |
| 4 | zero-padded uint | The number of body lines contained in the file. |
A valid example for a Header is:
007,0738
The body of a CDR consists of a minimum of zero and a default maximum of 5000 lines.
The platform operator can configure the maximum number of lines kept in a file
by updating the cdrexport.max_rows_per_file
parameter in /etc/ngcp-config/config.yml
file. Each line holds one call detail record in CSV format and is constructed by
a configurable set of fields, all of them enclosed in single quotes.
The following table defines the default set of fields that are inserted into the
CDR file, for exports related to system scope. The list of fields is defined in
/etc/ngcp-config/config.yml
file, cdrexport.admin_export_fields
parameter.
Table 10. Default set of system CDR fields
Body Element | Length | Type | Description |
---|---|---|---|
| 1-10 | uint | Internal CDR ID. |
| 19 | timestamp | Timestamp of last modification, including date and time (with seconds precision). |
| 36 | string | Internal UUID of calling party subscriber. Value is |
| 0-255 | string | Internal ID of the contract of calling party provider (i.e. reseller or peer). |
| 0-255 | string | External, arbitrary ID of calling party subscriber. (A string value shown as "External ID" property of an NGCP subscriber.) |
| 1-11 | uint | Internal ID of calling party subscriber. Value is |
| 0-255 | string | External, arbitrary ID of calling party customer. (A string value shown as "External ID" property of an NGCP customer/peer.) |
| 1-11 | uint | Internal ID of calling party customer. |
| 0-255 | string | SIP username of calling party. |
| 0-255 | string | SIP domain of calling party. |
| 0-64 | string | CLI of calling party in E.164 format. |
| 1 | uint |
|
| 0-64 | string | IP Address of the calling party. |
| 36 | string | Internal UUID of called party subscriber. Value is |
| 0-255 | string | Internal ID of the contract of called party provider (i.e. reseller or peer). |
| 0-255 | string | External, arbitrary ID of called party subscriber. (A string value shown as "External ID" property of an NGCP subscriber.) |
| 1-11 | uint | Internal ID of called party subscriber. Value is |
| 0-255 | string | External, arbitrary ID of called party customer. (A string value shown as "External ID" property of an NGCP customer/peer.) |
| 1-11 | uint | Internal ID of called party customer. |
| 0-255 | string | Final SIP username of called party. |
| 0-255 | string | Final SIP domain of called party. |
| 0-255 | string | Incoming SIP username of called party, after applying inbound rewrite rules. |
| 0-255 | string | Incoming SIP domain of called party, after applying inbound rewrite rules. |
| 0-255 | string | The user-part of the SIP Request URI as received by NGCP. |
| 0-255 | string | Username used to authenticate towards peer. |
| 0-255 | string | Realm used to authenticate towards peer. |
| 3-4 | string | The type of the call - one of:
|
| 2-8 | string | The final call status - one of:
|
| 3 | string | The final SIP status code. |
| 23 | timestamp | Timestamp of call initiation (SIP INVITE received from calling party). Includes date, time with milliseconds (3 decimals). |
| 23 | timestamp | Timestamp of call establishment (final SIP response received from called party). Includes date, time with milliseconds (3 decimals). |
| 4-13 | fixed precision (3 decimals) | Length of call (calculated from |
| 0-255 | string | The SIP Call-ID. |
| 2-7 | string | The internal rating status of the CDR - one of:
Currently always |
| 0-19 | datetime | Time of rating, including date and time (with seconds precision). Empty if CDR is not rated. |
| 7-14 | fixed precision (6 decimals) | The originating carrier cost that the carrier (i.e. SIP peer) charges for the calls routed to his network, or empty if CDR is not rated. PLEASE NOTE: Only available in system exports, not for resellers. |
| 7-14 | fixed precision (6 decimals) | The originating customer cost, or empty if CDR is not rated. |
| 0-127 | string | Name of the originating carrier billing zone, or PLEASE NOTE: Only available in system exports, not for resellers. |
| 0-127 | string | Name of the originating customer billing zone, or empty if CDR is not rated. |
| 0-127 | string | Description of the originating carrier billing zone, or PLEASE NOTE: Only available in system exports, not for resellers. |
| 0-127 | string | Description of the originating customer billing zone, or empty if CDR is not rated. |
| 1-10 | uint | The number of free time seconds used on originating carrier side, or empty if CDR is not rated. PLEASE NOTE: Only available in system exports, not for resellers. |
| 1-10 | uint | The number of free time seconds used from the originating customer’s account balance, or empty if CDR is not rated. |
| 7-14 | fixed precision (6 decimals) | The terminating carrier cost, or empty if CDR is not rated. PLEASE NOTE: Only available in system exports, not for resellers. |
| 7-14 | fixed precision (6 decimals) | The terminating customer cost, or empty if CDR is not rated. |
| 0-127 | string | Name of the terminating carrier billing zone, or PLEASE NOTE: Only available in system exports, not for resellers. |
| 0-127 | string | Name of the terminating customer billing zone, or empty if CDR is not rated. |
| 0-127 | string | Description of the terminating carrier billing zone, or empty if CDR is not rated. PLEASE NOTE: Only available in system exports, not for resellers. |
| 0-127 | string | Description of the terminating customer billing zone, or empty if CDR is not rated. |
| 1-10 | uint | The number of free time seconds used on terminating carrier side, or empty if CDR is not rated. PLEASE NOTE: Only available in system exports, not for resellers. |
| 1-10 | uint | The number of free time seconds used from the terminating customer’s account balance, or empty if CDR is not rated. |
| 7-14 | fixed precision (6 decimals) | The originating reseller cost, or empty if CDR is not rated. PLEASE NOTE: Only available in system exports, not for resellers. |
| 0-127 | string | Name of the originating reseller billing zone, or empty if CDR is not rated. PLEASE NOTE: Only available in system exports, not for resellers. |
| 0-127 | string | Description of the originating reseller billing zone, or empty if CDR is not rated. PLEASE NOTE: Only available in system exports, not for resellers. |
| 1-10 | uint | The number of free time seconds used from the originating reseller’s account balance, or empty if CDR is not rated. PLEASE NOTE: Only available in system exports, not for resellers. |
| 7-14 | fixed precision (6 decimals) | The terminating reseller cost, or empty if CDR is not rated. PLEASE NOTE: Only available in system exports, not for resellers. |
| 0-127 | string | Name of the terminating reseller billing zone, or empty if CDR is not rated. PLEASE NOTE: Only available in system exports, not for resellers. |
| 0-127 | string | Description of the terminating reseller billing zone, or empty if CDR is not rated. PLEASE NOTE: Only available in system exports, not for resellers. |
| 1-10 | uint | The number of free time seconds used from the terminating reseller’s account balance, or empty if CDR is not rated. PLEASE NOTE: Only available in system exports, not for resellers. |
| 1 | string | Always |
A valid example of one body line of a rated CDR is (line breaks added for clarity):
'15','2013-03-26 22:09:11','a84508a8-d256-4c80-a84e-820099a827b0','1','','1','', '2','testuser1','192.168.51.133','4311001','0','192.168.51.1', '94d85b63-8f4b-43f0-b3b0-221c9e3373f2','1','','3','','4','testuser3', '192.168.51.133','testuser3','192.168.51.133','testuser3','','','call','ok','200', '2013-03-25 20:24:50.890','2013-03-25 20:24:51.460','10.880','44449842', 'ok','2013-03-25 20:25:27','0.00','24.00','onnet','testzone','platform internal', 'testzone','0','0','0.00','200.00','','foo','','foo','0','0', '0.00','','','0','0.00','','','0'
The format of the CDR export files generated for resellers (as opposed to the complete system-wide export) is identical except for a few missing fields.
info | |
Please check the description of fields in the table above, in order to see which fields are omitted for reseller related CDR exports. |
The list of fields for reseller CDR export is defined in
/etc/ngcp-config/config.yml
file, cdrexport.reseller_export_fields
parameter.
Supplementary Data
There are fields in CDR database that contain supplementary data related to subscribers. This data is not used by NGCP for CDR processing but rather provides the system administrator with a possibility to include supplementary information in CDRs.
info | |
This informational section is meant for problem solving / debugging purpose:
The supplementary data listed in following table is stored in |
Table 11. Supplementary data in CDR fields
Body Element | Length | Type | Description |
---|---|---|---|
| 0-255 | string | Supplementary data field 0 of calling party. |
| 0-255 | string | Supplementary data field 1 of calling party. |
| 0-255 | string | Supplementary data field 2 of calling party. |
| 0-255 | string | Supplementary data field 3 of calling party. |
| 0-255 | string | Supplementary data field 4 of calling party. |
| 0-255 | string | Supplementary data field 5 of calling party. |
| 0-255 | string | Supplementary data field 6 of calling party. |
| 0-255 | string | Supplementary data field 7 of calling party. |
| 0-255 | string | Supplementary data field 8 of calling party. |
| 0-255 | string | Supplementary data field 9 of calling party. |
| 0-255 | string | Supplementary data field 0 of called party. |
| 0-255 | string | Supplementary data field 1 of called party. |
| 0-255 | string | Supplementary data field 2 of called party. |
| 0-255 | string | Supplementary data field 3 of called party. |
| 0-255 | string | Supplementary data field 4 of called party. |
| 0-255 | string | Supplementary data field 5 of called party. |
| 0-255 | string | Supplementary data field 6 of called party. |
| 0-255 | string | Supplementary data field 7 of called party. |
| 0-255 | string | Supplementary data field 8 of called party. |
| 0-255 | string | Supplementary data field 9 of called party. |
Account balance details (prepaid calls)
There are fields in CDR database that show changes in cash or free time balance. In addition to that, a history of billing packages / profiles may also be present, since the NGCP vouchers, that are used to top-up, may also be set up to cause a transition of profile packages. (Which in turn can result in changing the billing profile/applicable fees). Therefore the billing package and profile valid at the time of the CDR are recorded and exposed as fields for CDR export.
tip | |
Such fields may also be required to integrate sip:provider CE with legacy billing systems. |
info | |
Please be aware that pre-paid billing functionality is only available in Sipwise sip:provider PRO and sip:carrier products. |
The name of CDR data field consists of the elements listed below:
source|destination
: decides if the data refers to calling (source
) or called (destination
) party
carrier|reseller|customer
: the account owner, whose billing data is referred
data type:
cash_balance|free_time_balance _ before|after
: cash balance or free time balance, before or after the call
profile_package_id|contract_balance_id
: internal ID of the active pre-paid billing profile or the account balance
Examples:
important | |
For calls spanning multiple balance intervals, the latter one will be selected, that is the balance interval where the call ended. |
On-net calls (made only between devices on your network) are sometimes treated differently from off-net calls (terminated to or received from a peer) in external billing systems.
To distinguish between on-net and off-net calls in such a billing systems, check the source_user_id and destination_user_id fields. For on-net calls, both fields will have a different from zero value (actually, a UUID).
The body of an EDR consists of a minimum of zero and a maximum of 5000 lines.
The platform operator can configure the maximum number of lines kept in a file
by updating the eventexport.max_rows_per_file
parameter in /etc/ngcp-config/config.yml
file. Each line holds one call detail record in CSV format and is constructed by
the fields as per the subsequent table.
The following table defines the default set of fields that are inserted into the
EDR file, for exports related to system scope. The list of fields is defined in
/etc/ngcp-config/config.yml
file, eventexport.admin_export_fields
parameter.
Table 12. Default set of system EDR fields
Body Element | Length | Type | Description |
---|---|---|---|
| 1-11 | uint | Internal EDR ID. |
| 0-255 | string | The type of the event - one of:
|
| 0-255 | string | The external ID of the customer. (A string value shown as "External ID" property of an NGCP customer.) |
| 0-127 | string | The company name of the customer’s contact. |
| 0-255 | string | The external ID of the subscriber. (A string value shown as "External ID" property of an NGCP subscriber.) PLEASE NOTE: This field is empty in case of |
| 0-64 | string | The pilot subscriber’s primary number (HPBX subscribers). PLEASE NOTE: This is not included in default set of EDR fields from NGCP version mr5.0 upwards. |
| 0-64 | string | The VoIP number of the subscriber with the highest ID (DID or primary number). |
| 0-255 | string | The old status of the event. Depending on the event_type:
|
| 0-255 | string | The new status of the event. Depending on the event_type:
|
| 23 | timestamp | Timestamp of event. Includes date, time with milliseconds (3 decimals). |
| 1-11 | uint | Internal ID of the reseller which the event belongs to. PLEASE NOTE: Only available in system exports, not for resellers. |
| 1 | string | A fixed character. Always |
A valid example of one body line of an EDR is (line breaks added for clarity):
"1","start_profile","sipwise_ext_customer_id_4","Sipwise GmbH", "sipwise_ext_subscriber_id_44","436667778","","1","2014-06-19 11:34:31","1"
The format of the EDR export files generated for resellers (as opposed to the complete system-wide export) is identical except for a few missing fields.
info | |
Please check the description of fields in the table above, in order to see which fields are omitted for reseller related EDR exports. |
The list of fields for reseller EDR export is defined in
/etc/ngcp-config/config.yml
file, eventexport.reseller_export_fields
parameter.
There are fields in EDR database that contain supplementary data related to subscribers, for example subscriber phone numbers are such data.
Table 13. Supplementary data in EDR fields
Body Element | Length | Type | Description |
---|---|---|---|
| 0-255 | string | The subscriber’s profile set name. |
| 0-255 | string | The profile set name of the subscriber’s pilot subscriber. |
| 0-255 | string | The profile name of the subscriber’s pilot subscriber. |
| 0-255 | string | The subscriber’s non-primary alias with lowest ID, before number updates during the operation. |
| 0-255 | string | The subscriber’s non-primary alias with lowest ID, after number updates during the operation. |
| 0-255 | string | The non-primary alias with lowest ID of the subscriber’s pilot subscriber, before number updates during the operation. |
| 0-255 | string | The non-primary alias with lowest ID of the subscriber’s pilot subscriber, after number updates during the operation. |
| 0-255 | string | The non-primary alias of a subscriber affected by an |
| 0-255 | string | The subscriber’s primary alias, before number updates during the operation. |
| 0-255 | string | The subscriber’s primary alias, after number updates during the operation. |
| 0-255 | string | The primary alias of the subscriber’s pilot subscriber, before number updates during the operation. |
| 0-255 | string | The primary alias of the subscriber’s pilot subscriber, after number updates during the operation. |
| 0-255 | string | Equals |
| 0-255 | string | Equals |
The billing file trailer is one single line, which is constructed by the following fields:
<md5 sum>
The <md5 sum>
is a 32 character hexadecimal MD5 hash of the Header and Body.
To validate the billing file, one must remove the Trailer before computing the MD5 sum of the file. An example bash script to validate the integrity of the file is given below:
#!/bin/sh error() { echo $@; exit 1; } test -n "$1" || error "Usage: $0 <cdr-file>" test -f "$1" || error "File '$1' not found" TMPFILE="/tmp/$(basename "$1").$$" MD5="$(sed -rn '$ s/^([a-z0-9]{32}).*$/\1/i p' "$1") $TMPFILE" sed '$d' "$1" > "$TMPFILE" echo "$MD5" | md5sum -c - rm -f "$TMPFILE"
Given the script is located in cdr-md5.sh
and the CDR-file is sipwise_001_20071110123000_0000000004.cdr
, the output of the integrity check for an intact CDR file would be:
$ ./cdr-md5.sh sipwise_001_20071110123000_0000000004.cdr /tmp/sipwise_001_20071110123000_0000000004.cdr: OK
If the file has been altered during transmission, the output of the integrity check would be:
$ ./cdr-md5.sh sipwise_001_20071110123000_0000000004.cdr /tmp/sipwise_001_20071110123000_0000000004.cdr: FAILED md5sum: WARNING: 1 of 1 computed checksum did NOT match
Billing files are created twice per hour at minutes 25
and 55
and are stored in the home directory of the cdrexport
user. If the amount of records within the transmission interval exceeds the threshold of 5000 records per file, multiple billing files are created. If no billing records are found for an interval, a billing file without body data is constructed for easy detection of lost billing files on the 3rd party side.
CDR and EDR files are fetched by a 3rd party billing system using SFTP or SCP with either public key or password authentication using the username cdrexport.
If public key authentication is chosen, the public key file has to be stored in the file ~/.ssh/authorized_keys2
below the home directory of the cdrexport
user. Otherwise, a password has to be set for the user.
The 3rd party billing system is responsible for deleting CDR files after fetching them.
info | |
The |