@ISA = qw(FS::part_pkg::flat);
-$DEBUG = 1;
+$DEBUG = 0;
tie my %rating_method, 'Tie::IxHash',
'prefix' => 'Rate calls by using destination prefix to look up a region and rate according to the internal prefix and rate tables',
'use_cdrtypenum' => { 'name' => 'Do not charge for CDRs where the CDR Type is not set to: ',
},
+ 'skip_dcontext' => { 'name' => 'Do not charge for CDRs where the dcontext is set to any of these (comma-separated) values:',
+ },
+
+ 'skip_dstchannel_prefix' => { 'name' => 'Do not charge for CDRs where the dstchannel starts with:',
+ },
+
+ 'skip_dst_length_less' => { 'name' => 'Do not charge for CDRs where the destination is less than this many digits:',
+ },
+
+ 'skip_lastapp' => { 'name' => 'Do not charge for CDRs where the lastapp matches this value',
+ },
+
'use_duration' => { 'name' => 'Calculate usage based on the duration field instead of the billsec field',
'type' => 'checkbox',
},
disable_tollfree
use_amaflags use_disposition
use_disposition_taqua use_carrierid use_cdrtypenum
+ skip_dcontext skip_dstchannel_prefix
use_duration
411_rewrite
output_format summarize_usage usage_section
my $last_bill = $cust_pkg->get('last_bill'); #->last_bill falls back to setup
return 0
- if $self->option('recur_temporality', 1) eq 'preceding' && $last_bill == 0;
+ if $self->option('recur_temporality', 1) eq 'preceding'
+ && ( $last_bill eq '' || $last_bill == 0 );
my $ratenum = $cust_pkg->part_pkg->option('ratenum');
my @call_details = ();
if ( $rating_method eq 'prefix' ) {
- my $da_rewrite = 0;
- if ( scalar(@dirass) && $cdr->dst && grep $cdr->dst eq $_, @dirass ) {
+ my $da_rewrote = 0;
+ if ( length($cdr->dst) && grep { $cdr->dst eq $_ } @dirass ){
$cdr->dst('411');
- $da_rewrite = 1;
+ $da_rewrote = 1;
}
my $reason = $self->check_chargable( $cdr,
- '411_rewrite' => $da_rewrite,
- 'option_cache' => %opt_cache,
+ 'da_rewrote' => $da_rewrote,
+ 'option_cache' => \%opt_cache,
);
if ( $reason ) {
if ( $rate_detail ) {
+ $rate_region = $rate_detail->dest_region;
+ $regionnum = $rate_region->regionnum;
warn " found rate for regionnum $regionnum ".
"and rate detail $rate_detail\n"
if $DEBUG;
- $rate_region = $rate_detail->dest_region;
- $regionnum = $rate_region->regionnum;
} elsif ( $ignore_unrateable ) {
use_disposition_taqua
use_carrierid
use_cdrtypenum
+ skip_dcontext
+ skip_dstchannel_prefix
+ skip_dst_length_less
+ skip_lastapp
);
foreach my $opt (grep !exists($flags{option_cache}->{$_}), @opt ) {
$flags{option_cache}->{$opt} = $self->option($opt);
if $opt{'use_disposition_taqua'} && $cdr->disposition != 100;
return "carrierid != $opt{'use_carrierid'}"
- if $opt{'use_carrierid'}
- && $cdr->carrierid != $opt{'use_carrierid'}
- && ! $flags{'411_rewrite'};
+ if length($opt{'use_carrierid'})
+ && $cdr->carrierid ne $opt{'use_carrierid'} #ne otherwise 0 matches ''
+ && ! $flags{'da_rewrote'};
return "cdrtypenum != $opt{'use_cdrtypenum'}"
- if $opt{'use_cdrtypenum'}
- && $cdr->cdrtypenum != $opt{'use_cdrtypenum'};
+ if length($opt{'use_cdrtypenum'})
+ && $cdr->cdrtypenum ne $opt{'use_cdrtypenum'}; #ne otherwise 0 matches ''
+
+ return "dcontext IN ( $opt{'skip_dcontext'} )"
+ if $opt{'skip_dcontext'} =~ /\S/
+ && grep { $cdr->dcontext eq $_ } split(/\s*,\s*/, $opt{'skip_dcontext'});
+
+ my $len_prefix = length($opt{'skip_dstchannel_prefix'});
+ return "dstchannel starts with $opt{'skip_dstchannel_prefix'}"
+ if $len_prefix
+ && substr($cdr->dstchannel,0,$len_prefix) eq $opt{'skip_dstchannel_prefix'};
+
+ my $dst_length = $opt{'skip_dst_length_less'};
+ return "destination less than $dst_length digits"
+ if $dst_length && length($cdr->dst) < $dst_length;
+
+ return "lastapp is $opt{'skip_lastapp'}"
+ if length($opt{'skip_lastapp'}) && $cdr->lastapp eq $opt{'skip_lastapp'};
#all right then, rate it
'';