1 % if ( $cgi->param('_type') eq 'xml' ) {
2 % my @cols = qw(a b c);
3 % for ( my $row = 0; $row < scalar(@rows); $row++ ) {
5 % if ( exists($data[$col][$row]) ) {
6 <PartII_<% $row + 1 %><% $cols[$col] %>>\
7 <% $data[$col][$row] %>\
8 </PartII_<% $row + 1 %><% $cols[$col] %>>
12 % } else { # HTML mode
13 % # fake up the search-html.html header
16 <TR><TD VALIGN="bottom"><BR></TD></TR>
18 <TABLE CLASS="grid" CELLSPACING=0>
20 % foreach (@headers) {
25 % foreach my $rowhead (@rows) {
26 <TR CLASS="row<% $row % 2 %>">
27 <TD STYLE="text-align: left; font-weight: bold"><% $rowhead %></TD>
28 % for my $col (0..2) {
30 % if ( exists($data[$col][$row]) ) {
31 <% $data[$col][$row] %>
44 my $curuser = $FS::CurrentUser::CurrentUser;
47 unless $curuser->access_right('List packages');
52 $search_hash{'agentnum'} = $cgi->param('agentnum');
53 $search_hash{'state'} = $cgi->param('state');
54 $search_hash{'classnum'} = [ $cgi->param('classnum') ];
55 $search_hash{'active'} = [ $opt{date}, $opt{date} ];
58 foreach ($cgi->param('part2b_row_option')) {
59 push @row_option, (/^\d+$/ ? $_ : undef);
62 my $is_residential = " AND COALESCE(cust_main.company, '') = ''";
63 my $has_report_option = sub {
65 defined($row_option[$_]) ?
67 SELECT 1 FROM part_pkg_option
68 WHERE part_pkg_option.pkgpart = part_pkg.pkgpart
69 AND optionname = 'report_option_" . $row_option[$_]."'
75 # an arrayref for each column
77 # get the skeleton of the query
78 my $sql_query = FS::cust_pkg->search(\%search_hash);
79 my $from_where = $sql_query->{'count_query'};
80 $from_where =~ s/^SELECT COUNT\(\*\) //;
82 my $query_ds0 = "SELECT SUM(COALESCE(part_pkg.fcc_ds0s, pkg_class.fcc_ds0s, 0))
85 my $query_custnum = "SELECT COUNT(DISTINCT cust_pkg.custnum) $from_where";
87 my @base_queries = ($query_ds0, $query_ds0, $query_custnum);
93 $has_report_option->(0), # nomadic
99 $has_report_option->(0..5),
108 foreach (@col_conds) {
111 foreach my $cond (@{ $col_conds[$col] }) {
112 # three parts: the select expression, the VoIP class (column selection),
113 # and the row selection
114 my $query = $base_queries[$col] .
115 " AND part_pkg.fcc_voip_class = '".($col+1)."'
117 my $count = FS::Record->scalar_sql($query) || 0;
119 $col_data[$row] = $count; # the raw count
121 # the rows that are percentages of the raw count
122 if ( $col_data[0] == 0 ) {
123 # 0 out of 0 is not 0%, but supposedly this works
124 $col_data[$row] = '0.000';
126 $col_data[$row] = sprintf('%.3f', 100 * $count / $col_data[0]);
128 $col_data[$row] .= '%' unless $cgi->param('_type') eq 'xml';
132 $data[$col] = \@col_data;