'select_key' => 'ratenum',
'select_label' => 'ratename',
},
+
+ 'intrastate_ratenum' => { 'name' => 'Optional alternate intrastate rate plan',
+ 'type' => 'select',
+ 'select_table' => 'rate',
+ 'select_key' => 'ratenum',
+ 'select_label' => 'ratename',
+ 'disable_empty' => 0,
+ 'empty_label' => '',
+ },
'min_included' => { 'name' => 'Minutes included when using the "single price per minute" rating method or when using the "prefix" rating method ("region group" billing)',
},
'type' => 'checkbox',
},
- 'use_disposition' => { 'name' => 'Do not charge for CDRs where the disposition flag is not set to "ANSWERED".',
- 'type' => 'checkbox',
- },
-
- 'use_disposition_taqua' => { 'name' => 'Do not charge for CDRs where the disposition is not set to "100" (Taqua).',
- 'type' => 'checkbox',
- },
-
'use_carrierid' => { 'name' => 'Do not charge for CDRs where the Carrier ID is not set to: ',
},
'use_cdrtypenum' => { 'name' => 'Do not charge for CDRs where the CDR Type is not set to: ',
},
+
+ 'ignore_cdrtypenum' => { 'name' => 'Do not charge for CDRs where the CDR Type is set to: ',
+ },
+
+ 'ignore_disposition' => { 'name' => 'Do not charge for CDRs where the Disposition is set to any of these (comma-separated) values: ',
+ },
+
+ 'disposition_in' => { 'name' => 'Do not charge for CDRs where the Disposition is not set to any of these (comma-separated) values: ',
+ },
'skip_dst_prefix' => { 'name' => 'Do not charge for CDRs where the destination number starts with any of these values: ',
},
recur_method cutoff_day
add_full_period
cdr_svc_method
- rating_method ratenum min_charge min_included
- sec_granularity
+ rating_method ratenum intrastate_ratenum
+ min_charge min_included
+ sec_granularity
ignore_unrateable
default_prefix
disable_src
domestic_prefix international_prefix
disable_tollfree
- use_amaflags use_disposition
- use_disposition_taqua use_carrierid use_cdrtypenum
+ use_amaflags
+ use_carrierid
+ use_cdrtypenum ignore_cdrtypenum
+ ignore_disposition disposition_in
skip_dcontext skip_dst_prefix
skip_dstchannel_prefix skip_src_length_more
noskip_src_length_accountcode_tollfree
411_rewrite
output_format usage_mandate summarize_usage usage_section
bill_every_call bill_inactive_svcs
- count_available_phones suspend_bill
+ count_available_phones suspend_bill
)
],
'weight' => 40,
my $eff_ratenum = $cdr->is_tollfree('accountcode')
? $cust_pkg->part_pkg->option('accountcode_tollfree_ratenum')
: '';
+
+ my $intrastate_ratenum = $cust_pkg->part_pkg->option('accountcode_tollfree_ratenum');
+ if ( $intrastate_ratenum && !$cdr->is_tollfree ) {
+ # this is relatively easy only because:
+ # -assume all numbers are valid NANP numbers NOT in a fully-qualified format
+ # -disregard toll-free
+ # -disregard private or unknown numbers
+ # -there is exactly one record in rate_prefix for a given NPANXX
+ # -default to interstate if we can't find one or both of the prefixes
+ my $dstprefix = $cdr->dst;
+ $dstprefix =~ /^(\d{6})/;
+ $dstprefix = qsearchs('rate_prefix', { 'countrycode' => '1',
+ 'npa' => $1,
+ }) || '';
+ my $srcprefix = $cdr->src;
+ $srcprefix =~ /^(\d{6})/;
+ $srcprefix = qsearchs('rate_prefix', { 'countrycode' => '1',
+ 'npa' => $1,
+ }) || '';
+ $eff_ratenum = $intrastate_ratenum if ($srcprefix && $dstprefix
+ && $srcprefix->state && $dstprefix->state
+ && $srcprefix->state eq $dstprefix->state);
+ }
+
$eff_ratenum ||= $ratenum;
$rate = qsearchs('rate', { 'ratenum' => $eff_ratenum })
or die "ratenum $eff_ratenum not found!";
my @opt = qw(
use_amaflags
- use_disposition
- use_disposition_taqua
use_carrierid
use_cdrtypenum
+ ignore_cdrtypenum
+ disposition_in
+ ignore_disposition
skip_dst_prefix
skip_dcontext
skip_dstchannel_prefix
return 'amaflags != 2'
if $opt{'use_amaflags'} && $cdr->amaflags != 2;
- return 'disposition != ANSWERED'
- if $opt{'use_disposition'} && $cdr->disposition ne 'ANSWERED';
-
- return "disposition != 100"
- if $opt{'use_disposition_taqua'} && $cdr->disposition != 100;
+ return "disposition NOT IN ( $opt{'disposition_in'} )"
+ if $opt{'disposition_in'} =~ /\S/
+ && !grep { $cdr->disposition eq $_ } split(/\s*,\s*/, $opt{'disposition_in'});
+
+ return "disposition IN ( $opt{'ignore_disposition'} )"
+ if $opt{'ignore_disposition'} =~ /\S/
+ && grep { $cdr->disposition eq $_ } split(/\s*,\s*/, $opt{'ignore_disposition'});
return "carrierid != $opt{'use_carrierid'}"
if length($opt{'use_carrierid'})
return "cdrtypenum != $opt{'use_cdrtypenum'}"
if length($opt{'use_cdrtypenum'})
&& $cdr->cdrtypenum ne $opt{'use_cdrtypenum'}; #ne otherwise 0 matches ''
+
+ return "cdrtypenum == $opt{'ignore_cdrtypenum'}"
+ if length($opt{'ignore_cdrtypenum'})
+ && $cdr->cdrtypenum eq $opt{'ignore_cdrtypenum'}; #eq otherwise 0 matches ''
foreach(split(',',$opt{'skip_dst_prefix'})) {
return "dst starts with '$_'"