&& ( $last_bill eq '' || $last_bill == 0 );
my $included_min = $self->option('min_included', 1) || 0;
+ $included_min *= ($cust_pkg->quantity || 1);
my $cdr_svc_method = $self->option('cdr_svc_method',1)||'svc_phone.phonenum';
my $cdr_inout = ($cdr_svc_method eq 'svc_phone.phonenum')
&& $self->option('cdr_inout',1)
my %options = (
'disable_src' => $self->option('disable_src'),
'default_prefix' => $self->option('default_prefix'),
+ 'cdrtypenum' => $self->option('use_cdrtypenum'),
'status' => '',
'for_update' => 1,
); # $last_bill, $$sdate )
$options{'inbound'} = ( $pass eq 'inbound' );
- foreach my $cdr (
- $svc_x->get_cdrs( %options )
- ) {
+ my $cdr_search = $svc_x->psearch_cdrs(%options);
+ $cdr_search->limit(1000);
+ $cdr_search->increment(0);
+ while ( my $cdr = $cdr_search->fetch ) {
+
if ( $DEBUG > 1 ) {
warn "rating CDR $cdr\n".
join('', map { " $_ => ". $cdr->{$_}. "\n" } keys %$cdr );
$total += $charge_min;
+ $cdr_search->adjust(1) if $cdr->freesidestatus eq '';
+
} # $cdr
} # $pass
my $output_format = $self->option('output_format', 'Hush!') || 'default';
- my $csv = new Text::CSV_XS;
+ my $formatter = FS::detail_format->new($output_format,
+ buffer => $details,
+ rounding => ($self->option_cacheable('rounding') || 2))
+ ;
my $charges = 0;
- my @invoice_details_sort;
$options{'status'} = 'processing-tiered';
foreach my $pass (split('_', $cdr_inout)) {
$options{'inbound'} = ( $pass eq 'inbound' );
+ # tell the formatter what we're sending it
+ $formatter->inbound($options{'inbound'});
- foreach my $cdr (
- $svc_x->get_cdrs( %options )
- ) {
+ my $cdr_search = $svc_x->psearch_cdrs(%options);
+ $cdr_search->limit(1000);
+ $cdr_search->increment(0);
+ while ( my $cdr = $cdr_search->fetch ) {
my $object = $options{'inbound'}
? $cdr->cdr_termination( 1 ) #1: inbound
if ( $charge > 0 ) {
$charges += $charge;
-
- my $detail = $self->sum_usage ? '' :
- $cdr->downstream_csv( 'format' => $output_format,
- 'charge' => $charge,
- 'seconds' => ($use_duration ?
- $cdr->duration :
- $cdr->billsec),
- 'granularity' => $granularity,
- );
-
- my $call_details =
- { format => 'C',
- detail => $detail,
- amount => $charge,
- #classnum => $cdr->calltypenum, #classnum
- #phonenum => $phonenum, #XXX need this to sort on them
- accountcode => $cdr->accountcode,
- startdate => $cdr->startdate,
- duration => $object->rated_seconds,
- };
-
- #warn " adding details on charge to invoice: [ ".
- # join(', ', @{$call_details} ). " ]"
- # if ( $DEBUG && ref($call_details) );
- push @invoice_details_sort, [ $call_details, $cdr->calldate_unix ];
}
my $error = $cdr->set_status_and_rated_price(
);
die $error if $error;
+ $formatter->append($cdr);
+
+ $cdr_search->adjust(1) if $cdr->freesidestatus eq 'processing-tiered';
+
} # $cdr
} # $pass
- if ( $self->sum_usage ) {
- # then summarize all accumulated details within this svc_x
- # and then flush them
- push @$details, $self->sum_detail($svc_x, \@invoice_details_sort);
- @invoice_details_sort = ();
- }
-
} # $cust_svc
- if ( !$self->sum_usage ) {
- #sort them
- my @sorted_invoice_details =
- sort { ${$a}[1] <=> ${$b}[1] } @invoice_details_sort;
- foreach my $sorted_call_detail ( @sorted_invoice_details ) {
- push @$details, ${$sorted_call_detail}[0];
- }
- }
-
- unshift @$details, { format => 'C',
- detail => FS::cdr::invoice_header($output_format),
- }
- if @$details;
+ $formatter->finish;
+ unshift @$details, $formatter->header if @$details;
$charges;
}