1 <& /elements/header.html, $title &>
2 <STYLE TYPE="text/css">
4 border-collapse: collapse;
5 border: 1px #777 solid;
10 border-left: 1px #777 solid;
11 border-right: 1px #777 solid;
13 table.fcc477part tbody td {
16 table.fcc477part thead tr.head {
20 border-top: 1px #777 solid;
21 border-bottom: 1px #777 solid;
23 table.fcc477part thead tr.subhead {
27 border-top: 1px #777 solid;
28 border-bottom: 1px #777 solid;
39 % foreach my $partname (@partnames) {
40 % $cgi->param('parts', $partname);
41 % $cgi->param('type', 'csv');
42 <table class="fcc477part">
44 <span class="parttitle"><% $part_titles->{$partname} %></span>
45 <a class="download" href="<% $cgi->self_url %>">Download</a>
47 % my $header = ".header_$partname";
48 % my $data = $parts{$partname};
52 % foreach my $row (@$data) {
54 % foreach my $item (@$row) {
60 % } # foreach $partname
61 <& /elements/footer.html &>
64 unless $FS::CurrentUser::CurrentUser->access_right('List packages');
67 # load from cache if possible
69 if ( $cgi->param('session') =~ /^(\d+)$/ ) {
71 %parts = %{ $m->cache->get($session) };
73 $session = sprintf('%010d%06d', time, int(rand(1000000)));
74 $cgi->param('session', $session);
78 if ($cgi->param('agentnum') =~ /^(\d+)$/ ) {
81 my $date = parse_datetime($cgi->param('date')) || time;
82 my @partnames = grep /^\w+$/, $cgi->param('parts');
83 foreach my $partname (@partnames) {
84 $parts{$partname} ||= FS::Report::FCC_477->report( $partname,
89 $m->cache->set($session, \%parts, '1h');
91 my $title = 'FCC Form 477 Data - ' . time2str('%b %o, %Y', $date);
93 if ( $cgi->param('type') eq 'csv' ) {
94 my $partname = $partnames[0]; # ignore any beyond the first
95 my $data = $parts{$partname};
96 my $csv = Text::CSV_XS->new({ eol => "\r\n" }); # i think
98 my $filename = time2str('%Y-%m-%d', $date) . '-'. $partname . '.csv';
99 http_header('Content-Type' => 'text/csv');
100 http_header('Content-Disposition' => qq(attachment;filename="$filename"));
104 foreach my $row (@$data) {
105 $csv->combine(@$row);
106 $m->print($csv->string);
111 my $part_titles = FS::Report::FCC_477->parts;
116 <TD ROWSPAN=2>Census Block</TD>
117 <TD ROWSPAN=2>DBA Name</TD>
118 <TD ROWSPAN=2>Technology</TD>
119 <TD ROWSPAN=2>Consumer?</TD>
120 <TD COLSPAN=2>Advertised Speed (Mbps)</TD>
121 <TD ROWSPAN=2>Business?</TD>
122 <TD COLSPAN=2>Contractual Speed (Mbps)</TD>
133 <TD ROWSPAN=2>Census Tract</TD>
134 <TD ROWSPAN=2>Technology</TD>
135 <TD COLSPAN=2>Speed (Mbps)</TD>
136 <TD COLSPAN=2>Subscriptions</TD>
147 <TD ROWSPAN=2>Census Tract</TD>
148 <TD ROWSPAN=2>VoIP?</TD>
149 <TD COLSPAN=2>Lines/Subscriptions</TD>
158 <TD ROWSPAN=3>State</TD>
159 <TD COLSPAN=2>Wholesale</TD>
160 <TD COLSPAN=12>End User Lines</TD>
163 <TD ROWSPAN=2>VGEs</TD>
164 <TD ROWSPAN=2>UNE-Ls</TD>
166 <TD ROWSPAN=2>Total</TD>
167 <TD ROWSPAN=2>With Broadband</TD>
168 <TD COLSPAN=2>Consumer</TD>
169 <TD COLSPAN=2>Business</TD>
171 <TD COLSPAN=3>Local Loop</TD>
173 <TD COLSPAN=3>Special Media</TD>
193 <TD ROWSPAN=2>State</TD>
194 <TD COLSPAN=2>VoIP OTT</TD>
195 <TD COLSPAN=8>VoIP Non-OTT</TD>
198 <TD ROWSPAN=2>Total</TD>
199 <TD ROWSPAN=2>Consumer</TD>
201 <TD ROWSPAN=2>Total</TD>
202 <TD ROWSPAN=2>Consumer</TD>
203 <TD ROWSPAN=2>Bundled</TD>
204 <TD COLSPAN=5>Media Type</TD>
217 <TD ROWSPAN=2>State</TD>
218 <TD COLSPAN=2>Speed (Mbps)</TD>
219 <TD COLSPAN=2>Subscriptions</TD>
231 <TD ROWSPAN=2>State</TD>
232 <TD COLSPAN=2>Subscriptions</TD>