summaryrefslogtreecommitdiff
path: root/FS
diff options
context:
space:
mode:
authorMark Wells <mark@freeside.biz>2016-06-02 09:17:48 -0700
committerMark Wells <mark@freeside.biz>2016-06-02 09:18:02 -0700
commit0b01125393fc9e50eb77a17498046b6fca192a61 (patch)
tree74d427404d75efcb1c23f50a7acdf1c6c906c44e /FS
parentf13e22aab920cd6fab70319acc1291c083d0f151 (diff)
new CDR detail format to summarize by accountcode, #37808
Diffstat (limited to 'FS')
-rw-r--r--FS/FS/cdr.pm8
-rw-r--r--FS/FS/detail_format/sum_duration_accountcode.pm69
2 files changed, 77 insertions, 0 deletions
diff --git a/FS/FS/cdr.pm b/FS/FS/cdr.pm
index df16c7fda..a2b9a8ccb 100644
--- a/FS/FS/cdr.pm
+++ b/FS/FS/cdr.pm
@@ -1264,6 +1264,10 @@ my %export_names = (
'name' => 'Number of calls, one line per service',
'invoice_header' => 'Caller,Rate,Messages,Price',
},
+ 'sum_duration' => {
+ 'name' => 'Summary, one line per service',
+ 'invoice_header' => 'Caller,Rate,Calls,Minutes,Price',
+ },
'sum_duration_prefix' => {
'name' => 'Summary, one line per destination prefix',
'invoice_header' => 'Caller,Rate,Calls,Minutes,Price',
@@ -1272,6 +1276,10 @@ my %export_names = (
'name' => 'Summary, one line per usage class',
'invoice_header' => 'Caller,Class,Calls,Price',
},
+ 'sum_duration_accountcode' => {
+ 'name' => 'Summary, one line per accountcode',
+ 'invoice_header' => 'Caller,Rate,Calls,Minutes,Price',
+ },
);
my %export_formats = ();
diff --git a/FS/FS/detail_format/sum_duration_accountcode.pm b/FS/FS/detail_format/sum_duration_accountcode.pm
new file mode 100644
index 000000000..d181d474c
--- /dev/null
+++ b/FS/FS/detail_format/sum_duration_accountcode.pm
@@ -0,0 +1,69 @@
+package FS::detail_format::sum_duration_accountcode;
+
+use strict;
+use vars qw( $DEBUG );
+use base qw(FS::detail_format);
+
+$DEBUG = 0;
+
+my $me = '[sum_duration_accountcode]';
+
+sub name { 'Summary, one line per accountcode' };
+
+sub header_detail {
+ 'Account code,Calls,Duration,Price';
+}
+
+sub append {
+ my $self = shift;
+ my $codes = ($self->{codes} ||= {});
+ my $acctids = ($self->{acctids} ||= []);
+ foreach my $cdr (@_) {
+ my $accountcode = $cdr->accountcode || 'other';
+
+ my $object = $self->{inbound} ? $cdr->cdr_termination(1) : $cdr;
+ my $subtotal = $codes->{$accountcode}
+ ||= { count => 0, duration => 0, amount => 0.0 };
+ $subtotal->{count}++;
+ $subtotal->{duration} += $object->rated_seconds;
+ $subtotal->{amount} += $object->rated_price
+ if $object->freesidestatus ne 'no-charge';
+
+ push @$acctids, $cdr->acctid;
+ }
+}
+
+sub finish {
+ my $self = shift;
+ my $codes = $self->{codes};
+ foreach my $accountcode (sort { $a cmp $b } keys %$codes) {
+
+ warn "processing $accountcode\n" if $DEBUG;
+
+ my $subtotal = $codes->{$accountcode};
+
+ $self->csv->combine(
+ $accountcode,
+ $subtotal->{count},
+ sprintf('%.01f min', $subtotal->{duration}/60),
+ $self->money_char . sprintf('%.02f', $subtotal->{amount})
+ );
+
+ warn "adding detail: ".$self->csv->string."\n" if $DEBUG;
+
+ push @{ $self->{buffer} }, FS::cust_bill_pkg_detail->new({
+ amount => $subtotal->{amount},
+ format => 'C',
+ classnum => '', #ignored in this format
+ duration => $subtotal->{duration},
+ phonenum => '', # not divided up per service
+ accountcode => $accountcode,
+ startdate => '',
+ regionname => '',
+ detail => $self->csv->string,
+ acctid => $self->{acctids},
+ });
+ } #foreach $accountcode
+}
+
+1;