X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=blobdiff_plain;f=httemplate%2Fsearch%2F477.html;h=9a412612119dad052ec2e5ff7eb5e355a2e70efb;hp=45c92ffe7d494aa934a17afcc16ec8332dd19e3d;hb=HEAD;hpb=0b407666b53dea109661f25d51860a7e7e06981f diff --git a/httemplate/search/477.html b/httemplate/search/477.html old mode 100755 new mode 100644 index 45c92ffe7..9a4126121 --- a/httemplate/search/477.html +++ b/httemplate/search/477.html @@ -1,70 +1,313 @@ -<% include( 'elements/search.html', - 'title' => 'FCC Form 477 Results', - 'html_init' => $html_init, - 'name' => 'regions', - 'query' => $sql_query, - 'count_query' => $count_query, - 'header' => [ - 'State code', - 'County code', - 'Census tract code', - 'Quantity', - ], - 'fields' => [ - sub { my $row = shift; substr($row->censustract, 0, 2) }, - sub { my $row = shift; substr($row->censustract, 2, 3) }, - sub { my $row = shift; substr($row->censustract, 5) }, - 'quantity', - ], - 'links' => [ - [ $link, 'censustract' ], - [ $link, 'censustract' ], - [ $link, 'censustract' ], - [ $link, 'censustract' ], - ], - ) -%> +<& /elements/header.html, $title &> + +% foreach my $partname (@partnames) { +% my $this_part = $parts{$partname}; +% $cgi->param('parts', $partname); +% $cgi->param('type', 'csv'); + + +% my $header = ".header_$partname"; +% $header .= '_old' if $partname eq 'fbd' && $date < 1569826800; #9/30/2019 +% # ( halfway between the two filing "as of" dates when it changed + +% my $data = $this_part->{data}; +% my $error = $this_part->{error}; + + <& $header &> + +% my $rownum = 0; +% foreach my $row (@$data) { +% my %eh; # error hash +% if ( $error->[$rownum] ) { +% %eh = %{ $error->[$rownum] }; +% } + > +% my $first = 1; +% foreach my $item (@$row) { + +% } #foreach $item +% # display errors +% if ( keys %eh ) { + +% } # if there are errors + +% $rownum++; +% } #foreach $row +
+ <% $part_titles->{$partname} %> +% if ( $this_part->{num_errors} > 0 ) { +% # show error heading while it contains errors + + <% emt('This section contains [quant,_1,error].', $this_part->{num_errors}) %> + +% } + Download +
+% if ($first and $part_link{$partname}) { + "><% $item || '(empty)' %> +% $first = 0; +% } else { + <% $item %> +% } +
    +% foreach my $key (sort keys %eh) { +
  • <% $eh{$key} %>
  • +% } +
+% } # foreach $partname +<& /elements/footer.html &> <%init> +die "access denied" + unless $FS::CurrentUser::CurrentUser->access_right('List packages'); -my $curuser = $FS::CurrentUser::CurrentUser; +my %parts; +my %part_link; +# load from cache if possible +my $session; +if ( $cgi->param('session') =~ /^(\d+)$/ ) { + $session = $1; + %parts = %{ $m->cache->get($session) }; +} else { + $session = sprintf('%010d%06d', time, int(rand(1000000))); + $cgi->param('session', $session); +} -die "access denied" - unless $curuser->access_right('List packages'); - -my %search_hash = (); - -$search_hash{'query'} = $cgi->keywords; - -for ( qw(agentnum magic status classnum) ) { - $search_hash{$_} = $cgi->param($_) if $cgi->param($_); +my $agentnum; +if ($cgi->param('agentnum') =~ /^(\d+)$/ ) { + $agentnum = $1; } +my $date = parse_datetime($cgi->param('date')) || time; +my @partnames = grep /^\w+$/, $cgi->param('parts'); +my $ignore_quantity = ($cgi->param('ignore_quantity') ? 1 : 0); +foreach my $partname (@partnames) { + $parts{$partname} ||= FS::Report::FCC_477->report( $partname, + date => $date, + agentnum => $agentnum, + ignore_quantity => $ignore_quantity, + ); # includes error, detail, and data parts + my $detail_table = FS::Report::FCC_477->part_table($partname); + if ($detail_table eq 'cust_pkg') { + my $link = popurl(1).'477_cust_pkg.html?477part='.$partname.";date=$date;"; + if ($agentnum) { + $link .= "agentnum=$agentnum;"; + } + $part_link{$partname} = $link; + } # don't include detail links to deploy_blocks, that's pointless +} +$m->cache->set($session, \%parts, '1h'); -my @report_option = $cgi->param('report_option') - if $cgi->param('report_option'); -$search_hash{report_option} = join(',', @report_option) if @report_option; +my $title = 'FCC Form 477 Data - ' . time2str('%b %o, %Y', $date); -my $where = join(' OR ', map { "num = $_" } grep { /^\d+$/ } @report_option ); -my @report_option_name = $where ? - ( map { $_->name } - qsearch({ 'table' => 'part_pkg_report_option', - 'hashref' => {}, - 'extra_sql' => "WHERE $where", - }) - ) : - ( 'all packages' ); +if ( $cgi->param('type') eq 'csv' ) { + my $partname = $partnames[0]; # ignore any beyond the first + my $data = $parts{$partname}->{data}; + my $csv = Text::CSV_XS->new({ eol => "\r\n" }); # i think -my $html_init = "For
". join(' and
', @report_option_name). "
"; + my $filename = time2str('%Y-%m-%d', $date) . '-'. $partname . '.csv'; + http_header('Content-Type' => 'text/csv'); + http_header('Content-Disposition' => qq(attachment;filename="$filename")); -my $sql_query = FS::cust_pkg->search_sql(\%search_hash); + $m->clear_buffer; -$sql_query->{select} = 'count(*) as quantity, censustract'; -$sql_query->{extra_sql} =~ /^(.*)(ORDER BY bill)(.*)$/s or die "couldn't parse extra_sql"; -$sql_query->{extra_sql} = "$1 GROUP BY censustract $3"; + foreach my $row (@$data) { + $csv->combine(@$row); + $m->print($csv->string); + } + $m->abort; +} -my $count_query = delete($sql_query->{'count_query'}); -$count_query = 'SELECT count(*) FROM (SELECT count(*) FROM cust_pkg '. - $sql_query->{addl_from}. ' '. $sql_query->{extra_sql}. ') AS foo'; +my $part_titles = FS::Report::FCC_477->parts; -my $link = 'cust_pkg.cgi?'. $cgi->query_string. ';censustract='; +<%def .header_fbd_old> + + Census Block + DBA Name + Technology + Consumer? + Advertised Speed (Mbps) + Business? + Contractual Speed (Mbps) + + + Down + Up + Down + Up + + +<%def .header_fbd> + + Census Block + DBA Name + Technology + Consumer? + Advertised Speed (Mbps) + Business? + + + Down + Up + + +<%def .header_fbs> + + Census Tract + Technology + Speed (Mbps) + Subscriptions + + + Down + Up + Total + Consumer + + +<%def .header_fvs> + + Census Tract + VoIP? + Lines/Subscriptions + + + Total + Consumer + + +<%def .header_lts> + + State + Wholesale + End User Lines + + + VGEs + UNE-Ls + + Total + With Broadband + Consumer + Business + + Local Loop + + Special Media + + + + + +LD + + +LD + + Owned + UNE-L + Resale + + Fiber + Coaxial + Wireless + + +<%def .header_voip> + + State + VoIP OTT + VoIP Non-OTT + + + Total + Consumer + + Total + Consumer + Bundled + Media Type + + + Copper + Fiber + Coaxial + Wireless + Other + + +<%def .header_mbs> +%# unimplemented + + State + Speed (Mbps) + Subscriptions + + + Down + Up + Total + Consumer + + +<%def .header_mvs> +%# unimplemented + + State + Subscriptions + + + Total + Direct + + +