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',
'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,
},
#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',
},
'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
use_duration
411_rewrite
output_format usage_mandate summarize_usage usage_section
- bill_every_call
+ bill_every_call bill_inactive_svcs
count_available_phones
)
],
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".
@call_details = ($cdr->downstream_csv( 'format' => $output_format,
'charge' => $charge,
- 'seconds' => $seconds,
+ 'seconds' => ($use_duration ?
+ $cdr->duration :
+ $cdr->billsec),
'granularity' => $granularity,
)
);
@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,
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 =
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'}"