Merge branch 'master' of git.freeside.biz:/home/git/freeside
[freeside.git] / httemplate / search / 477.html
1 <& /elements/header.html, $title &>
2 <STYLE TYPE="text/css">
3 table.fcc477part {
4   border-collapse: collapse;
5   border: 1px #777 solid;
6   margin-bottom: 20px;
7 }
8 table.fcc477part td {
9   padding: 0px 4px;
10   border-left: 1px #777 solid;
11   border-right: 1px #777 solid;
12 }
13 table.fcc477part tbody td {
14   text-align: right;
15 }
16 table.fcc477part thead tr.head {
17   text-align: center;
18   vertical-align: top;
19   font-weight: bold;
20   border-top: 1px #777 solid;
21   border-bottom: 1px #777 solid;
22 }
23 table.fcc477part thead tr.subhead {
24   text-align: center;
25   font-weight: bold;
26   font-size: small;
27   border-top: 1px #777 solid;
28   border-bottom: 1px #777 solid;
29 }
30 .parttitle {
31   font-weight: bold;
32   font-size: large;
33   float: left;
34 }
35 a.download {
36   float: right;
37 }
38 </STYLE>
39 % foreach my $partname (@partnames) {
40 %   $cgi->param('parts', $partname);
41 %   $cgi->param('type', 'csv');
42 <table class="fcc477part">
43   <caption>
44     <span class="parttitle"><% $part_titles->{$partname} %></span>
45     <a class="download" href="<% $cgi->self_url %>">Download</a>
46   </caption>
47 %   my $header = ".header_$partname";
48 %   my $data = $parts{$partname};
49   <thead>
50     <& $header &>
51   </thead>
52 %   foreach my $row (@$data) {
53   <tr>
54 %     foreach my $item (@$row) {
55     <td><% $item %></td>
56 %     }
57   </tr>
58 %   }
59 </table>
60 % } # foreach $partname
61 <& /elements/footer.html &>
62 <%init>
63 die "access denied"
64   unless $FS::CurrentUser::CurrentUser->access_right('List packages');
65
66 my %parts;
67 # load from cache if possible
68 my $session;
69 if ( $cgi->param('session') =~ /^(\d+)$/ ) {
70   $session = $1;
71   %parts = %{ $m->cache->get($session) };
72 } else {
73   $session = sprintf('%010d%06d', time, int(rand(1000000)));
74   $cgi->param('session', $session);
75 }
76
77 my $agentnum;
78 if ($cgi->param('agentnum') =~ /^(\d+)$/ ) {
79   $agentnum = $1;
80 }
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,
85     date      => $date,
86     agentnum  => $agentnum
87   );
88 }
89 $m->cache->set($session, \%parts, '1h');
90
91 my $title = 'FCC Form 477 Data - ' . time2str('%b %o, %Y', $date);
92
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
97
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"));
101
102   $m->clear_buffer;
103
104   foreach my $row (@$data) {
105     $csv->combine(@$row);
106     $m->print($csv->string);
107   }
108   $m->abort;
109 }
110
111 my $part_titles = FS::Report::FCC_477->parts;
112
113 </%init>
114 <%def .header_fbd>
115   <TR CLASS="head">
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>
123   </TR>
124   <TR CLASS="subhead">
125     <TD>Down</TD>
126     <TD>Up</TD>
127     <TD>Down</TD>
128     <TD>Up</TD>
129   </TR>
130 </%def>
131 <%def .header_fbs>
132   <TR CLASS="head">
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>
137   </TR>
138   <TR CLASS="subhead">
139     <TD>Down</TD>
140     <TD>Up</TD>
141     <TD>Total</TD>
142     <TD>Consumer</TD>
143   </TR>
144 </%def>
145 <%def .header_fvs>
146   <TR CLASS="head">
147     <TD ROWSPAN=2>Census Tract</TD>
148     <TD ROWSPAN=2>VoIP?</TD>
149     <TD COLSPAN=2>Lines/Subscriptions</TD>
150   </TR>
151   <TR CLASS="subhead">
152     <TD>Total</TD>
153     <TD>Consumer</TD>
154   </TR>
155 </%def>
156 <%def .header_lts>
157   <TR CLASS="head">
158     <TD ROWSPAN=3>State</TD>
159     <TD COLSPAN=2>Wholesale</TD>
160     <TD COLSPAN=12>End User Lines</TD>
161   </TR>
162   <TR CLASS="subhead">
163     <TD ROWSPAN=2>VGEs</TD>
164     <TD ROWSPAN=2>UNE-Ls</TD>
165
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>
170
171     <TD COLSPAN=3>Local Loop</TD>
172
173     <TD COLSPAN=3>Special Media</TD>
174   </TR>
175
176   <TR CLASS="subhead">
177     <TD> </TD>
178     <TD>+LD</TD>
179     <TD> </TD>
180     <TD>+LD</TD>
181
182     <TD>Owned</TD>
183     <TD>UNE-L</TD>
184     <TD>Resale</TD>
185
186     <TD>Fiber</TD>
187     <TD>Coaxial</TD>
188     <TD>Wireless</TD>
189   </TR>
190 </%def>
191 <%def .header_voip>
192   <TR CLASS="head">
193     <TD ROWSPAN=2>State</TD>
194     <TD COLSPAN=2>VoIP OTT</TD>
195     <TD COLSPAN=8>VoIP Non-OTT</TD>
196   </TR>
197   <TR CLASS="subhead">
198     <TD ROWSPAN=2>Total</TD>
199     <TD ROWSPAN=2>Consumer</TD>
200
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>
205   </TR>
206   <TR CLASS="subhead">
207     <TD>Copper</TD>
208     <TD>Fiber</TD>
209     <TD>Coaxial</TD>
210     <TD>Wireless</TD>
211     <TD>Other</TD>
212   </TR>
213 </%def>
214 <%def .header_mbs>
215 %# unimplemented
216   <TR CLASS="head">
217     <TD ROWSPAN=2>State</TD>
218     <TD COLSPAN=2>Speed (Mbps)</TD>
219     <TD COLSPAN=2>Subscriptions</TD>
220   </TR>
221   <TR CLASS="subhead">
222     <TD>Down</TD>
223     <TD>Up</TD>
224     <TD>Total</TD>
225     <TD>Consumer</TD>
226   </TR>
227 </%def>
228 <%def .header_mvs>
229 %# unimplemented
230   <TR CLASS="head">
231     <TD ROWSPAN=2>State</TD>
232     <TD COLSPAN=2>Subscriptions</TD>
233   </TR>
234   <TR CLASS="subhead">
235     <TD>Total</TD>
236     <TD>Direct</TD>
237   </TR>
238 </%def>
239