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 %   my $rownum = 0;
53 %   foreach my $row (@$data) {
54   <tr>
55 %     my $first = 1;
56 %     foreach my $item (@$row) {
57     <td>
58 %     if ($first and $part_link{$partname}) {
59       <a href="<% $part_link{$partname} . "477rownum=$rownum" %>"><% $item || '(empty)' %></a>
60 %       $first = 0;
61 %     } else {
62       <% $item %>
63 %     }
64     </td>
65 %   } #foreach $item
66   </tr>
67 %   $rownum++;
68 %   } #foreach $row
69 </table>
70 % } # foreach $partname
71 <& /elements/footer.html &>
72 <%init>
73 die "access denied"
74   unless $FS::CurrentUser::CurrentUser->access_right('List packages');
75
76 my %parts;
77 my %part_link;
78 # load from cache if possible
79 my $session;
80 if ( $cgi->param('session') =~ /^(\d+)$/ ) {
81   $session = $1;
82   %parts = %{ $m->cache->get($session) };
83 } else {
84   $session = sprintf('%010d%06d', time, int(rand(1000000)));
85   $cgi->param('session', $session);
86 }
87
88 my $agentnum;
89 if ($cgi->param('agentnum') =~ /^(\d+)$/ ) {
90   $agentnum = $1;
91 }
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);
95
96 foreach my $partname (@partnames) {
97   $parts{$partname} ||= FS::Report::FCC_477->report( $partname,
98     date            => $date,
99     agentnum        => $agentnum,
100     ignore_quantity => $ignore_quantity,
101   );
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;";
105     if ($agentnum) {
106       $link .= "agentnum=$agentnum;";
107     }
108     $part_link{$partname} = $link;
109   } # don't include detail links to deploy_blocks, that's pointless
110 }
111 $m->cache->set($session, \%parts, '1h');
112
113 my $title = 'FCC Form 477 Data - ' . time2str('%b %o, %Y', $date);
114
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
119
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"));
123
124   $m->clear_buffer;
125
126   foreach my $row (@$data) {
127     $csv->combine(@$row);
128     $m->print($csv->string);
129   }
130   $m->abort;
131 }
132
133 my $part_titles = FS::Report::FCC_477->parts;
134
135 </%init>
136 <%def .header_fbd>
137   <TR CLASS="head">
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>
145   </TR>
146   <TR CLASS="subhead">
147     <TD>Down</TD>
148     <TD>Up</TD>
149     <TD>Down</TD>
150     <TD>Up</TD>
151   </TR>
152 </%def>
153 <%def .header_fbs>
154   <TR CLASS="head">
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>
159   </TR>
160   <TR CLASS="subhead">
161     <TD>Down</TD>
162     <TD>Up</TD>
163     <TD>Total</TD>
164     <TD>Consumer</TD>
165   </TR>
166 </%def>
167 <%def .header_fvs>
168   <TR CLASS="head">
169     <TD ROWSPAN=2>Census Tract</TD>
170     <TD ROWSPAN=2>VoIP?</TD>
171     <TD COLSPAN=2>Lines/Subscriptions</TD>
172   </TR>
173   <TR CLASS="subhead">
174     <TD>Total</TD>
175     <TD>Consumer</TD>
176   </TR>
177 </%def>
178 <%def .header_lts>
179   <TR CLASS="head">
180     <TD ROWSPAN=3>State</TD>
181     <TD COLSPAN=2>Wholesale</TD>
182     <TD COLSPAN=12>End User Lines</TD>
183   </TR>
184   <TR CLASS="subhead">
185     <TD ROWSPAN=2>VGEs</TD>
186     <TD ROWSPAN=2>UNE-Ls</TD>
187
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>
192
193     <TD COLSPAN=3>Local Loop</TD>
194
195     <TD COLSPAN=3>Special Media</TD>
196   </TR>
197
198   <TR CLASS="subhead">
199     <TD> </TD>
200     <TD>+LD</TD>
201     <TD> </TD>
202     <TD>+LD</TD>
203
204     <TD>Owned</TD>
205     <TD>UNE-L</TD>
206     <TD>Resale</TD>
207
208     <TD>Fiber</TD>
209     <TD>Coaxial</TD>
210     <TD>Wireless</TD>
211   </TR>
212 </%def>
213 <%def .header_voip>
214   <TR CLASS="head">
215     <TD ROWSPAN=3>State</TD>
216     <TD COLSPAN=2>VoIP OTT</TD>
217     <TD COLSPAN=8>VoIP Non-OTT</TD>
218   </TR>
219   <TR CLASS="subhead">
220     <TD ROWSPAN=2>Total</TD>
221     <TD ROWSPAN=2>Consumer</TD>
222
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>
227   </TR>
228   <TR CLASS="subhead">
229     <TD>Copper</TD>
230     <TD>Fiber</TD>
231     <TD>Coaxial</TD>
232     <TD>Wireless</TD>
233     <TD>Other</TD>
234   </TR>
235 </%def>
236 <%def .header_mbs>
237 %# unimplemented
238   <TR CLASS="head">
239     <TD ROWSPAN=2>State</TD>
240     <TD COLSPAN=2>Speed (Mbps)</TD>
241     <TD COLSPAN=2>Subscriptions</TD>
242   </TR>
243   <TR CLASS="subhead">
244     <TD>Down</TD>
245     <TD>Up</TD>
246     <TD>Total</TD>
247     <TD>Consumer</TD>
248   </TR>
249 </%def>
250 <%def .header_mvs>
251 %# unimplemented
252   <TR CLASS="head">
253     <TD ROWSPAN=2>State</TD>
254     <TD COLSPAN=2>Subscriptions</TD>
255   </TR>
256   <TR CLASS="subhead">
257     <TD>Total</TD>
258     <TD>Direct</TD>
259   </TR>
260 </%def>
261