& /elements/header.html, $title &>
% foreach my $partname (@partnames) {
% my $this_part = $parts{$partname};
% $cgi->param('parts', $partname);
% $cgi->param('type', 'csv');
<% $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
% }
% 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) {
% if ($first and $part_link{$partname}) {
"><% $item || '(empty)' %>
% $first = 0;
% } else {
<% $item %>
% }
|
% } #foreach $item
% # display errors
% if ( keys %eh ) {
% foreach my $key (sort keys %eh) {
- <% $eh{$key} %>
% }
|
% } # if there are errors
% $rownum++;
% } #foreach $row
% } # 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;
%init>
<%def .header_fbd>
Census Block |
DBA Name |
Technology |
Consumer? |
Advertised Speed (Mbps) |
Business? |
Contractual Speed (Mbps) |
Down |
Up |
Down |
Up |
%def>
<%def .header_fbs>
Census Tract |
Technology |
Speed (Mbps) |
Subscriptions |
Down |
Up |
Total |
Consumer |
%def>
<%def .header_fvs>
Census Tract |
VoIP? |
Lines/Subscriptions |
Total |
Consumer |
%def>
<%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>
<%def .header_voip>
State |
VoIP OTT |
VoIP Non-OTT |
Total |
Consumer |
Total |
Consumer |
Bundled |
Media Type |
Copper |
Fiber |
Coaxial |
Wireless |
Other |
%def>
<%def .header_mbs>
%# unimplemented
State |
Speed (Mbps) |
Subscriptions |
Down |
Up |
Total |
Consumer |
%def>
<%def .header_mvs>
%# unimplemented
State |
Subscriptions |
Total |
Direct |
%def>