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 my $ignore_quantity = ($cgi->param('ignore_quantity') ? 1 : 0);
96 foreach my $partname (@partnames) {
97 $parts{$partname} ||= FS::Report::FCC_477->report( $partname,
99 agentnum => $agentnum,
100 ignore_quantity => $ignore_quantity,
102 my $detail_table = FS::Report::FCC_477->part_table($partname);
103 if ($detail_table eq 'cust_pkg') {
104 my $link = popurl(1).'cust_pkg.cgi?477part='.$partname.";date=$date;";
106 $link .= "agentnum=$agentnum;";
108 $part_link{$partname} = $link;
109 } # don't include detail links to deploy_blocks, that's pointless
111 $m->cache->set($session, \%parts, '1h');
113 my $title = 'FCC Form 477 Data - ' . time2str('%b %o, %Y', $date);
115 if ( $cgi->param('type') eq 'csv' ) {
116 my $partname = $partnames[0]; # ignore any beyond the first
117 my $data = $parts{$partname};
118 my $csv = Text::CSV_XS->new({ eol => "\r\n" }); # i think
120 my $filename = time2str('%Y-%m-%d', $date) . '-'. $partname . '.csv';
121 http_header('Content-Type' => 'text/csv');
122 http_header('Content-Disposition' => qq(attachment;filename="$filename"));
126 foreach my $row (@$data) {
127 $csv->combine(@$row);
128 $m->print($csv->string);
133 my $part_titles = FS::Report::FCC_477->parts;
138 <TD ROWSPAN=2>Census Block</TD>
139 <TD ROWSPAN=2>DBA Name</TD>
140 <TD ROWSPAN=2>Technology</TD>
141 <TD ROWSPAN=2>Consumer?</TD>
142 <TD COLSPAN=2>Advertised Speed (Mbps)</TD>
143 <TD ROWSPAN=2>Business?</TD>
144 <TD COLSPAN=2>Contractual Speed (Mbps)</TD>
155 <TD ROWSPAN=2>Census Tract</TD>
156 <TD ROWSPAN=2>Technology</TD>
157 <TD COLSPAN=2>Speed (Mbps)</TD>
158 <TD COLSPAN=2>Subscriptions</TD>
169 <TD ROWSPAN=2>Census Tract</TD>
170 <TD ROWSPAN=2>VoIP?</TD>
171 <TD COLSPAN=2>Lines/Subscriptions</TD>
180 <TD ROWSPAN=3>State</TD>
181 <TD COLSPAN=2>Wholesale</TD>
182 <TD COLSPAN=12>End User Lines</TD>
185 <TD ROWSPAN=2>VGEs</TD>
186 <TD ROWSPAN=2>UNE-Ls</TD>
188 <TD ROWSPAN=2>Total</TD>
189 <TD ROWSPAN=2>With Broadband</TD>
190 <TD COLSPAN=2>Consumer</TD>
191 <TD COLSPAN=2>Business</TD>
193 <TD COLSPAN=3>Local Loop</TD>
195 <TD COLSPAN=3>Special Media</TD>
215 <TD ROWSPAN=3>State</TD>
216 <TD COLSPAN=2>VoIP OTT</TD>
217 <TD COLSPAN=8>VoIP Non-OTT</TD>
220 <TD ROWSPAN=2>Total</TD>
221 <TD ROWSPAN=2>Consumer</TD>
223 <TD ROWSPAN=2>Total</TD>
224 <TD ROWSPAN=2>Consumer</TD>
225 <TD ROWSPAN=2>Bundled</TD>
226 <TD COLSPAN=5>Media Type</TD>
239 <TD ROWSPAN=2>State</TD>
240 <TD COLSPAN=2>Speed (Mbps)</TD>
241 <TD COLSPAN=2>Subscriptions</TD>
253 <TD ROWSPAN=2>State</TD>
254 <TD COLSPAN=2>Subscriptions</TD>