X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;ds=sidebyside;f=FS%2FFS%2Fpart_pkg%2Fvoip_cdr.pm;h=a3b54ee84bc66450e0882faa724a0321cd75beb3;hb=9e992baf49d7ac4372fd9dab88f41731f04e53b8;hp=bbba7c724bbb890050bf2ec5e8a1a87da2048bac;hpb=2e8cbbb5e16c689c42f0863f157877e387f26910;p=freeside.git diff --git a/FS/FS/part_pkg/voip_cdr.pm b/FS/FS/part_pkg/voip_cdr.pm index bbba7c724..a3b54ee84 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); @@ -27,6 +28,11 @@ tie my %rating_method, 'Tie::IxHash', # 'Asterisk (or other?) CDR table', #; +tie my %temporalities, 'Tie::IxHash', + 'upcoming' => "Upcoming (future)", + 'preceding' => "Preceding (past)", +; + %info = ( 'name' => 'VoIP rating by plan of CDR records in an internal (or external) SQL table', 'shortname' => 'VoIP/telco CDR rating (standard)', @@ -37,6 +43,13 @@ tie my %rating_method, 'Tie::IxHash', 'recur_fee' => { 'name' => 'Base recurring fee for this package', 'default' => 0, }, + + #false laziness w/flat.pm + 'recur_temporality' => { 'name' => 'Charge recurring fee for period', + 'type' => 'select', + 'select_options' => \%temporalities, + }, + 'unused_credit' => { 'name' => 'Credit the customer for the unused portion'. ' of service at cancellation', 'type' => 'checkbox', @@ -72,6 +85,10 @@ tie my %rating_method, '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', }, @@ -90,6 +107,10 @@ tie my %rating_method, '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: ', }, @@ -105,6 +126,10 @@ tie my %rating_method, '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', @@ -130,15 +155,18 @@ tie my %rating_method, 'Tie::IxHash', }, 'fieldorder' => [qw( - setup_fee recur_fee unused_credit + setup_fee recur_fee recur_temporality unused_credit rating_method ratenum 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, @@ -153,7 +181,11 @@ sub calc_setup { sub calc_recur { my($self, $cust_pkg, $sdate, $details, $param ) = @_; - my $last_bill = $cust_pkg->last_bill; + #my $last_bill = $cust_pkg->last_bill; + 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; my $ratenum = $cust_pkg->part_pkg->option('ratenum'); @@ -245,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 @@ -253,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 = ''; @@ -290,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' => '', - }); + my $rate = qsearchs('rate', { 'ratenum' => $ratenum }) + or die "ratenum $ratenum not found!"; - # - die "Can't find rate for call $to_or_from +$countrycode $number\n" - unless $rate_prefix; + $rate_detail = $rate->dest_detail({ 'countrycode' => $countrycode, + 'phonenum' => $number, + }); - $regionnum = $rate_prefix->regionnum; - $rate_detail = qsearchs('rate_detail', { - 'ratenum' => $ratenum, - 'dest_regionnum' => $regionnum, - } ); - - $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" @@ -375,7 +395,7 @@ sub calc_recur { # don't add it to invoice, don't set its status to NULL, # don't call downstream_csv or something on it... # but DO emit a warning... - #if ( ! $rate_detail && ! scalar(@call_details) ) { + #if ( ! $rate_detail && ! scalar(@call_details) ) {} if ( ! $rate_detail && $charge eq '' ) { warn "no rate_detail found for CDR.acctid: ". $cdr->acctid. @@ -389,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 @@ -484,8 +509,10 @@ sub calc_recur { } #if ( $spool_cdr && length($downstream_cdr) ) - $self->option('recur_fee') + $charges; + $charges += $self->option('recur_fee') + if $param->{'increment_next_bill'}; + $charges; } sub is_free {