summaryrefslogtreecommitdiff
path: root/FS/FS/detail_format/sum_count_class.pm
blob: 749d45288904edaf6c13e105b8c110d2a5efacb6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
package FS::detail_format::sum_count_class;

use strict;
use vars qw( $DEBUG );
use base qw(FS::detail_format);
use FS::Record qw(qsearchs);
use FS::cust_svc;
use FS::svc_Common; # for label

$DEBUG = 0;

sub name { 'Summary, one line per service and usage class' };

sub header_detail {
  my $self = shift;
  if ( $self->{inbound} ) {
    'Destination,Charge Class,Quantity,Price'
  }
  else {
    'Source,Charge Class,Quantity,Price'
  }
}

sub append {
  my $self = shift;
  my $svcnums = ($self->{svcnums} ||= {});
  my $acctids = $self->{acctids} ||= {};
  foreach my $cdr (@_) {
    my $object = $self->{inbound} ? $cdr->cdr_termination(1) : $cdr;
    my $svcnum = $object->svcnum; # yes, $object->svcnum.

    my $subtotal = ($svcnums->{$svcnum}->{$cdr->rated_classnum} ||=
      { count => 0, duration => 0, amount => 0 });
    $subtotal->{count}++;
    $subtotal->{duration} += $object->rated_seconds;
    $subtotal->{amount} += $object->rated_price
      if $object->freesidestatus ne 'no-charge';

    my $these_acctids = $acctids->{$cdr->rated_classnum} ||= [];
    push @$these_acctids, $cdr->acctid;
  }
}

sub finish {
  my $self = shift;
  my $svcnums = $self->{svcnums};
  my $buffer = $self->{buffer};
  foreach my $svcnum (keys %$svcnums) {

    my $classnums = $svcnums->{$svcnum};

    my $cust_svc = qsearchs('cust_svc', { svcnum => $svcnum })
      or die "svcnum #$svcnum not found";
    my $phonenum = $cust_svc->svc_x->label;
    warn "processing $phonenum\n" if $DEBUG;

    foreach my $classnum (keys %$classnums) {
      my $subtotal = $classnums->{$classnum};
      next if $subtotal->{amount} < 0.01;
      my $classname = ($classnum ?
                        FS::usage_class->by_key($classnum)->classname :
                        '');
      $self->csv->combine(
        $phonenum,
        $classname,
        $subtotal->{count},
        $self->money_char . sprintf('%.02f',$subtotal->{amount}),
      );

      warn "adding detail: ".$self->csv->string."\n" if $DEBUG;

      push @$buffer, FS::cust_bill_pkg_detail->new({
          amount      => $subtotal->{amount},
          format      => 'C',
          classnum    => $classnum,
          duration    => $subtotal->{duration},
          phonenum    => $phonenum,
          accountcode => '', #ignored in this format
          startdate   => '', #could use the earliest startdate in the bunch?
          regionname  => '',
          detail      => $self->csv->string,
          acctid      => $self->{acctids}->{$classnum},
      });
    } #foreach $classnum
  } #foreach $svcnum

  # supposedly the compiler is smart enough to do this in place
  @$buffer = sort { $a->{Hash}->{phonenum} cmp $b->{Hash}->{phonenum} or
                    $a->{Hash}->{classnum} <=> $b->{Hash}->{classnum} } 
              @$buffer;
}

1;