X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=blobdiff_plain;f=FS%2FFS%2Fpart_pkg%2Fvoip_cdr.pm;h=02992277d4d8b83ad779aa9aa891bbac8d9c5cd9;hp=25b8d780115982f5c936e47e31d4cc5628867fed;hb=b0329dafd35e0296ec61fef4c35a687ff8866764;hpb=c40ec6975d9d8275454eb9a1b076a4078d87c8df diff --git a/FS/FS/part_pkg/voip_cdr.pm b/FS/FS/part_pkg/voip_cdr.pm index 25b8d7801..02992277d 100644 --- a/FS/FS/part_pkg/voip_cdr.pm +++ b/FS/FS/part_pkg/voip_cdr.pm @@ -43,10 +43,17 @@ tie my %temporalities, 'Tie::IxHash', tie my %granularity, 'Tie::IxHash', FS::rate_detail::granularities(); +# previously "1" was "ignore" +tie my %unrateable_opts, 'Tie::IxHash', + '' => 'Exit with a fatal error', + 1 => 'Ignore and continue', + 2 => 'Flag for later review', +; + %info = ( 'name' => 'VoIP rating by plan of CDR records in an internal (or external) SQL table', 'shortname' => 'VoIP/telco CDR rating (standard)', - 'inherit_fields' => [ 'global_Mixin' ], + 'inherit_fields' => [ 'prorate_Mixin', 'global_Mixin' ], 'fields' => { 'suspend_bill' => { 'name' => 'Continue recurring billing while suspended', 'type' => 'checkbox', @@ -61,10 +68,6 @@ tie my %granularity, 'Tie::IxHash', FS::rate_detail::granularities(); 'subscription', 'default' => '1', }, - 'add_full_period'=> { 'name' => 'When prorating first month, also bill '. - 'for one full period after that', - 'type' => 'checkbox', - }, 'recur_method' => { 'name' => 'Recurring fee method', #'type' => 'radio', #'options' => \%recur_method, @@ -109,8 +112,9 @@ tie my %granularity, 'Tie::IxHash', FS::rate_detail::granularities(); 'select_options' => \%granularity, }, - 'ignore_unrateable' => { 'name' => 'Ignore calls without a rate in the rate tables. By default, the system will throw a fatal error upon encountering unrateable calls.', - 'type' => 'checkbox', + 'ignore_unrateable' => { 'name' => 'Handling of calls without a rate in the rate table', + 'type' => 'select', + 'select_options' => \%unrateable_opts, }, 'default_prefix' => { 'name' => 'Default prefix optionally prepended to customer DID numbers when searching for CDR records', @@ -137,22 +141,23 @@ tie my %granularity, 'Tie::IxHash', FS::rate_detail::granularities(); 'type' => 'checkbox', }, - 'use_amaflags' => { 'name' => 'Do not charge for CDRs where the amaflags field is not set to "2" ("BILL"/"BILLING").', + 'use_amaflags' => { 'name' => 'Only charge for CDRs where the amaflags field is set to "2" ("BILL"/"BILLING").', 'type' => 'checkbox', }, - 'use_disposition' => { 'name' => 'Do not charge for CDRs where the disposition flag is not set to "ANSWERED".', - 'type' => 'checkbox', + 'use_carrierid' => { 'name' => 'Only charge for CDRs where the Carrier ID is set to: ', }, - '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' => 'Only charge for CDRs where the CDR Type is 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' => 'Only charge for CDRs where the Disposition is 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: ', @@ -258,8 +263,9 @@ tie my %granularity, 'Tie::IxHash', FS::rate_detail::granularities(); }, 'fieldorder' => [qw( recur_temporality - recur_method cutoff_day - add_full_period + recur_method cutoff_day ), + FS::part_pkg::prorate_Mixin::fieldorder, + qw( cdr_svc_method rating_method ratenum intrastate_ratenum min_charge min_included @@ -269,8 +275,10 @@ tie my %granularity, 'Tie::IxHash', FS::rate_detail::granularities(); 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 @@ -296,11 +304,6 @@ sub price_info { $str; } -sub calc_setup { - my($self, $cust_pkg ) = @_; - $self->option('setup_fee'); -} - sub calc_recur { my $self = shift; my($cust_pkg, $sdate, $details, $param ) = @_; @@ -642,8 +645,20 @@ sub calc_usage { #if ( ! $rate_detail && ! scalar(@call_details) ) {} if ( ! $rate_detail && $charge eq '' ) { - warn "no rate_detail found for CDR.acctid: ". $cdr->acctid. - "; skipping\n" + if ( $ignore_unrateable == 2 ) { + # mark the CDR as unrateable + my $error = $cdr->set_status_and_rated_price( + 'failed', + '', + $cust_svc->svcnum + ); + die $error if $error; + } + elsif ( $ignore_unrateable == 1 ) { + # warn and continue + warn "no rate_detail found for CDR.acctid: ". $cdr->acctid. + "; skipping\n" + } #if $ignore_unrateable } else { # there *is* a rate_detail (or call_details), proceed... # About this section: @@ -779,6 +794,7 @@ sub calc_usage { $classnum, $phonenum, $cdr->accountcode, + $cdr->startdate, $seconds, $regionname, ]; @@ -791,6 +807,7 @@ sub calc_usage { $classnum, $phonenum, $cdr->accountcode, + $cdr->startdate, $seconds, $regionname, ]; @@ -873,10 +890,11 @@ sub check_chargable { 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 @@ -893,11 +911,18 @@ sub check_chargable { return 'amaflags != 2' if $opt{'use_amaflags'} && $cdr->amaflags != 2; - return 'disposition != ANSWERED' - if $opt{'use_disposition'} && $cdr->disposition ne 'ANSWERED'; + 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 "disposition != 100" - if $opt{'use_disposition_taqua'} && $cdr->disposition != 100; + foreach(split(/\s*,\s*/, $opt{'skip_dst_prefix'})) { + return "dst starts with '$_'" + if length($_) && substr($cdr->dst,0,length($_)) eq $_; + } return "carrierid != $opt{'use_carrierid'}" if length($opt{'use_carrierid'}) @@ -907,11 +932,10 @@ sub check_chargable { return "cdrtypenum != $opt{'use_cdrtypenum'}" if length($opt{'use_cdrtypenum'}) && $cdr->cdrtypenum ne $opt{'use_cdrtypenum'}; #ne otherwise 0 matches '' - - foreach(split(',',$opt{'skip_dst_prefix'})) { - return "dst starts with '$_'" - if length($_) && substr($cdr->dst,0,length($_)) eq $_; - } + + return "cdrtypenum == $opt{'ignore_cdrtypenum'}" + if length($opt{'ignore_cdrtypenum'}) + && $cdr->cdrtypenum eq $opt{'ignore_cdrtypenum'}; #eq otherwise 0 matches '' return "dcontext IN ( $opt{'skip_dcontext'} )" if $opt{'skip_dcontext'} =~ /\S/