delete fees, RT#81713
[freeside.git] / FS / FS / detail_format / sum_count_class.pm
1 package FS::detail_format::sum_count_class;
2
3 use strict;
4 use vars qw( $DEBUG );
5 use base qw(FS::detail_format);
6 use FS::Record qw(qsearchs);
7 use FS::cust_svc;
8 use FS::svc_Common; # for label
9
10 $DEBUG = 0;
11
12 sub name { 'Summary, one line per service and usage class' };
13
14 sub header_detail {
15   my $self = shift;
16   if ( $self->{inbound} ) {
17     'Destination,Charge Class,Quantity,Price'
18   }
19   else {
20     'Source,Charge Class,Quantity,Price'
21   }
22 }
23
24 sub append {
25   my $self = shift;
26   my $svcnums = ($self->{svcnums} ||= {});
27   my $acctids = $self->{acctids} ||= {};
28   foreach my $cdr (@_) {
29     my $object = $self->{inbound} ? $cdr->cdr_termination(1) : $cdr;
30     my $svcnum = $object->svcnum; # yes, $object->svcnum.
31
32     my $subtotal = ($svcnums->{$svcnum}->{$cdr->rated_classnum} ||=
33       { count => 0, duration => 0, amount => 0 });
34     $subtotal->{count}++;
35     $subtotal->{duration} += $object->rated_seconds;
36     $subtotal->{amount} += $object->rated_price
37       if $object->freesidestatus ne 'no-charge';
38
39     my $these_acctids = $acctids->{$cdr->rated_classnum} ||= [];
40     push @$these_acctids, $cdr->acctid;
41   }
42 }
43
44 sub finish {
45   my $self = shift;
46   my $svcnums = $self->{svcnums};
47   my $buffer = $self->{buffer};
48   foreach my $svcnum (keys %$svcnums) {
49
50     my $classnums = $svcnums->{$svcnum};
51
52     my $cust_svc = qsearchs('cust_svc', { svcnum => $svcnum })
53       or die "svcnum #$svcnum not found";
54     my $phonenum = $cust_svc->svc_x->label;
55     warn "processing $phonenum\n" if $DEBUG;
56
57     foreach my $classnum (keys %$classnums) {
58       my $subtotal = $classnums->{$classnum};
59       next if $subtotal->{amount} < 0.01;
60       my $classname = ($classnum ?
61                         FS::usage_class->by_key($classnum)->classname :
62                         '');
63       $self->csv->combine(
64         $phonenum,
65         $classname,
66         $subtotal->{count},
67         $self->money_char . sprintf('%.02f',$subtotal->{amount}),
68       );
69
70       warn "adding detail: ".$self->csv->string."\n" if $DEBUG;
71
72       push @$buffer, FS::cust_bill_pkg_detail->new({
73           amount      => $subtotal->{amount},
74           format      => 'C',
75           classnum    => $classnum,
76           duration    => $subtotal->{duration},
77           phonenum    => $phonenum,
78           accountcode => '', #ignored in this format
79           startdate   => '', #could use the earliest startdate in the bunch?
80           regionname  => '',
81           detail      => $self->csv->string,
82           acctid      => $self->{acctids}->{$classnum},
83       });
84     } #foreach $classnum
85   } #foreach $svcnum
86
87   # supposedly the compiler is smart enough to do this in place
88   @$buffer = sort { $a->{Hash}->{phonenum} cmp $b->{Hash}->{phonenum} or
89                     $a->{Hash}->{classnum} <=> $b->{Hash}->{classnum} } 
90               @$buffer;
91 }
92
93 1;