summaryrefslogtreecommitdiff
path: root/FS
diff options
context:
space:
mode:
authormark <mark>2011-12-13 20:40:28 +0000
committermark <mark>2011-12-13 20:40:28 +0000
commitc0049ff53677ec701570992a585ae779807b5d1a (patch)
tree8de790dbf45508253178bccdea025bc609bf6e0b /FS
parentb4e0275bb2074630cea6fc2658d73aedcd29b239 (diff)
CDR type separation and summary formats, #15535
Diffstat (limited to 'FS')
-rw-r--r--FS/FS/cdr.pm23
-rw-r--r--FS/FS/cust_bill_pkg.pm4
-rw-r--r--FS/FS/part_pkg.pm3
-rw-r--r--FS/FS/part_pkg/voip_cdr.pm88
-rw-r--r--FS/FS/svc_pbx.pm10
-rw-r--r--FS/FS/svc_phone.pm8
6 files changed, 116 insertions, 20 deletions
diff --git a/FS/FS/cdr.pm b/FS/FS/cdr.pm
index 1507dde..190ffe2 100644
--- a/FS/FS/cdr.pm
+++ b/FS/FS/cdr.pm
@@ -573,6 +573,14 @@ my %export_names = (
'name' => 'Default with description field as destination',
'invoice_header' => 'Caller,Date,Time,Number,Destination,Duration,Price',
},
+ 'sum_duration' => {
+ 'name' => 'Summary (one line per service, with duration)',
+ 'invoice_header' => 'Caller,Calls,Minutes,Price',
+ },
+ 'sum_count' => {
+ 'name' => 'Summary (one line per service, with count)',
+ 'invoice_header' => 'Caller,Messages,Price',
+ },
);
my %export_formats = ();
@@ -622,6 +630,19 @@ sub export_formats {
#sub { sprintf('%.3f', shift->upstream_price ) }, #PRICE
sub { my($cdr, %opt) = @_; $opt{money_char}. $opt{charge}; }, #PRICE
],
+ 'sum_duration' => [
+ # for summary formats, the CDR is a fictitious object containing the
+ # total billsec and the phone number of the service
+ 'src',
+ sub { my($cdr, %opt) = @_; $opt{count} },
+ sub { my($cdr, %opt) = @_; int($opt{seconds}/60).'m' },
+ sub { my($cdr, %opt) = @_; $opt{money_char}. $opt{charge}; },
+ ],
+ 'sum_count' => [
+ 'src',
+ sub { my($cdr, %opt) = @_; $opt{count} },
+ sub { my($cdr, %opt) = @_; $opt{money_char}. $opt{charge}; },
+ ],
'basic' => [
sub { time2str('%d %b - %I:%M %p', shift->calldate_unix) },
'dst',
@@ -672,6 +693,8 @@ sub export_formats {
=item downstream_csv OPTION => VALUE ...
+Returns a string of formatted call details for display on an invoice.
+
Options:
format
diff --git a/FS/FS/cust_bill_pkg.pm b/FS/FS/cust_bill_pkg.pm
index 267804b..8d79ed5 100644
--- a/FS/FS/cust_bill_pkg.pm
+++ b/FS/FS/cust_bill_pkg.pm
@@ -916,9 +916,9 @@ sub usage_classes {
my %seen = ();
foreach my $detail ( grep { ref($_) } @{$self->get('details')} ) {
- $seen{ ref($detail) eq 'HASH'
+ $seen{ (ref($detail) eq 'HASH'
? $detail->{'classnum'}
- : $detail->[3]
+ : $detail->[3]) || ''
} = 1;
}
keys %seen;
diff --git a/FS/FS/part_pkg.pm b/FS/FS/part_pkg.pm
index 44db547..ed5fa96 100644
--- a/FS/FS/part_pkg.pm
+++ b/FS/FS/part_pkg.pm
@@ -1296,6 +1296,9 @@ sub calc_units { 0; }
#fallback for everything except bulk.pm
sub hide_svc_detail { 0; }
+#fallback for packages that can't/won't summarize usage
+sub sum_usage { 0; }
+
=item recur_cost_permonth CUST_PKG
recur_cost divided by freq (only supported for monthly and longer frequencies)
diff --git a/FS/FS/part_pkg/voip_cdr.pm b/FS/FS/part_pkg/voip_cdr.pm
index e047b02..747965b 100644
--- a/FS/FS/part_pkg/voip_cdr.pm
+++ b/FS/FS/part_pkg/voip_cdr.pm
@@ -403,6 +403,7 @@ sub calc_usage {
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 )
@@ -434,6 +435,8 @@ sub calc_usage {
if ( $rating_method eq 'prefix' ) {
my $da_rewrote = 0;
+ # this will result in those CDRs being marked as done... is that
+ # what we want?
if ( length($cdr->dst) && grep { $cdr->dst eq $_ } @dirass ){
$cdr->dst('411');
$da_rewrote = 1;
@@ -448,6 +451,8 @@ sub calc_usage {
warn "not charging for CDR ($reason)\n" if $DEBUG;
$charge = 0;
+ # this will result in those CDRs being marked as done... is that
+ # what we want?
} else {
@@ -767,17 +772,19 @@ sub calc_usage {
warn "Incrementing \$charges by $charge. Now $charges\n" if $DEBUG;
$charges += $charge;
- @call_details = (
- $cdr->downstream_csv( 'format' => $output_format,
- 'granularity' => $rate_detail->sec_granularity,
- 'seconds' => ($use_duration ?
- $cdr->duration :
- $cdr->billsec),
- 'charge' => $charge,
- 'pretty_dst' => $pretty_destnum,
- 'dst_regionname' => $regionname,
- )
- );
+ if ( !$self->sum_usage ) {
+ @call_details = (
+ $cdr->downstream_csv( 'format' => $output_format,
+ 'granularity' => $rate_detail->sec_granularity,
+ 'seconds' => ($use_duration ?
+ $cdr->duration :
+ $cdr->billsec),
+ 'charge' => $charge,
+ 'pretty_dst' => $pretty_destnum,
+ 'dst_regionname' => $regionname,
+ )
+ );
+ }
} #if(there is a rate_detail)
@@ -799,6 +806,7 @@ sub calc_usage {
regionname => $regionname,
};
} else { #only used for $rating_method eq 'upstream' now
+ # and for sum_ formats
$csv->combine(@call_details);
$call_details =
{ format => 'C',
@@ -812,9 +820,6 @@ sub calc_usage {
regionname => $regionname,
};
}
- #warn " adding details on charge to invoice: [ ".
- # join(', ', @{$call_details} ). " ]"
- # if ( $DEBUG && ref($call_details) );
push @invoice_details_sort, [ $call_details, $cdr->calldate_unix ];
}
@@ -833,11 +838,44 @@ sub calc_usage {
}
} # $cdr
-
- my @sorted_invoice_details = sort { @{$a}[1] <=> @{$b}[1] } @invoice_details_sort;
- foreach my $sorted_call_detail ( @sorted_invoice_details ) {
+
+ 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];
+ }
}
+ else { #$self->sum_usage
+ my $sum_detail = {
+ amount => 0,
+ format => 'C',
+ classnum => '', #XXX
+ duration => 0,
+ phonenum => $svc_x->phonenum,
+ accountcode => '', #XXX
+ startdate => '', #XXX
+ regionnam => '',
+ };
+ # combine the entire set of CDRs
+ foreach ( @invoice_details_sort ) {
+ $sum_detail->{amount} += $_->[0]{amount};
+ $sum_detail->{duration} += $_->[0]{duration};
+ }
+ my $total_cdr = FS::cdr->new({
+ 'billsec' => $sum_detail->{duration},
+ 'src' => $sum_detail->{phonenum},
+ });
+ $sum_detail->{detail} = $total_cdr->downstream_csv(
+ format => $output_format,
+ seconds => $sum_detail->{duration},
+ charge => sprintf('%.2f',$sum_detail->{amount}),
+ phonenum => $sum_detail->{phonenum},
+ count => scalar(@invoice_details_sort),
+ );
+ push @$details, $sum_detail;
+ } #if $self->sum_usage
} # $cust_svc
@@ -924,6 +962,7 @@ sub check_chargable {
&& $cdr->carrierid ne $opt{'use_carrierid'} #ne otherwise 0 matches ''
&& ! $flags{'da_rewrote'};
+ # unlike everything else, use_cdrtypenum is applied in FS::svc_x::get_cdrs.
return "cdrtypenum != $opt{'use_cdrtypenum'}"
if length($opt{'use_cdrtypenum'})
&& $cdr->cdrtypenum ne $opt{'use_cdrtypenum'}; #ne otherwise 0 matches ''
@@ -1000,5 +1039,20 @@ sub calc_units {
$count;
}
+# tells whether cust_bill_pkg_detail should return a single line for
+# each phonenum
+sub sum_usage {
+ my $self = shift;
+ $self->option('output_format') =~ /^sum_/;
+}
+
+# and whether cust_bill should show a detail line for the service label
+# (separate from usage details)
+sub hide_svc_detail {
+ my $self = shift;
+ $self->option('output_format') =~ /^sum_/;
+}
+
+
1;
diff --git a/FS/FS/svc_pbx.pm b/FS/FS/svc_pbx.pm
index 093eacd..37ab174 100644
--- a/FS/FS/svc_pbx.pm
+++ b/FS/FS/svc_pbx.pm
@@ -283,6 +283,10 @@ with the chosen prefix.
=item by_svcnum => 1: Select CDRs where the svcnum field matches, instead of
title/charged_party. Normally this field is set after processing.
+=item begin, end: Start and end of date range, as unix timestamp.
+
+=item cdrtypenum: Only return CDRs with this type number.
+
=back
=cut
@@ -295,7 +299,11 @@ sub get_cdrs {
my @fields = ( 'charged_party' );
$hash{'freesidestatus'} = $options{'status'}
if exists($options{'status'});
-
+
+ if ($options{'cdrtypenum'}) {
+ $hash{'cdrtypenum'} = $options{'cdrtypenum'};
+ }
+
my $for_update = $options{'for_update'} ? 'FOR UPDATE' : '';
if ( $options{'by_svcnum'} ) {
diff --git a/FS/FS/svc_phone.pm b/FS/FS/svc_phone.pm
index e3d18e0..e8b0d0a 100644
--- a/FS/FS/svc_phone.pm
+++ b/FS/FS/svc_phone.pm
@@ -658,6 +658,10 @@ on inbound processing status.
=item default_prefix => "XXX": Also accept the phone number of the service prepended
with the chosen prefix.
+=item begin, end: Start and end of a date range, as unix timestamp.
+
+=item cdrtypenum: Only return CDRs with this type number.
+
=item disable_src => 1: Only match on "charged_party", not "src".
=item by_svcnum: not supported for svc_phone
@@ -696,6 +700,10 @@ sub get_cdrs {
$hash{'freesidestatus'} = $options{'status'}
if exists($options{'status'});
}
+
+ if ($options{'cdrtypenum'}) {
+ $hash{'cdrtypenum'} = $options{'cdrtypenum'};
+ }
my $for_update = $options{'for_update'} ? 'FOR UPDATE' : '';