diff options
author | Mark Wells <mark@freeside.biz> | 2014-07-31 22:54:08 -0700 |
---|---|---|
committer | Mark Wells <mark@freeside.biz> | 2014-07-31 22:54:08 -0700 |
commit | 0f359d5480aa1621d73ee802f420e8951abc620d (patch) | |
tree | 4bab32c865f9ef7b2bb03247a6be75215cfebf85 /httemplate | |
parent | 6c284750de8fe49d7d4cdc6a9a4fb618697780e2 (diff) |
new 477 report: deployment info, combined browse-edit UI, #24047
Diffstat (limited to 'httemplate')
-rw-r--r-- | httemplate/browse/deploy_zone.html | 72 | ||||
-rwxr-xr-x | httemplate/browse/part_pkg-fcc.html | 215 | ||||
-rw-r--r-- | httemplate/edit/deploy_zone-fixed.html | 87 | ||||
-rwxr-xr-x | httemplate/edit/part_pkg.cgi | 37 | ||||
-rw-r--r-- | httemplate/edit/process/deploy_zone-fixed.html | 9 | ||||
-rw-r--r-- | httemplate/elements/deploy_zone_block.html | 47 | ||||
-rw-r--r-- | httemplate/elements/input-fcc_options.html | 108 | ||||
-rw-r--r-- | httemplate/elements/tr-input-fcc_options.html | 4 | ||||
-rw-r--r-- | httemplate/misc/part_pkg_fcc_options.html | 9 | ||||
-rw-r--r-- | httemplate/search/477.html | 76 | ||||
-rwxr-xr-x | httemplate/search/report_477.html | 8 |
11 files changed, 612 insertions, 60 deletions
diff --git a/httemplate/browse/deploy_zone.html b/httemplate/browse/deploy_zone.html new file mode 100644 index 000000000..489a22658 --- /dev/null +++ b/httemplate/browse/deploy_zone.html @@ -0,0 +1,72 @@ +<& /elements/header.html, 'Deployment zones' &> +<& /elements/menubar.html, + 'Add a new fixed broadband zone' => $p.'edit/deploy_zone-fixed.html', + 'Add a new mobile zone' => $p.'edit/deploy_zone-mobile.html', +&> +<P><FONT SIZE="+1"><B>Fixed Broadband Zones</B></FONT></P> +<& elements/browse.html, + name_singular => 'zone', + query => { table => 'deploy_zone', + hashref => { zonetype => 'B' }, + }, + count_query => "SELECT COUNT(*) FROM deploy_zone WHERE zonetype = 'B'", + agent_virt => 1, + header => [ '#', + 'Description', + 'Technology', + 'Market', + 'Advertised Mbps', + 'Contractual Mbps', + 'Census blocks', + ], + fields => [ 'zonenum', + 'description', + sub { my $self = shift; + $tech_label->{$self->technology} }, + sub { my $self = shift; + join( ' / ', + $self->is_consumer ? 'consumer' : (), + $self->is_business ? 'business' : () + ) + }, + sub { my $self = shift; + join( ' / ', grep $_, + $self->adv_speed_down, + $self->adv_speed_up + ) + }, + sub { my $self = shift; + join( ' / ', grep $_, + $self->cir_speed_down, + $self->cir_speed_up + ) + }, + sub { my $self = shift; + FS::deploy_zone_block->count('zonenum = '.$self->zonenum) + }, + ], + sort_fields => [ 'zonenum', + 'description', + 'technology', + 'is_consumer is not null, is_business is not null', + 'adv_speed_down, adv_speed_up', + 'cir_speed_down, cir_speed_up', + ], + links => [ '', $link_fixed, ], + align => 'clllllr', + nohtmlheader => 1, + disable_maxselect => 1, + disable_total => 1, +&> +<%init> +my $curuser = $FS::CurrentUser::CurrentUser; +my $acl_edit = $curuser->access_right('Edit FCC report configuration'); +my $acl_edit_global = $curuser->access_right('Edit FCC report configuration for all agents'); +die "access denied" + unless $acl_edit or $acl_edit_global; + +my $link_fixed = [ $p.'edit/deploy_zone-fixed.html?', 'zonenum' ]; +my $link_mobile= [ $p.'edit/deploy_zone-mobile.html', 'zonenum' ]; + +my $tech_label = FS::part_pkg_fcc_option->technology_labels; +</%init> diff --git a/httemplate/browse/part_pkg-fcc.html b/httemplate/browse/part_pkg-fcc.html new file mode 100755 index 000000000..9462c3248 --- /dev/null +++ b/httemplate/browse/part_pkg-fcc.html @@ -0,0 +1,215 @@ +<& elements/browse.html, + 'title' => 'Package Definitions - FCC Options', + 'menubar' => \@menubar, + 'html_init' => $html_init, + 'html_form' => $html_form, + 'html_posttotal' => $html_posttotal, + 'name' => 'package definitions', + 'disableable' => 1, + 'disabled_statuspos' => 4, + 'agent_virt' => 1, + 'agent_null_right' => [ $edit, $edit_global ], + 'agent_null_right_link' => $edit_global, + 'agent_pos' => 6, + 'query' => + { 'select' => $select, + 'table' => 'part_pkg', + 'addl_from' => $addl_from, + 'hashref' => \%hash, + 'extra_sql' => $extra_sql, + 'order_by' => "ORDER BY $orderby" + }, + 'count_query' => $count_query, + 'header' => \@header, + 'fields' => \@fields, + 'links' => \@links, + 'align' => $align, + 'link_field' => 'pkgpart', + 'html_foot' => $html_foot, +&> +<%init> + +my $curuser = $FS::CurrentUser::CurrentUser; + +my $edit = 'Edit package definitions'; +my $edit_global = 'Edit global package definitions'; +my $acl_edit = $curuser->access_right($edit); +my $acl_edit_global = $curuser->access_right($edit_global); + +die "access denied" + unless $acl_edit || $acl_edit_global; + +my $conf = new FS::Conf; + +my $orderby = 'pkgpart'; +my %hash = (); +my $extra_count = ''; + +my @where = (); + +# only ever show recurring packages here +$hash{'freq'} = { op=>'!=', value=>'0' }; +$extra_count = " freq != '0' "; + +# filter by classnum +my $classnum = ''; +if ( $cgi->param('classnum') =~ /^(\d+)$/ ) { + $classnum = $1; + push @where, $classnum ? "classnum = $classnum" + : "classnum IS NULL"; +} +$cgi->delete('classnum'); + +# filter by agent permissions +push @where, FS::part_pkg->curuser_pkgs_sql + unless $acl_edit_global; + +my $extra_sql = scalar(@where) + ? ( scalar(keys %hash) ? ' AND ' : ' WHERE ' ). + join( 'AND ', @where) + : ''; + +# pull option values into the select +my @optionnames = ( qw( + media + is_consumer + is_broadband technology broadband_upstream broadband_downstream + is_phone phone_wholesale phone_vges phone_circuits + phone_lines phone_longdistance phone_localloop + is_voip voip_lastmile voip_sessions +) ); + +my $select = join(',', + 'part_pkg.*', + '(SELECT classname FROM pkg_class WHERE pkg_class.classnum = part_pkg.classnum) AS classname', # grr, disableable... + @optionnames +); + +my $addl_from = + FS::Report::FCC_477::join_optionnames(@optionnames); + +#restore this so pagination works +$cgi->param('classnum', $classnum) if length($classnum); + +#should hide this if there aren't any classes +my $html_posttotal = + "<BR>( show class: ". + include('/elements/select-pkg_class.html', + #'curr_value' => $classnum, + 'value' => $classnum, #insist on 0 :/ + 'onchange' => 'filter_change()', + 'pre_options' => [ '-1' => 'all', + '0' => '(none)', ], + 'disable_empty' => 1, + ). + ' )'; + +my $link = [ $p.'edit/part_pkg.cgi?', 'pkgpart' ]; + +my @header = ( '#', 'Package', 'Comment' ); +my @fields = ( 'pkgpart', 'pkg', 'comment' ,); +my $align = 'rll'; +my @links = ( $link, $link, '', ); + +unless ( length($classnum) ) { + push @header, 'Class'; + push @fields, 'classname'; + $align .= 'l'; +} + +# still include the report_option classes, to help with migration +# but not other plan options + +my %report_optionname_name = map { 'report_option_'.$_->num, $_->name } + qsearch('part_pkg_report_option', { disabled => '' }); + +push @header, 'Report classes'; + +push @fields, + sub { + my $part_pkg = shift; + my %options = $part_pkg->options; + # gather any options that are really report options, + # convert them to their user-friendly names, + # and sort them (I think?) + my @report_options = + sort { $a cmp $b } + map { $report_optionname_name{$_} } + grep { $options{$_} + and exists($report_optionname_name{$_}) } + keys %options; + + my @rows; + foreach (@report_options) { + push @rows, [ + { 'data' => $_, + 'align' => 'center', + 'colspan' => 2 + } + ]; + } # foreach @report_options + \@rows; + }; + +$align .= 'cr'; + +# -------- +# now the FCC option part +# -------- + +my @pkgparts; +push @header, 'FCC report parameters'; +push @fields, sub { + my $part_pkg = shift; + my %hash = $part_pkg->fcc_options; + include('/elements/input-fcc_options.html', + id => 'pkgpart'.$part_pkg->pkgpart, + curr_value => encode_json(\%hash), + html_only => 1 + ); +}; +$align .= 'l'; + +my $count_extra_sql = $extra_sql; +$count_extra_sql =~ s/^\s*AND /WHERE /i; +$extra_count = ( $count_extra_sql ? ' AND ' : ' WHERE ' ). $extra_count + if $extra_count; +my $count_query = "SELECT COUNT(*) FROM part_pkg $count_extra_sql $extra_count"; + +my $html_init = + include('/elements/init_overlib.html') . + include('/elements/input-fcc_options.html', js_only => 1) . + include('.style'); + +my $html_form = ''; +my $html_foot = ''; +# insert a checkbox column +unshift @header, ''; +unshift @fields, sub { + '<INPUT TYPE="checkbox" NAME="pkgpart" VALUE=' . $_[0]->pkgpart .'>'; +}; +unshift @links, ''; +$align = 'c'.$align; + + +$html_form = qq!<FORM ACTION="${p}edit/process/bulk-part_pkg-fcc.html" METHOD="POST">!; +$html_foot = qq! + <INPUT TYPE="submit" VALUE="Save changes"> + </FORM>!; + +my @menubar = + ( 'Package definitions' => $p.'browse/part_pkg.cgi' ); + +</%init> +<%def .style> +<style> + ul.fcc_options { + text-align: left; + } + ul.fcc_options li { + } + button.edit_fcc_options { + float: right; + } +</style> +</%def> diff --git a/httemplate/edit/deploy_zone-fixed.html b/httemplate/edit/deploy_zone-fixed.html new file mode 100644 index 000000000..ecec9c434 --- /dev/null +++ b/httemplate/edit/deploy_zone-fixed.html @@ -0,0 +1,87 @@ +<& elements/edit.html, + 'name_singular' => 'deployment zone', + 'table' => 'deploy_zone', + 'post_url' => popurl(1).'process/deploy_zone-fixed.html', + 'labels' => { + 'description' => 'Description', + 'agentnum' => 'Agent', + 'dbaname' => 'Business name (if different from agent)', + 'technology' => 'Technology', + 'adv_speed_up' => 'Upstream', + 'adv_speed_down' => 'Downstream', + 'cir_speed_up' => 'Upstream', + 'cir_speed_down' => 'Downstream', + 'is_consumer' => 'Consumer/mass market', + 'is_business' => 'Business/government', + 'blocknum' => '', + }, + 'fields' => [ + { field => 'zonetype', + type => 'hidden', + value => 'B' + }, + { field => 'servicetype', + type => 'hidden', + value => 'broadband' + }, + 'description', + { field => 'agentnum', + type => 'select-agent', + disable_empty => 1, + viewall_right => 'Edit FCC report configuration for all agents', + }, + 'dbaname', + { field => 'technology', + type => 'select', + options => [ keys(%$technology_labels) ], + labels => $technology_labels, + }, + { field => 'is_consumer', type => 'checkbox', value=>'Y' }, + { field => 'is_business', type => 'checkbox', value=>'Y' }, + { type => 'tablebreak-tr-title', + value => 'Advertised maximum speed (Mbps)' }, + 'adv_speed_down', + 'adv_speed_up', + { type => 'tablebreak-tr-title', + value => 'Contractually guaranteed speed (Mbps)' }, + 'cir_speed_down', + 'cir_speed_up', + + { type => 'tablebreak-tr-title', value => 'Census blocks'}, + { field => 'blocknum', + type => 'deploy_zone_block', + o2m_table => 'deploy_zone_block', + m2_label => ' ', + m2_error_callback => $m2_error_callback, + }, + ], + +&> +<%init> +my $curuser = $FS::CurrentUser::CurrentUser; +die "access denied" + unless $curuser->access_right([ + 'Edit FCC report configuration', + 'Edit FCC report configuration for all agents', + ]); + +my $technology_labels = FS::part_pkg_fcc_option->technology_labels; + +my $m2_error_callback = sub { + my ($cgi, $deploy_zone) = @_; + my @blocknums = grep { + /^blocknum\d+/ and length($cgi->param($_.'_censusblock')) + } $cgi->param; + + map { + my $k = $_; + FS::deploy_zone_block->new({ + blocknum => scalar($cgi->param($k)), + zonenum => $deploy_zone->zonenum, + censusblock => scalar($cgi->param($k.'_censusblock')), + censusyear => scalar($cgi->param($k.'_censusyear')), + }) + } @blocknums; +}; + +</%init> diff --git a/httemplate/edit/part_pkg.cgi b/httemplate/edit/part_pkg.cgi index 9e55d9f42..65eca6cf4 100755 --- a/httemplate/edit/part_pkg.cgi +++ b/httemplate/edit/part_pkg.cgi @@ -232,23 +232,26 @@ }, }, - { type => 'tablebreak-tr-title', - value => 'FCC Form 477 information', - }, - { field => 'fcc_options_string', - type => 'input-fcc_options', - curr_value_callback => sub { - my ($cgi, $part_pkg, $fref) = @_; - if ( $cgi->param('fcc_options_string') ) { - # error redirect - return $cgi->param('fcc_options_string'); - } - my %hash; - %hash = $part_pkg->fcc_options - if ($part_pkg->pkgpart); - return encode_json(\%hash); + ($fcc_opts ? ( + { type => 'tablebreak-tr-title', + value => 'FCC Form 477 information', }, - }, + { field => 'fcc_options_string', + type => 'input-fcc_options', + curr_value_callback => sub { + my ($cgi, $part_pkg, $fref) = @_; + if ( $cgi->param('fcc_options_string') ) { + # error redirect + return $cgi->param('fcc_options_string'); + } + my %hash; + %hash = $part_pkg->fcc_options + if ($part_pkg->pkgpart); + return encode_json(\%hash); + }, + }, + ) : () + ), { type => 'tablebreak-tr-title', value => 'External Links', #better name? @@ -405,6 +408,8 @@ my $agent_clone_extra_sql = my $conf = new FS::Conf; my $taxproducts = $conf->exists('enable_taxproducts'); +my $fcc_opts = $conf->exists('part_pkg-show_fcc_options'); + my @locales = grep { ! /^en_/i } $conf->config('available-locales'); #should filter from the default locale lang instead of en_ my %locale_labels = map { ( $_ => 'Package -- '. FS::Locales->description($_) ) diff --git a/httemplate/edit/process/deploy_zone-fixed.html b/httemplate/edit/process/deploy_zone-fixed.html new file mode 100644 index 000000000..c14c81c58 --- /dev/null +++ b/httemplate/edit/process/deploy_zone-fixed.html @@ -0,0 +1,9 @@ +<& elements/process.html, + error_redirect => popurl(2).'deploy_zone-fixed.html?', + table => 'deploy_zone', + viewall_dir => 'browse', + process_o2m => + { 'table' => 'deploy_zone_block', + 'fields' => [qw( censusblock censusyear )] + }, +&> diff --git a/httemplate/elements/deploy_zone_block.html b/httemplate/elements/deploy_zone_block.html new file mode 100644 index 000000000..9985944bd --- /dev/null +++ b/httemplate/elements/deploy_zone_block.html @@ -0,0 +1,47 @@ +% unless ( $opt{'js_only'} ) { + + <INPUT TYPE="hidden" NAME="<%$name%>" ID="<%$id%>" VALUE="<% $curr_value %>"> + Block + <INPUT TYPE = "text" + NAME = "<%$name%>_censusblock" + ID = "<%$id%>_censusblock" + VALUE = "<% scalar($cgi->param($name.'_censusblock')) + || $deploy_zone_block->censusblock + %>" + SIZE = 17 + MAXLENGTH = 15 + <% $onchange %> + > + + Year + <INPUT TYPE = "text" + NAME = "<%$name%>_censusyear" + ID = "<%$id%>_censusyear" + VALUE = "<% scalar($cgi->param($name.'_censusyear')) + || $deploy_zone_block->censusyear + %>" + SIZE = 5 + MAXLENGTH = 4 + <% $onchange %> + > +% } +<%init> + +my( %opt ) = @_; + +my $name = $opt{'element_name'} || $opt{'field'} || 'blocknum'; +my $id = $opt{'id'} || 'blocknum'; + +my $curr_value = $opt{'curr_value'} || $opt{'value'}; + +my $onchange = $opt{'onchange'}; +if ( $onchange ) { + $onchange =~ s/\(what\);/(this);/; + $onchange = 'onchange="'.$onchange.'"'; +} + +my $deploy_zone_block = $curr_value + ? FS::deploy_zone_block->by_key($curr_value) + : FS::deploy_zone_block->new; + +</%init> diff --git a/httemplate/elements/input-fcc_options.html b/httemplate/elements/input-fcc_options.html new file mode 100644 index 000000000..b191e1c07 --- /dev/null +++ b/httemplate/elements/input-fcc_options.html @@ -0,0 +1,108 @@ +% unless ($opt{js_only}) { +<& hidden.html, 'field' => $id, @_ &> +%# <& input-text.html, 'id' => $id, @_ &> # XXX debugging +<UL ID="<%$id%>_display_fcc_options" CLASS="fcc_options"> +</UL> +<button type="button" class="edit_fcc_button" data-target="<% $id %>"> + Edit +</button> +% } +% unless ($opt{html_only}) { +% my $popup = $fsurl.'misc/part_pkg_fcc_options.html?id='; +% my $popup_name = 'popup-'.time. "-$$-". rand() * 2**32; +<SCRIPT TYPE="text/javascript"> +function edit_fcc_options() { + var id = this.dataset['target']; + overlib( + OLiframeContent( '<% $popup %>' + id, + 760, 600, '<% $popup_name %>', 0, 'auto' ), + CAPTION, 'FCC Form 477 options', + STICKY, AUTOSTATUSCAP, MIDX, 0, MIDY, 0, + DRAGGABLE, CLOSECLICK, + BGCOLOR, '#333399', CGCOLOR, '#333399', + CLOSETEXT, 'Close' + ); +} + +var technology_labels = <% encode_json(FS::part_pkg_fcc_option->technology_labels) %>; +function show_fcc_options(id) { + var curr_values = JSON.parse(document.getElementById(id).value); + // hardcoded for the same reasons as misc/part_pkg_fcc_options + var out = ''; + var tech = curr_values['technology']; + if ( tech ) { + if (technology_labels[tech]) { + tech = technology_labels[tech]; + } else { + tech = 'Technology '+tech; // unknown? + } + } + var media = String.toLowerCase(curr_values['media'] || 'unknown media'); + if ( curr_values['is_consumer'] ) { + out += '<li><strong>Consumer-grade</strong> service</li>>'; + } else { + out += '<li><strong>Business-grade</strong> service</li>'; + } + if ( curr_values['is_broadband'] ) { + out += '<li>Broadband via <strong>' + tech + '</strong>' + + '<li><strong>' + curr_values['broadband_downstream'] + + 'Mbps </strong> down / ' + + '<strong>' + curr_values['broadband_upstream'] + + 'Mbps </strong> up</li>'; + } + if ( curr_values['is_phone'] ) { + if ( curr_values['phone_wholesale'] ) { + out += '<li>Wholesale telephone</li>'; + if ( curr_values['phone_vges'] ) { + out += '<li><strong>' + curr_values['phone_vges'] + '</strong>' + + ' switched voice-grade lines</li>'; + } + if ( curr_values['phone_circuits'] ) { + out += '<li><strong>' + curr_values['phone_circuits'] + '</strong>' + + ' unswitched circuits</li>'; + } + } else { + // enduser service + out += '<li>Local telephone over <strong>' + media + '</strong></li>' + + '<li><strong>' + curr_values['phone_lines'] + + '</strong> voice-grade lines</li>'; + if ( curr_values['phone_localloop'] == 'resale' ) { + out += '<li><strong>Resold</strong> from another carrier</li>>'; + } else if ( curr_values['phone_localloop'] == 'leased' ) { + out += '<li>Using <strong>leased circuits</strong> from another carrier</li>'; + } else if ( curr_values['phone_localloop'] == 'owned' ) { + out += '<li>Using <strong>our own circuits</strong></li>'; + } + if ( curr_values['phone_longdistance'] ) { + out += '<li>Includes <strong>long-distance service</strong></li>'; + } + } + } // is_phone + if ( curr_values['is_voip'] ) { + out += '<li><strong>VoIP</strong> telephone service</li>'; + out += '<li><strong>' + curr_values['voip_sessions'] + + '</strong> sessions allowed</li>'; + if ( curr_values['voip_lastmile'] ) { + out += '<li><strong>Including</strong> last-mile connection</li>'; + } else { + out += '<li>Using a <strong>separate</strong> last-mile connection</li>'; + } + } // is_voip + + var out_ul = document.getElementById(id + '_display_fcc_options'); + out_ul.innerHTML = out; +} +<&| onload.js &> + var edit_fcc_buttons = document.getElementsByClassName('edit_fcc_button'); + for(var i = 0; i < edit_fcc_buttons.length; i++) { + var button = edit_fcc_buttons[i]; + show_fcc_options( button.dataset['target'] ); + button.addEventListener('click', edit_fcc_options); + } +</&> +</SCRIPT> +% } +<%init> +my %opt = @_; +my $id = $opt{id} || $opt{field}; +</%init> diff --git a/httemplate/elements/tr-input-fcc_options.html b/httemplate/elements/tr-input-fcc_options.html index 11cb4a962..58f7247c4 100644 --- a/httemplate/elements/tr-input-fcc_options.html +++ b/httemplate/elements/tr-input-fcc_options.html @@ -41,9 +41,9 @@ function show_fcc_options() { } var media = String.toLowerCase(curr_values['media'] || 'unknown media'); if ( curr_values['is_consumer'] ) { - out += '<li><strong>Consumer-grade</strong> service</li>>'; + out += '<li><strong>Consumer-grade</strong></li>>'; } else { - out += '<li><strong>Business-grade</strong> service</li>'; + out += '<li><strong>Business-grade</strong></li>'; } if ( curr_values['is_broadband'] ) { out += '<li>Broadband via <strong>' + tech + '</strong>' diff --git a/httemplate/misc/part_pkg_fcc_options.html b/httemplate/misc/part_pkg_fcc_options.html index f74328446..a5ecb12bc 100644 --- a/httemplate/misc/part_pkg_fcc_options.html +++ b/httemplate/misc/part_pkg_fcc_options.html @@ -90,6 +90,8 @@ <& .checkbox, 'is_voip' &> <LABEL FOR="is_voip">This package provides VoIP telephone service</LABEL> <FIELDSET ID="voip"> + <LABEL FOR="voip_sessions">Number of simultaneous calls possible</LABEL> + <INPUT NAME="voip_sessions" ID="voip_sessions"> <& .checkbox, 'voip_lastmile' &> <LABEL FOR="voip_lastmile">Do you also provide last-mile connectivity?</LABEL> </FIELDSET> @@ -145,7 +147,7 @@ function save_changes() { } parent_input.value = JSON.stringify(data); // update the display - parent.show_fcc_options(); + parent.show_fcc_options(parent_input.id); parent.cClick(); //overlib } @@ -179,6 +181,11 @@ function enable_fieldset(fieldset_id) { form.elements['phone1'].disabled = (this.value == ''); } ); + addEventListener(form.elements['is_phone'], 'change', + function() { + form.elements['phone_wholesale'].dispatchEvent( new Event('change') ); + } + ); // load data from the parent form and trigger handlers for(var i = 0; i < form.elements.length; i++) { diff --git a/httemplate/search/477.html b/httemplate/search/477.html index 68493377d..26bd9f33b 100644 --- a/httemplate/search/477.html +++ b/httemplate/search/477.html @@ -36,20 +36,19 @@ a.download { float: right; } </STYLE> -% foreach my $partnum (@partnums) { -% $cgi->param('parts', $partnum); +% foreach my $partname (@partnames) { +% $cgi->param('parts', $partname); % $cgi->param('type', 'csv'); <table class="fcc477part"> <caption> - <span class="parttitle">Part <% $partnum %></span> + <span class="parttitle"><% $parttitle{$partname} %></span> <a class="download" href="<% $cgi->self_url %>">Download</a> </caption> -% my $header = ".header$partnum"; -% my $data = $parts{$partnum}; +% my $header = ".header_$partname"; +% my $data = $parts{$partname}; <thead> <& $header &> </thead> -% #XXX column headings % foreach my $row (@$data) { <tr> % foreach my $item (@$row) { @@ -58,7 +57,7 @@ a.download { </tr> % } </table> -% } # foreach $partnum +% } # foreach $partname <& /elements/footer.html &> <%init> die "access denied" @@ -80,10 +79,10 @@ if ($cgi->param('agentnum') =~ /^(\d+)$/ ) { $agentnum = $1; } my $date = parse_datetime($cgi->param('date')) || time; -my @partnums = grep /^\d+$/, $cgi->param('parts'); -foreach my $partnum (@partnums) { - my $method = "part$partnum"; - $parts{$partnum} ||= FS::Report::FCC_477->$method( +my @partnames = grep /^\w+$/, $cgi->param('parts'); +foreach my $partname (@partnames) { + my $method = "report_$partname"; + $parts{$partname} ||= FS::Report::FCC_477->$method( date => $date, agentnum => $agentnum ); @@ -93,11 +92,11 @@ $m->cache->set($session, \%parts, '1h'); my $title = 'FCC Form 477 Data - ' . time2str('%b %o, %Y', $date); if ( $cgi->param('type') eq 'csv' ) { - my $partnum = $partnums[0]; # ignore any beyond the first - my $data = $parts{$partnum}; + my $partname = $partnames[0]; # ignore any beyond the first + my $data = $parts{$partname}; my $csv = Text::CSV_XS->new({ eol => "\r\n" }); # i think - my $filename = time2str('%Y-%m-%d', $date) . '-part' . $partnum . '.csv'; + my $filename = time2str('%Y-%m-%d', $date) . '-'. $partname . '.csv'; http_header('Content-Type' => 'text/csv'); http_header('Content-Disposition' => qq(attachment;filename="$filename")); @@ -111,7 +110,7 @@ if ( $cgi->param('type') eq 'csv' ) { } </%init> -<%def .header6> +<%def .header_fixed_broadband> <TR CLASS="head"> <TD ROWSPAN=2>Census Tract</TD> <TD ROWSPAN=2>Technology</TD> @@ -125,30 +124,18 @@ if ( $cgi->param('type') eq 'csv' ) { <TD>Consumer</TD> </TR> </%def> -<%def .header7> +<%def .header_fixed_voice> <TR CLASS="head"> - <TD ROWSPAN=2>State</TD> - <TD COLSPAN=2>Speed (Mbps)</TD> - <TD COLSPAN=2>Subscriptions</TD> + <TD ROWSPAN=2>Census Tract</TD> + <TD ROWSPAN=2>VoIP?</TD> + <TD COLSPAN=2>Lines/Subscriptions</TD> </TR> <TR CLASS="subhead"> - <TD>Down</TD> - <TD>Up</TD> <TD>Total</TD> <TD>Consumer</TD> </TR> </%def> -<%def .header8> - <TR CLASS="head"> - <TD ROWSPAN=2>State</TD> - <TD COLSPAN=2>Subscriptions</TD> - </TR> - <TR CLASS="subhead"> - <TD>Total</TD> - <TD>Direct</TD> - </TR> -</%def> -<%def .header9> +<%def .header_local_phone> <TR CLASS="head"> <TD ROWSPAN=3>State</TD> <TD COLSPAN=2>Wholesale</TD> @@ -183,7 +170,7 @@ if ( $cgi->param('type') eq 'csv' ) { <TD>Wireless</TD> </TR> </%def> -<%def .header10> +<%def .header_voip> <TR CLASS="head"> <TD ROWSPAN=2>State</TD> <TD COLSPAN=2>VoIP OTT</TD> @@ -206,14 +193,29 @@ if ( $cgi->param('type') eq 'csv' ) { <TD>Other</TD> </TR> </%def> -<%def .header11> +<%def .header_mobile_broadband> +%# unimplemented <TR CLASS="head"> - <TD ROWSPAN=2>Census Tract</TD> - <TD ROWSPAN=2>VoIP?</TD> - <TD COLSPAN=2>Lines/Subscriptions</TD> + <TD ROWSPAN=2>State</TD> + <TD COLSPAN=2>Speed (Mbps)</TD> + <TD COLSPAN=2>Subscriptions</TD> </TR> <TR CLASS="subhead"> + <TD>Down</TD> + <TD>Up</TD> <TD>Total</TD> <TD>Consumer</TD> </TR> </%def> +<%def .header_mobile_voice> +%# unimplemented + <TR CLASS="head"> + <TD ROWSPAN=2>State</TD> + <TD COLSPAN=2>Subscriptions</TD> + </TR> + <TR CLASS="subhead"> + <TD>Total</TD> + <TD>Direct</TD> + </TR> +</%def> + diff --git a/httemplate/search/report_477.html b/httemplate/search/report_477.html index e3ae69e6f..2a6878ef4 100755 --- a/httemplate/search/report_477.html +++ b/httemplate/search/report_477.html @@ -31,12 +31,12 @@ 'label' => 'Enable parts', 'field' => 'parts', 'labels' => { - 6 => 'Part 6 (Fixed Broadband Subscription)', + fixed_broadband => 'Fixed Broadband Subscription', #7 => 'Part 7 (Mobile Wireless Broadband Subscription), #8 => 'Part 8 (Mobile Local Telephone Subscription), - 9 => 'Part 9 (Local Exchange Telephone Subscription)', - 10 => 'Part 10 (Interconnected VoIP Subscription)', - 11 => 'Part 11 (Voice Telephone Subscription Detail)', + fixed_voice => 'Voice Telephone Subscription', + local_phone => 'Local Exchange Telephone Subscription', + voip => 'Interconnected VoIP Subscription', }, options => [ 6, 9, 10, 11 ], &> |