X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2Fpart_pkg%2Fvoip_cdr.pm;h=768f8948739f6e58a4d54dee3315e37ca0352c80;hb=936fa95f952d966d697586518717858aa874d778;hp=e067af55dd298aa8bf57d7cbd61a75faaca9b60e;hpb=0a02d33bed6155752cf3f2886915bc6287d13636;p=freeside.git diff --git a/FS/FS/part_pkg/voip_cdr.pm b/FS/FS/part_pkg/voip_cdr.pm index e067af55d..768f89487 100644 --- a/FS/FS/part_pkg/voip_cdr.pm +++ b/FS/FS/part_pkg/voip_cdr.pm @@ -22,6 +22,7 @@ $DEBUG = 0; tie my %cdr_svc_method, 'Tie::IxHash', 'svc_phone.phonenum' => 'Phone numbers (svc_phone.phonenum)', 'svc_pbx.title' => 'PBX name (svc_pbx.title)', + 'svc_pbx.svcnum' => 'Freeside service # (svc_pbx.svcnum)', ; tie my %rating_method, 'Tie::IxHash', @@ -70,7 +71,10 @@ 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, @@ -218,10 +222,14 @@ tie my %granularity, 'Tie::IxHash', FS::rate_detail::granularities(); }, #eofalse - 'bill_every_call' => { 'name' => 'Generate an invoice immediately for every call. Useful for prepaid.', + 'bill_every_call' => { 'name' => 'Generate an invoice immediately for every call (as well any setup fee, upon first payment). Useful for prepaid.', 'type' => 'checkbox', }, + 'bill_inactive_svcs' => { 'name' => 'Bill for all phone numbers that were active during the billing period', + 'type' => 'checkbox', + }, + 'count_available_phones' => { 'name' => 'Consider for tax purposes the number of lines to be svc_phones that may be provisioned rather than those that actually are.', 'type' => 'checkbox', }, @@ -253,6 +261,7 @@ tie my %granularity, 'Tie::IxHash', FS::rate_detail::granularities(); 'fieldorder' => [qw( setup_fee recur_fee recur_temporality unused_credit recur_method cutoff_day + add_full_period cdr_svc_method rating_method ratenum min_charge sec_granularity ignore_unrateable @@ -273,7 +282,7 @@ tie my %granularity, 'Tie::IxHash', FS::rate_detail::granularities(); use_duration 411_rewrite output_format usage_mandate summarize_usage usage_section - bill_every_call + bill_every_call bill_inactive_svcs count_available_phones ) ], @@ -360,18 +369,35 @@ sub calc_usage { my($svc_table, $svc_field) = split('\.', $cdr_svc_method); - foreach my $cust_svc ( - grep { $_->part_svc->svcdb eq $svc_table } $cust_pkg->cust_svc - ) { + my @cust_svc; + if( $self->option('bill_inactive_svcs',1) ) { + #XXX in this mode do we need to restrict the set of CDRs by date also? + @cust_svc = $cust_pkg->h_cust_svc($$sdate, $last_bill); + } + else { + @cust_svc = $cust_pkg->cust_svc; + } + @cust_svc = grep { $_->part_svc->svcdb eq $svc_table } @cust_svc; + + foreach my $cust_svc (@cust_svc) { - my $svc_x = $cust_svc->svc_x; - foreach my $cdr ( - $svc_x->get_cdrs( + my $svc_x; + if( $self->option('bill_inactive_svcs',1) ) { + $svc_x = $cust_svc->h_svc_x($$sdate, $last_bill); + } + else { + $svc_x = $cust_svc->svc_x; + } + my %options = ( 'disable_src' => $self->option('disable_src'), 'default_prefix' => $self->option('default_prefix'), 'status' => '', 'for_update' => 1, - ) # $last_bill, $$sdate ) + ); # $last_bill, $$sdate ) + $options{'by_svcnum'} = 1 if $svc_field eq 'svcnum'; + + foreach my $cdr ( + $svc_x->get_cdrs( %options ) ) { if ( $DEBUG > 1 ) { warn "rating CDR $cdr\n". @@ -561,7 +587,9 @@ sub calc_usage { @call_details = ($cdr->downstream_csv( 'format' => $output_format, 'charge' => $charge, - 'seconds' => $seconds, + 'seconds' => ($use_duration ? + $cdr->duration : + $cdr->billsec), 'granularity' => $granularity, ) ); @@ -685,7 +713,9 @@ sub calc_usage { @call_details = ( $cdr->downstream_csv( 'format' => $output_format, 'granularity' => $rate_detail->sec_granularity, - 'seconds' => $seconds, + 'seconds' => ($use_duration ? + $cdr->duration : + $cdr->billsec), 'charge' => $charge, 'pretty_dst' => $pretty_destnum, 'dst_regionname' => $regionname, @@ -697,7 +727,7 @@ sub calc_usage { if ( $charge > 0 ) { #just use FS::cust_bill_pkg_detail objects? my $call_details; - my $phonenum = $cust_svc->svc_x->phonenum; + my $phonenum = $svc_x->phonenum; if ( scalar(@call_details) == 1 ) { $call_details = @@ -847,7 +877,7 @@ sub check_chargable { return "destination less than $dst_length digits" if $dst_length && length($cdr->dst) < $dst_length && ! ( $opt{'noskip_dst_length_accountcode_tollfree'} - && $cdr->is_tollfree + && $cdr->is_tollfree('accountcode') ); return "lastapp is $opt{'skip_lastapp'}"