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};
53 % foreach my $row (@$data) {
56 % foreach my $item (@$row) {
58 % if ($first and $part_link{$partname}) {
59 <a href="<% $part_link{$partname} . "477rownum=$rownum" %>"><% $item || '(empty)' %></a>
70 % } # foreach $partname
71 <& /elements/footer.html &>
74 unless $FS::CurrentUser::CurrentUser->access_right('List packages');
78 # load from cache if possible
80 if ( $cgi->param('session') =~ /^(\d+)$/ ) {
82 %parts = %{ $m->cache->get($session) };
84 $session = sprintf('%010d%06d', time, int(rand(1000000)));
85 $cgi->param('session', $session);
89 if ($cgi->param('agentnum') =~ /^(\d+)$/ ) {
92 my $date = parse_datetime($cgi->param('date')) || time;
93 my @partnames = grep /^\w+$/, $cgi->param('parts');
94 foreach my $partname (@partnames) {
95 $parts{$partname} ||= FS::Report::FCC_477->report( $partname,
97 agentnum => $agentnum,
99 my $detail_table = FS::Report::FCC_477->part_table($partname);
100 if ($detail_table eq 'cust_pkg') {
101 my $link = popurl(1).'cust_pkg.cgi?477part='.$partname.";date=$date;";
103 $link .= "agentnum=$agentnum;";
105 $part_link{$partname} = $link;
106 } # don't include detail links to deploy_blocks, that's pointless
108 $m->cache->set($session, \%parts, '1h');
110 my $title = 'FCC Form 477 Data - ' . time2str('%b %o, %Y', $date);
112 if ( $cgi->param('type') eq 'csv' ) {
113 my $partname = $partnames[0]; # ignore any beyond the first
114 my $data = $parts{$partname};
115 my $csv = Text::CSV_XS->new({ eol => "\r\n" }); # i think
117 my $filename = time2str('%Y-%m-%d', $date) . '-'. $partname . '.csv';
118 http_header('Content-Type' => 'text/csv');
119 http_header('Content-Disposition' => qq(attachment;filename="$filename"));
123 foreach my $row (@$data) {
124 $csv->combine(@$row);
125 $m->print($csv->string);
130 my $part_titles = FS::Report::FCC_477->parts;
135 <TD ROWSPAN=2>Census Block</TD>
136 <TD ROWSPAN=2>DBA Name</TD>
137 <TD ROWSPAN=2>Technology</TD>
138 <TD ROWSPAN=2>Consumer?</TD>
139 <TD COLSPAN=2>Advertised Speed (Mbps)</TD>
140 <TD ROWSPAN=2>Business?</TD>
141 <TD COLSPAN=2>Contractual Speed (Mbps)</TD>
152 <TD ROWSPAN=2>Census Tract</TD>
153 <TD ROWSPAN=2>Technology</TD>
154 <TD COLSPAN=2>Speed (Mbps)</TD>
155 <TD COLSPAN=2>Subscriptions</TD>
166 <TD ROWSPAN=2>Census Tract</TD>
167 <TD ROWSPAN=2>VoIP?</TD>
168 <TD COLSPAN=2>Lines/Subscriptions</TD>
177 <TD ROWSPAN=3>State</TD>
178 <TD COLSPAN=2>Wholesale</TD>
179 <TD COLSPAN=12>End User Lines</TD>
182 <TD ROWSPAN=2>VGEs</TD>
183 <TD ROWSPAN=2>UNE-Ls</TD>
185 <TD ROWSPAN=2>Total</TD>
186 <TD ROWSPAN=2>With Broadband</TD>
187 <TD COLSPAN=2>Consumer</TD>
188 <TD COLSPAN=2>Business</TD>
190 <TD COLSPAN=3>Local Loop</TD>
192 <TD COLSPAN=3>Special Media</TD>
212 <TD ROWSPAN=2>State</TD>
213 <TD COLSPAN=2>VoIP OTT</TD>
214 <TD COLSPAN=8>VoIP Non-OTT</TD>
217 <TD ROWSPAN=2>Total</TD>
218 <TD ROWSPAN=2>Consumer</TD>
220 <TD ROWSPAN=2>Total</TD>
221 <TD ROWSPAN=2>Consumer</TD>
222 <TD ROWSPAN=2>Bundled</TD>
223 <TD COLSPAN=5>Media Type</TD>
236 <TD ROWSPAN=2>State</TD>
237 <TD COLSPAN=2>Speed (Mbps)</TD>
238 <TD COLSPAN=2>Subscriptions</TD>
250 <TD ROWSPAN=2>State</TD>
251 <TD COLSPAN=2>Subscriptions</TD>