X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2Fpart_pkg%2Fvoip_cdr.pm;h=1b565f2c446fc7a8adecb6025f98e2ba1d09d3bb;hb=92adead1404db357a11b58f38c2b4403381a2809;hp=979134a5addd8c063f0a141d939383335934b1fe;hpb=8e7225dc2659c990f71609dea29c8ca0f8c7ebc2;p=freeside.git diff --git a/FS/FS/part_pkg/voip_cdr.pm b/FS/FS/part_pkg/voip_cdr.pm index 979134a5a..1b565f2c4 100644 --- a/FS/FS/part_pkg/voip_cdr.pm +++ b/FS/FS/part_pkg/voip_cdr.pm @@ -8,8 +8,9 @@ use FS::Conf; use FS::Record qw(qsearchs qsearch); use FS::part_pkg::flat; use FS::cdr; -#use FS::rate; -#use FS::rate_prefix; +use FS::rate; +use FS::rate_prefix; +use FS::rate_detail; @ISA = qw(FS::part_pkg::flat); @@ -84,6 +85,10 @@ tie my %temporalities, 'Tie::IxHash', 'default' => '011', }, + 'disable_tollfree' => { 'name' => 'Disable automatic toll-free processing', + 'type' => 'checkbox', + }, + 'use_amaflags' => { 'name' => 'Do not charge for CDRs where the amaflags field is not set to "2" ("BILL"/"BILLING").', 'type' => 'checkbox', }, @@ -102,6 +107,10 @@ tie my %temporalities, 'Tie::IxHash', 'use_cdrtypenum' => { 'name' => 'Do not charge for CDRs where the CDR Type is not set to: ', }, + 'use_duration' => { 'name' => 'Calculate usage based on the duration field instead of the billsec field', + 'type' => 'checkbox', + }, + '411_rewrite' => { 'name' => 'Rewrite these (comma-separated) destination numbers to 411 for rating purposes: ', }, @@ -117,6 +126,10 @@ tie my %temporalities, 'Tie::IxHash', 'type' => 'checkbox', }, + 'bill_every_call' => { 'name' => 'Generate an invoice immediately for every call. Useful for prepaid.', + 'type' => 'checkbox', + }, + #XXX also have option for an external db # 'cdr_location' => { 'name' => 'CDR database location' # 'type' => 'select', @@ -147,10 +160,13 @@ tie my %temporalities, 'Tie::IxHash', default_prefix disable_src domestic_prefix international_prefix + disable_tollfree use_amaflags use_disposition use_disposition_taqua use_carrierid use_cdrtypenum + use_duration 411_rewrite output_format summarize_usage usage_section + bill_every_call ) ], 'weight' => 40, @@ -261,7 +277,10 @@ sub calc_recur { } my( $to_or_from, $number ); - if ( $cdr->dst =~ /^(\+?1)?8([02-8])\1/ ) { #tollfree call + if ( $cdr->dst =~ /^(\+?1)?8([02-8])\1/ + && ! $self->option('disable_tollfree') + ) + { #tollfree call $to_or_from = 'from'; $number = $cdr->src; } else { #regular call @@ -269,6 +288,8 @@ sub calc_recur { $number = $cdr->dst; } + warn "parsing call $to_or_from $number\n" if $DEBUG; + #remove non-phone# stuff and whitespace $number =~ s/\s//g; # my $proto = ''; @@ -306,32 +327,15 @@ sub calc_recur { warn "rating call $to_or_from +$countrycode $number\n" if $DEBUG; $pretty_destnum = "+$countrycode $number"; - #find a rate prefix, first look at most specific (4 digits) then 3, etc., - # finally trying the country code only - my $rate_prefix = ''; - for my $len ( reverse(1..6) ) { - $rate_prefix = qsearchs('rate_prefix', { - 'countrycode' => $countrycode, - #'npa' => { op=> 'LIKE', value=> substr($number, 0, $len) } - 'npa' => substr($number, 0, $len), - } ) and last; - } - $rate_prefix ||= qsearchs('rate_prefix', { - 'countrycode' => $countrycode, - 'npa' => '', - }); - - # - die "Can't find rate for call $to_or_from +$countrycode $number\n" - unless $rate_prefix; + my $rate = qsearchs('rate', { 'ratenum' => $ratenum }) + or die "ratenum $ratenum not found!"; - $regionnum = $rate_prefix->regionnum; - $rate_detail = qsearchs('rate_detail', { - 'ratenum' => $ratenum, - 'dest_regionnum' => $regionnum, - } ); + $rate_detail = $rate->dest_detail({ 'countrycode' => $countrycode, + 'phonenum' => $number, + }); - $rate_region = $rate_prefix->rate_region; + $rate_region = $rate_detail->dest_region; + $regionnum = $rate_region->regionnum; warn " found rate for regionnum $regionnum ". "and rate detail $rate_detail\n" @@ -405,7 +409,12 @@ sub calc_recur { unless exists $included_min{$regionnum}; my $granularity = $rate_detail->sec_granularity; - my $seconds = $cdr->billsec; # length($cdr->billsec) ? $cdr->billsec : $cdr->duration; + + # length($cdr->billsec) ? $cdr->billsec : $cdr->duration; + my $seconds = $self->option('use_duration') + ? $cdr->duration + : $cdr->billsec; + $seconds += $granularity - ( $seconds % $granularity ) if $seconds # don't granular-ize 0 billsec calls (bills them) && $granularity; # 0 is per call