+sub sum_detail {
+ my $self = shift;
+ my $svc_x = shift;
+ my $invoice_details = shift || [];
+ return () if !@$invoice_details;
+ my $details_by_rate = {};
+ # combine the entire set of CDRs
+ foreach ( @$invoice_details ) {
+ my $d = $_->[0];
+ my $sum = $details_by_rate->{ $d->{ratename} } ||= {
+ amount => 0,
+ format => 'C',
+ classnum => '', #XXX
+ duration => 0,
+ phonenum => $svc_x->phonenum,
+ accountcode => '', #XXX
+ startdate => '', #XXX
+ regionname => '',
+ count => 0,
+ };
+ $sum->{amount} += $d->{amount};
+ $sum->{duration} += $d->{duration};
+ $sum->{count}++;
+ }
+ my @details;
+ foreach my $ratename ( sort keys(%$details_by_rate) ) {
+ my $sum = $details_by_rate->{$ratename};
+ next if $sum->{count} == 0;
+ my $total_cdr = FS::cdr->new({
+ 'billsec' => $sum->{duration},
+ 'src' => $sum->{phonenum},
+ });
+ $sum->{detail} = $total_cdr->downstream_csv(
+ format => $self->option('output_format'),
+ seconds => $sum->{duration},
+ charge => sprintf('%.2f',$sum->{amount}),
+ ratename => $ratename,
+ phonenum => $sum->{phonenum},
+ count => $sum->{count},
+ );
+ push @details, $sum;
+ }
+ @details;
+}
+