summaryrefslogtreecommitdiff
path: root/httemplate
diff options
context:
space:
mode:
authorMark Wells <mark@freeside.biz>2014-07-31 22:54:08 -0700
committerMark Wells <mark@freeside.biz>2014-07-31 22:54:08 -0700
commit0f359d5480aa1621d73ee802f420e8951abc620d (patch)
tree4bab32c865f9ef7b2bb03247a6be75215cfebf85 /httemplate
parent6c284750de8fe49d7d4cdc6a9a4fb618697780e2 (diff)
new 477 report: deployment info, combined browse-edit UI, #24047
Diffstat (limited to 'httemplate')
-rw-r--r--httemplate/browse/deploy_zone.html72
-rwxr-xr-xhttemplate/browse/part_pkg-fcc.html215
-rw-r--r--httemplate/edit/deploy_zone-fixed.html87
-rwxr-xr-xhttemplate/edit/part_pkg.cgi37
-rw-r--r--httemplate/edit/process/deploy_zone-fixed.html9
-rw-r--r--httemplate/elements/deploy_zone_block.html47
-rw-r--r--httemplate/elements/input-fcc_options.html108
-rw-r--r--httemplate/elements/tr-input-fcc_options.html4
-rw-r--r--httemplate/misc/part_pkg_fcc_options.html9
-rw-r--r--httemplate/search/477.html76
-rwxr-xr-xhttemplate/search/report_477.html8
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 %>
+ >
+ &nbsp;
+ 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 ],
&>