<& /elements/header.html, $title &> % foreach my $partname (@partnames) { % my $this_part = $parts{$partname}; % $cgi->param('parts', $partname); % $cgi->param('type', 'csv'); % my $header = ".header_$partname"; % my $data = $this_part->{data}; % my $error = $this_part->{error}; <& $header &> % my $rownum = 0; % foreach my $row (@$data) { % my %eh; # error hash % if ( $error->[$rownum] ) { % %eh = %{ $error->[$rownum] }; % } > % my $first = 1; % foreach my $item (@$row) { % } #foreach $item % # display errors % if ( keys %eh ) { % } # if there are errors % $rownum++; % } #foreach $row
<% $part_titles->{$partname} %> % if ( $this_part->{num_errors} > 0 ) { % # disable downloading while it contains errors <% emt('This section contains [quant,_1,error].', $this_part->{num_errors}) %> % } else { Download % }
% if ($first and $part_link{$partname}) { "><% $item || '(empty)' %> % $first = 0; % } else { <% $item %> % }
    % foreach my $key (sort keys %eh) {
  • <% $eh{$key} %>
  • % }
% } # foreach $partname <& /elements/footer.html &> <%init> die "access denied" unless $FS::CurrentUser::CurrentUser->access_right('List packages'); my %parts; my %part_link; # load from cache if possible my $session; if ( $cgi->param('session') =~ /^(\d+)$/ ) { $session = $1; %parts = %{ $m->cache->get($session) }; } else { $session = sprintf('%010d%06d', time, int(rand(1000000))); $cgi->param('session', $session); } my $agentnum; if ($cgi->param('agentnum') =~ /^(\d+)$/ ) { $agentnum = $1; } my $date = parse_datetime($cgi->param('date')) || time; my @partnames = grep /^\w+$/, $cgi->param('parts'); my $ignore_quantity = ($cgi->param('ignore_quantity') ? 1 : 0); foreach my $partname (@partnames) { $parts{$partname} ||= FS::Report::FCC_477->report( $partname, date => $date, agentnum => $agentnum, ignore_quantity => $ignore_quantity, ); # includes error, detail, and data parts my $detail_table = FS::Report::FCC_477->part_table($partname); if ($detail_table eq 'cust_pkg') { my $link = popurl(1).'477_cust_pkg.html?477part='.$partname.";date=$date;"; if ($agentnum) { $link .= "agentnum=$agentnum;"; } $part_link{$partname} = $link; } # don't include detail links to deploy_blocks, that's pointless } $m->cache->set($session, \%parts, '1h'); my $title = 'FCC Form 477 Data - ' . time2str('%b %o, %Y', $date); if ( $cgi->param('type') eq 'csv' ) { my $partname = $partnames[0]; # ignore any beyond the first my $data = $parts{$partname}->{data}; my $csv = Text::CSV_XS->new({ eol => "\r\n" }); # i think my $filename = time2str('%Y-%m-%d', $date) . '-'. $partname . '.csv'; http_header('Content-Type' => 'text/csv'); http_header('Content-Disposition' => qq(attachment;filename="$filename")); $m->clear_buffer; foreach my $row (@$data) { $csv->combine(@$row); $m->print($csv->string); } $m->abort; } my $part_titles = FS::Report::FCC_477->parts; <%def .header_fbd> Census Block DBA Name Technology Consumer? Advertised Speed (Mbps) Business? Contractual Speed (Mbps) Down Up Down Up <%def .header_fbs> Census Tract Technology Speed (Mbps) Subscriptions Down Up Total Consumer <%def .header_fvs> Census Tract VoIP? Lines/Subscriptions Total Consumer <%def .header_lts> State Wholesale End User Lines VGEs UNE-Ls Total With Broadband Consumer Business Local Loop Special Media +LD +LD Owned UNE-L Resale Fiber Coaxial Wireless <%def .header_voip> State VoIP OTT VoIP Non-OTT Total Consumer Total Consumer Bundled Media Type Copper Fiber Coaxial Wireless Other <%def .header_mbs> %# unimplemented State Speed (Mbps) Subscriptions Down Up Total Consumer <%def .header_mvs> %# unimplemented State Subscriptions Total Direct