fixup 477 XML output
[freeside.git] / httemplate / search / 477partIA_detail.html
1 <% include( 'elements/search.html',
2                   'html_init'        => $html_init,
3                   'name'             => 'lines',
4                   'query'            => $query,
5                   'count_query'      => $count_query,
6                   'really_disable_download' => 1,
7                   'disable_download' => 1,
8                   'nohtmlheader'     => 1,
9                   'disable_total'    => 1,
10                   'header'           => [ '', @column_option_name ],
11                   'xml_elements'     => [ @xml_elements ],
12                   'fields'           => [  @fields ],
13               )
14 %>
15 <%init>
16
17 my $curuser = $FS::CurrentUser::CurrentUser;
18
19 die "access denied"
20   unless $curuser->access_right('List packages');
21
22 my %opt = @_;
23 my %search_hash = ();
24   
25 for ( qw(agentnum magic classnum) ) {
26   $search_hash{$_} = $cgi->param($_) if $cgi->param($_);
27 }
28
29 my @column_option = grep { /^\d+/ } $cgi->param('part1_column_option')
30   if $cgi->param('part1_column_option');
31
32 my @row_option = grep { /^\d+/ } $cgi->param('part1_row_option')
33   if $cgi->param('part1_row_option');
34
35 my @technology_option = &FS::Report::FCC_477::parse_technology_option($cgi);
36
37 my @column_option_name = scalar(@column_option)
38   ? ( map { my $part_pkg_report_option = 
39               qsearchs({ 'table' => 'part_pkg_report_option',
40                          'hashref' => { num => $_ },
41                       });
42             $part_pkg_report_option ? $part_pkg_report_option->name
43                                     : 'no such report option';
44           } @column_option
45     )
46   : ( 'all packages' );
47
48 my $where = join(' OR ', map { "num = $_" } @row_option );
49 my %row_option_name = $where ?
50                         ( map { $_->num => $_->name }
51                           qsearch({ 'table' => 'part_pkg_report_option',
52                                     'hashref' => {},
53                                     'extra_sql' => "WHERE $where",
54                                  })
55                         ) :
56                         ();
57
58 my $tech_code = $opt{tech_code};
59 my $technology = $FS::Report::FCC_477::technology[$tech_code] || 'unknown';
60 my $html_init = "<H2>Part IA $technology breakdown by speeds</H2>";
61 my $xml_prefix = 'PartIA_'. chr(65 + $tech_code);
62
63 if ($cgi->param('_type') eq 'xml') {
64   #rotate data pi/2
65   my @temp = @column_option;
66   @column_option = @row_option;
67   @row_option = @temp;
68 }
69
70 my $query = 'SELECT '. join(' UNION ALL SELECT ',@row_option);
71 my $count_query = 'SELECT '. scalar(@row_option);
72
73 my $value = sub {
74   my ($rowref, $column) = (shift, shift);
75   my $row = $rowref->[0];
76
77   if ($column eq 'name') {
78     return $row_option_name{$row} || 'no such report option';
79   } elsif ( $column =~ /^(\d+)$/ ) {
80     my @report_option = ( $row || '',
81                           $column_option[$1 - 2] || '',
82                           $technology_option[$tech_code] || '',
83                         );
84
85     my ( $count, $residential ) = FS::cust_pkg->fcc_477_count(
86       { %search_hash, 'report_option' => join(',', @report_option) }
87     );
88
89     my $percentage = sprintf('%.2f', $count ? 100 * $residential / $count : 0);
90     my $return = $count;
91     $return .= "<BR>$percentage% residential"
92       unless $cgi->param('_type') eq 'xml';
93     return $return;
94   } else {
95     return '<FONT SIZE="+1" COLOR="#ff0000">Bad call to column_value</FONT>';
96   }
97 };
98
99 my @fields = (
100   sub { &{$value}(shift, 'name');},
101   sub { &{$value}(shift, 2);},
102   sub { &{$value}(shift, 3);},
103   sub { &{$value}(shift, 4);},
104   sub { &{$value}(shift, 5);},
105   sub { &{$value}(shift, 6);},
106   sub { &{$value}(shift, 7);},
107   sub { &{$value}(shift, 8);},
108   sub { &{$value}(shift, 9);},
109  );
110 shift @fields if $cgi->param('_type') eq 'xml';
111
112 my $rowchar = 102; # 'f' -- rows are columns! (pi/2)
113 my $opentag = 0;
114 my $xml_element = sub {
115   my ($rowref, $column) = (shift, shift);
116   my $row = chr($rowchar);
117
118   if ($column == 8) {
119     $opentag++;
120     if ($opentag > 1) { # a new row
121       $rowchar++;
122       $opentag = 0;
123     }
124   }
125
126   $xml_prefix. $row. $column;
127
128 };
129
130 my @xml_elements = (
131   sub { &{$xml_element}(shift, '1') },
132   sub { &{$xml_element}(shift, '2') },
133   sub { &{$xml_element}(shift, '3') },
134   sub { &{$xml_element}(shift, '4') },
135   sub { &{$xml_element}(shift, '5') },
136   sub { &{$xml_element}(shift, '6') },
137   sub { &{$xml_element}(shift, '7') },
138   sub { &{$xml_element}(shift, '8') },
139 );
140
141 </%init>