use FS::Record qw(qsearchs qsearch);
use FS::cdr;
use FS::rate_detail;
+use FS::detail_format;
$DEBUG = 0;
}
-sub calc_cancel {
- my $self = shift;
- my($cust_pkg, $sdate, $details, $param ) = @_;
-
- $self->calc_usage(@_);
-}
+# use the default
+#sub calc_cancel {
+# my $self = shift;
+# my($cust_pkg, $sdate, $details, $param ) = @_;
+#
+# $self->calc_usage(@_);
+#}
#false laziness w/voip_sqlradacct calc_recur resolve it if that one ever gets used again
my $included_min = $self->option('min_included', 1) || 0;
my $use_duration = $self->option('use_duration');
my $output_format = $self->option('output_format', 1) || 'default';
+
+ my $formatter =
+ FS::detail_format->new($output_format, buffer => $details, inbound => 1);
+
my $granularity = length($self->option('sec_granularity'))
? $self->option('sec_granularity')
: 60;
) {
my $svc_phone = $cust_svc->svc_x;
- foreach my $cdr ( $svc_phone->get_cdrs(
+ my $cdr_search = $svc_phone->psearch_cdrs(
'inbound' => 1,
'default_prefix' => $self->option('default_prefix'),
'status' => '', # unprocessed only
'for_update' => 1,
- )
- ) {
+ );
+ $cdr_search->limit(1000);
+ $cdr_search->increment(0);
+ while ( my $cdr = $cdr_search->fetch ) {
my $reason = $self->check_chargable( $cdr,
'option_cache' => \%opt_cache,
);
if ( $reason ) {
warn "not charging for CDR ($reason)\n" if $DEBUG;
+ $cdr_search->adjust(1);
next;
}
'granularity' => $granularity,
)
);
- push @$details,
- { format => 'C',
- detail => $call_details[0],
- amount => $charge,
- classnum => $cdr->calltypenum, #classnum
- #phonenum => $self->phonenum,
- accountcode => $cdr->accountcode,
- startdate => $cdr->startdate,
- duration => $seconds,
- # regionname?? => '', #regionname, not set for inbound calls
- };
- }
-
- my $error = $cdr->set_status_and_rated_price( 'done',
- $charge,
- $cust_svc->svcnum,
- 'inbound' => 1 );
- die $error if $error;
+# push @$details,
+# { format => 'C',
+# detail => $call_details[0],
+# amount => $charge,
+# classnum => $cdr->calltypenum, #classnum
+# #phonenum => $self->phonenum,
+# accountcode => $cdr->accountcode,
+# startdate => $cdr->startdate,
+# duration => $seconds,
+# # regionname?? => '', #regionname, not set for inbound calls
+# };
+ }
+
+ # eventually use FS::cdr::rate for this
+ my $error = $cdr->set_status_and_rated_price(
+ 'done',
+ $charge,
+ $cust_svc->svcnum,
+ 'rated_seconds' => $use_duration ? $cdr->duration : $cdr->billsec,
+ 'rated_granularity' => $granularity,
+ 'rated_classnum' => $cdr->calltypenum,
+ 'inbound' => 1,
+ );
+ die $error if $error;
+ $formatter->append($cdr);
+
+ $cdr_search->adjust(1) if $cdr->freesidestatus eq '';
} #$cdr
} # $cust_svc
- unshift @$details, { format => 'C',
- detail => FS::cdr::invoice_header($output_format),
- }
- if @$details;
+# unshift @$details, { format => 'C',
+# detail => FS::cdr::invoice_header($output_format),
+# }
+# if @$details;
+
+ $formatter->finish;
+ unshift @$details, $formatter->header if @$details;
$charges;
}