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 $partnum (@partnums) {
40 %   $cgi->param('parts', $partnum);
41 %   $cgi->param('type', 'csv');
42 <table class="fcc477part">
43   <caption>
44     <span class="parttitle">Part <% $partnum %></span>
45     <a class="download" href="<% $cgi->self_url %>">Download</a>
46   </caption>
47 %   my $header = ".header$partnum";
48 %   my $data = $parts{$partnum};
49   <thead>
50     <& $header &>
51   </thead>
52 %   #XXX column headings
53 %   foreach my $row (@$data) {
54   <tr>
55 %     foreach my $item (@$row) {
56     <td><% $item %></td>
57 %     }
58   </tr>
59 %   }
60 </table>
61 % } # foreach $partnum
62 <& /elements/footer.html &>
63 <%init>
64 die "access denied"
65   unless $FS::CurrentUser::CurrentUser->access_right('List packages');
66
67 my %parts;
68 # load from cache if possible
69 my $session;
70 if ( $cgi->param('session') =~ /^(\d+)$/ ) {
71   $session = $1;
72   %parts = %{ $m->cache->get($session) };
73 } else {
74   $session = sprintf('%010d%06d', time, int(rand(1000000)));
75   $cgi->param('session', $session);
76 }
77
78 my $agentnum;
79 if ($cgi->param('agentnum') =~ /^(\d+)$/ ) {
80   $agentnum = $1;
81 }
82 my $date = parse_datetime($cgi->param('date')) || time;
83 my @partnums = grep /^\d+$/, $cgi->param('parts');
84 foreach my $partnum (@partnums) {
85   my $method = "part$partnum";
86   $parts{$partnum} ||= FS::Report::FCC_477->$method(
87     date      => $date,
88     agentnum  => $agentnum
89   );
90 }
91 $m->cache->set($session, \%parts, '1h');
92
93 my $title = 'FCC Form 477 Data - ' . time2str('%b %o, %Y', $date);
94
95 if ( $cgi->param('type') eq 'csv' ) {
96   my $partnum = $partnums[0]; # ignore any beyond the first
97   my $data = $parts{$partnum};
98   my $csv = Text::CSV_XS->new({ eol => "\r\n" }); # i think
99
100   my $filename = time2str('%Y-%m-%d', $date) . '-part' . $partnum . '.csv';
101   http_header('Content-Type' => 'text/csv');
102   http_header('Content-Disposition' => qq(attachment;filename="$filename"));
103
104   $m->clear_buffer;
105
106   foreach my $row (@$data) {
107     $csv->combine(@$row);
108     $m->print($csv->string);
109   }
110   $m->abort;
111 }
112
113 </%init>
114 <%def .header6>
115   <TR CLASS="head">
116     <TD ROWSPAN=2>Census Tract</TD>
117     <TD ROWSPAN=2>Technology</TD>
118     <TD COLSPAN=2>Speed (Mbps)</TD>
119     <TD COLSPAN=2>Subscriptions</TD>
120   </TR>
121   <TR CLASS="subhead">
122     <TD>Down</TD>
123     <TD>Up</TD>
124     <TD>Total</TD>
125     <TD>Consumer</TD>
126   </TR>
127 </%def>
128 <%def .header7>
129   <TR CLASS="head">
130     <TD ROWSPAN=2>State</TD>
131     <TD COLSPAN=2>Speed (Mbps)</TD>
132     <TD COLSPAN=2>Subscriptions</TD>
133   </TR>
134   <TR CLASS="subhead">
135     <TD>Down</TD>
136     <TD>Up</TD>
137     <TD>Total</TD>
138     <TD>Consumer</TD>
139   </TR>
140 </%def>
141 <%def .header8>
142   <TR CLASS="head">
143     <TD ROWSPAN=2>State</TD>
144     <TD COLSPAN=2>Subscriptions</TD>
145   </TR>
146   <TR CLASS="subhead">
147     <TD>Total</TD>
148     <TD>Direct</TD>
149   </TR>
150 </%def>
151 <%def .header9>
152   <TR CLASS="head">
153     <TD ROWSPAN=3>State</TD>
154     <TD COLSPAN=2>Wholesale</TD>
155     <TD COLSPAN=12>End User Lines</TD>
156   </TR>
157   <TR CLASS="subhead">
158     <TD ROWSPAN=2>VGEs</TD>
159     <TD ROWSPAN=2>UNE-Ls</TD>
160
161     <TD ROWSPAN=2>Total</TD>
162     <TD ROWSPAN=2>With Broadband</TD>
163     <TD COLSPAN=2>Consumer</TD>
164     <TD COLSPAN=2>Business</TD>
165
166     <TD COLSPAN=3>Local Loop</TD>
167
168     <TD COLSPAN=3>Special Media</TD>
169   </TR>
170
171   <TR CLASS="subhead">
172     <TD> </TD>
173     <TD>+LD</TD>
174     <TD> </TD>
175     <TD>+LD</TD>
176
177     <TD>Owned</TD>
178     <TD>UNE-L</TD>
179     <TD>Resale</TD>
180
181     <TD>Fiber</TD>
182     <TD>Coaxial</TD>
183     <TD>Wireless</TD>
184   </TR>
185 </%def>
186 <%def .header10>
187   <TR CLASS="head">
188     <TD ROWSPAN=2>State</TD>
189     <TD COLSPAN=2>VoIP OTT</TD>
190     <TD COLSPAN=8>VoIP Non-OTT</TD>
191   </TR>
192   <TR CLASS="subhead">
193     <TD ROWSPAN=2>Total</TD>
194     <TD ROWSPAN=2>Consumer</TD>
195
196     <TD ROWSPAN=2>Total</TD>
197     <TD ROWSPAN=2>Consumer</TD>
198     <TD ROWSPAN=2>Bundled</TD>
199     <TD COLSPAN=5>Media Type</TD>
200   </TR>
201   <TR CLASS="subhead">
202     <TD>Copper</TD>
203     <TD>Fiber</TD>
204     <TD>Coaxial</TD>
205     <TD>Wireless</TD>
206     <TD>Other</TD>
207   </TR>
208 </%def>
209 <%def .header11>
210   <TR CLASS="head">
211     <TD ROWSPAN=2>Census Tract</TD>
212     <TD ROWSPAN=2>VoIP?</TD>
213     <TD COLSPAN=2>Lines/Subscriptions</TD>
214   </TR>
215   <TR CLASS="subhead">
216     <TD>Total</TD>
217     <TD>Consumer</TD>
218   </TR>
219 </%def>