use FS::rate_prefix;
use FS::rate_detail;
-@ISA = qw(FS::part_pkg::flat);
+@ISA = qw(FS::part_pkg::prorate);
$DEBUG = 0;
'type' => 'checkbox',
},
+ 'cutoff_day' => { 'name' => 'Billing Day (1 - 28) for prorating. Leave'.
+ ' blank to charge full first month instead.',
+ 'default' => '',
+ },
+
'rating_method' => { 'name' => 'Region rating method',
'type' => 'radio',
'options' => \%rating_method,
'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',
},
},
'fieldorder' => [qw(
setup_fee recur_fee recur_temporality unused_credit
- rating_method ratenum ignore_unrateable
+ cutoff_day rating_method ratenum ignore_unrateable
default_prefix
disable_src
domestic_prefix international_prefix
use_amaflags use_disposition
use_disposition_taqua use_carrierid use_cdrtypenum
skip_dcontext skip_dstchannel_prefix
+ skip_dst_length_less skip_lastapp
use_duration
411_rewrite
output_format summarize_usage usage_section
#false laziness w/voip_sqlradacct calc_recur resolve it if that one ever gets used again
sub calc_recur {
- my($self, $cust_pkg, $sdate, $details, $param ) = @_;
+ my $self = shift;
+ my($cust_pkg, $sdate, $details, $param ) = @_;
#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;
+ if $self->option('recur_temporality', 1) eq 'preceding'
+ && ( $last_bill eq '' || $last_bill == 0 );
my $ratenum = $cust_pkg->part_pkg->option('ratenum');
$included_min{$regionnum} -= $minutes;
if ( $included_min{$regionnum} < 0 ) {
- my $charge_min = 0 - $included_min{$regionnum};
+ my $charge_min = 0 - $included_min{$regionnum}; #XXX should preserve
+ #(display?) this
$included_min{$regionnum} = 0;
- $charge = sprintf('%.2f', $rate_detail->min_charge * $charge_min );
+ $charge = sprintf('%.2f', ( $rate_detail->min_charge * $charge_min )
+ + 0.00000001 ); #so 1.005 rounds to 1.01
$charges += $charge;
}
} #if ( $spool_cdr && length($downstream_cdr) )
- $charges += $self->option('recur_fee')
- if $param->{'increment_next_bill'};
+ if ($param->{'increment_next_bill'}) {
+ if ( $self->option('cutoff_day', 1) ) {
+ $charges += $self->SUPER::calc_recur(@_);
+ } else {
+ $charges += $self->option('recur_fee')
+ }
+ }
$charges;
}
use_carrierid
use_cdrtypenum
skip_dcontext
- skip_dstchannel_prefix;
+ 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{'skip_dcontext'} =~ /\S/
&& grep { $cdr->dcontext eq $_ } split(/\s*,\s*/, $opt{'skip_dcontext'});
- my $len = length($opt{'skip_dstchannel_prefix'});
+ my $len_prefix = length($opt{'skip_dstchannel_prefix'});
return "dstchannel starts with $opt{'skip_dstchannel_prefix'}"
- if $len
- && substr($cdr->dstchannel, 0, $len) eq $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
'';