From: Mark Wells Date: Tue, 29 Mar 2016 00:36:25 +0000 (-0700) Subject: slightly better error reporting for DID selector, from #39914 X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=commitdiff_plain;h=79dc2b72b17acaa6aa19da6cd4f8c1b8a194a794 slightly better error reporting for DID selector, from #39914 --- diff --git a/FS/FS/part_export.pm b/FS/FS/part_export.pm index 1b6c55a8b..572a1b684 100644 --- a/FS/FS/part_export.pm +++ b/FS/FS/part_export.pm @@ -804,6 +804,8 @@ will return an array of actual DID numbers. Passing 'tollfree' with a true value will override the whole hierarchy and return an array of tollfree numbers. +C methods should report errors via die(). + =cut # no stub; can('get_dids') should return false by default diff --git a/FS/FS/part_export/bandwidth_com.pm b/FS/FS/part_export/bandwidth_com.pm index 6c69fe356..4fbc2de21 100644 --- a/FS/FS/part_export/bandwidth_com.pm +++ b/FS/FS/part_export/bandwidth_com.pm @@ -151,43 +151,46 @@ sub can_get_dids { 1 } sub get_dids_npa_select { 1 } sub get_dids { - local $SIG{__DIE__}; my $self = shift; my %opt = @_; my ($exportnum) = $self->exportnum =~ /^(\d+)$/; - return [] if $opt{'tollfree'}; # we'll come back to this + try { + return [] if $opt{'tollfree'}; # we'll come back to this - my ($state, $npa, $nxx) = @opt{'state', 'areacode', 'exchange'}; + my ($state, $npa, $nxx) = @opt{'state', 'areacode', 'exchange'}; - if ( $nxx ) { + if ( $nxx ) { - die "areacode required\n" unless $npa; - my $limit = $self->option('num_dids') || 20; - my $result = $self->api_get('availableNumbers', [ - 'npaNxx' => $npa.$nxx, - 'quantity' => $limit, - 'LCA' => 'false', - # find only those that match the NPA-NXX, not those thought to be in - # the same local calling area. though that might be useful. - ]); - return [ $result->findnodes('//TelephoneNumber')->to_literal_list ]; + die "areacode required\n" unless $npa; + my $limit = $self->option('num_dids') || 20; + my $result = $self->api_get('availableNumbers', [ + 'npaNxx' => $npa.$nxx, + 'quantity' => $limit, + 'LCA' => 'false', + # find only those that match the NPA-NXX, not those thought to be in + # the same local calling area. though that might be useful. + ]); + return [ $result->findnodes('//TelephoneNumber')->to_literal_list ]; - } elsif ( $npa ) { + } elsif ( $npa ) { - return $self->npanxx_cache($npa); + return $self->npanxx_cache($npa); - } elsif ( $state ) { + } elsif ( $state ) { - return $self->npa_cache($state); + return $self->npa_cache($state); - } else { # something's wrong + } else { # something's wrong - warn "get_dids called with no arguments"; - return []; + warn "get_dids called with no arguments"; + return []; + } + } catch { + die "$me $_\n"; } } diff --git a/FS/FS/part_export/test.pm b/FS/FS/part_export/test.pm index 126897c0b..392fc4feb 100644 --- a/FS/FS/part_export/test.pm +++ b/FS/FS/part_export/test.pm @@ -18,6 +18,7 @@ tie %options, 'Tie::IxHash', 'replace' => { label => 'Replace',type => 'checkbox', default => 1, }, 'suspend' => { label => 'Suspend',type => 'checkbox', default => 1, }, 'unsuspend'=>{ label => 'Unsuspend', type => 'checkbox', default => 1, }, + 'get_dids_npa_select' => { label => 'DIDs by NPA', type => 'checkbox' }, ; %info = ( @@ -31,6 +32,8 @@ or always dies, according to the "Result" option. It does nothing else; the purpose is purely to simulate success or failure within an export module.

The checkbox options can be used to turn the export off for certain actions, if this is needed.

+

This export will produce a small set of DIDs, in either Alabama (if the +"DIDs by NPA" option is on) or California (if not).

END ); @@ -72,4 +75,79 @@ sub run { } } +sub can_get_dids { 1 } + +sub get_dids_npa_select { + my $self = shift; + $self->option('get_dids_npa_select') ? 1 : 0; +} + +# we don't yet have tollfree + +my $dids_by_npa = { + 'states' => [ 'AK', 'AL' ], + # states + 'AK' => [], + 'AL' => [ '205', '998', '999' ], + # NPAs + '205' => [ 'ALABASTER (205-555-XXXX)', # an NPA-NXX + 'EMPTY (205-998-XXXX)', + 'INVALID (205-999-XXXX)', + 'ALBERTVILLE, AL', # a ratecenter + ], + '998' => [], + '999' => undef, + # exchanges + '205555' => + [ + '2055550101', + '2055550102' + ], + '205998' => [], + '205999' => undef, + # ratecenters + 'ALBERTVILLE' => [ + '2055550111', + '2055550112', + ], +}, + +my $dids_by_region = { + 'states' => [ 'CA', 'CO' ], + 'CA' => [ 'CALIFORNIA', + 'EMPTY', + 'INVALID' + ], + 'CO' => [], + # regions + 'CALIFORNIA' => [ + '4155550200', + '4155550201', + ], + 'EMPTY' => [], + 'INVALID' => undef, +}; + +sub get_dids { + my $self = shift; + my %opt = @_; + my $data = $self->get_dids_npa_select ? $dids_by_npa : $dids_by_region; + + my $key; + if ( $opt{'exchange'} ) { + $key = $opt{'areacode'} . $opt{'exchange'}; + } else { + $key = $opt{'ratecenter'} + || $opt{'areacode'} + || $opt{'region'} + || $opt{'state'} + || 'states'; + } + if ( defined $data->{ $key } ) { + return $data->{ $key }; + } else { + die "[test] '$key' is invalid\n"; + } +} + 1; diff --git a/httemplate/REST/1.0/phone_avail b/httemplate/REST/1.0/phone_avail index ef9d3e7f0..c6638f48f 100644 --- a/httemplate/REST/1.0/phone_avail +++ b/httemplate/REST/1.0/phone_avail @@ -17,7 +17,8 @@ if ( scalar(@exports) > 1 ) { die "no DID providing export attached to svcpart $svcpart"; } my $export = $exports[0]; - + +# XXX no error handling my $phonenums = $export->get_dids( map { $_ => scalar($cgi->param($_)) } qw( ratecenter state areacode exchange ) ); diff --git a/httemplate/elements/select-areacode.html b/httemplate/elements/select-areacode.html index f0f56d56d..612f03a8b 100644 --- a/httemplate/elements/select-areacode.html +++ b/httemplate/elements/select-areacode.html @@ -28,6 +28,7 @@ function <% $opt{'prefix'} %>update_areacodes(areacodes) { + var reply = JSON.parse(areacodes); // blank the current areacode for ( var i = what.form.<% $opt{'prefix'} %>areacode.length; i >= 0; i-- ) what.form.<% $opt{'prefix'} %>areacode.options[i] = null; @@ -47,7 +48,7 @@ % } // add the new areacodes - var areacodeArray = eval('(' + areacodes + ')' ); + var areacodeArray = reply.areacodes; for ( var s = 0; s < areacodeArray.length; s++ ) { var areacodeLabel = areacodeArray[s]; if ( areacodeLabel == "" ) @@ -62,6 +63,11 @@ } else { var areacodeerror = document.getElementById('<% $opt{'prefix'} %>areacodeerror'); areacodeerror.style.display = 'inline'; + if ( reply.error ) { + areacodeerror.textContent = reply.error; + } else { + areacodeerror.textContent = 'Select a different state'; + } } //run the callback @@ -78,7 +84,7 @@ - + > diff --git a/httemplate/elements/select-phonenum.html b/httemplate/elements/select-phonenum.html index 118fe4901..dd1b84736 100644 --- a/httemplate/elements/select-phonenum.html +++ b/httemplate/elements/select-phonenum.html @@ -56,6 +56,7 @@ passing the exchange (or region) and function <% $opt{'prefix'} %>update_phonenums(phonenums) { + var reply = JSON.parse(phonenums); // blank the current phonenum for ( var i = what.form.<% $opt{'prefix'} %>phonenum.length; i >= 0; i-- ) what.form.<% $opt{'prefix'} %>phonenum.options[i] = null; @@ -67,7 +68,7 @@ passing the exchange (or region) and % } // add the new phonenums - var phonenumArray = eval('(' + phonenums + ')' ); + var phonenumArray = reply.phonenums; for ( var s = 0; s < phonenumArray.length; s++ ) { var phonenumLabel = phonenumArray[s]; if ( phonenumLabel == "" ) @@ -86,6 +87,11 @@ passing the exchange (or region) and } else { var phonenumerror = document.getElementById('<% $opt{'prefix'} %>phonenumerror'); phonenumerror.style.display = 'inline'; + if ( reply.error ) { + phonenumerror.textContent = reply.error; + } else { + phonenumerror.textContent = 'Select a different <% $opt{'region'} ? 'region' : 'city/exchange' %>'; + } } //run the callback @@ -157,7 +163,7 @@ passing the exchange (or region) and % unless ( $opt{'tollfree'} ) { - + % } > diff --git a/httemplate/misc/areacodes.cgi b/httemplate/misc/areacodes.cgi index 4b31deb00..afbe93e91 100644 --- a/httemplate/misc/areacodes.cgi +++ b/httemplate/misc/areacodes.cgi @@ -1,4 +1,4 @@ -<% encode_json(\@areacodes) %>\ +<% encode_json({ error => $error, areacodes => \@areacodes}) %>\ <%init> my( $state, $svcpart ) = $cgi->param('arg'); @@ -7,6 +7,8 @@ my $part_svc = qsearchs('part_svc', { 'svcpart'=>$svcpart } ); die "unknown svcpart $svcpart" unless $part_svc; my @areacodes = (); +my $error; + if ( $state ) { my @exports = $part_svc->part_export_did; @@ -17,9 +19,12 @@ if ( $state ) { } my $export = $exports[0]; - my $something = $export->get_dids('state'=>$state); + local $@; + local $SIG{__DIE__}; + my $something = eval { $export->get_dids('state'=>$state) }; + $error = $@; - @areacodes = @{ $something }; + @areacodes = @{ $something } if $something; } diff --git a/httemplate/misc/exchanges.cgi b/httemplate/misc/exchanges.cgi index 0de4ace25..d62679191 100644 --- a/httemplate/misc/exchanges.cgi +++ b/httemplate/misc/exchanges.cgi @@ -1,4 +1,4 @@ -<% encode_json(\@exchanges) %>\ +<% encode_json({ error => $error, exchanges => \@exchanges}) %>\ <%init> my( $areacode, $svcpart ) = $cgi->param('arg'); @@ -7,6 +7,8 @@ my $part_svc = qsearchs('part_svc', { 'svcpart'=>$svcpart } ); die "unknown svcpart $svcpart" unless $part_svc; my @exchanges = (); +my $error; + if ( $areacode ) { my @exports = $part_svc->part_export_did; @@ -17,9 +19,12 @@ if ( $areacode ) { } my $export = $exports[0]; - my $something = $export->get_dids('areacode'=>$areacode); + local $@; + local $SIG{__DIE__}; + my $something = eval { $export->get_dids('areacode'=>$areacode) }; + $error = $@; - @exchanges = @{ $something }; + @exchanges = @{ $something } if $something; } diff --git a/httemplate/misc/phonenums.cgi b/httemplate/misc/phonenums.cgi index 62923ac62..aae04f5d1 100644 --- a/httemplate/misc/phonenums.cgi +++ b/httemplate/misc/phonenums.cgi @@ -1,4 +1,4 @@ -<% encode_json(\@phonenums) %>\ +<% encode_json({ error => $error, phonenums => \@phonenums}) %>\ <%init> my( $exchangestring, $svcpart ) = $cgi->param('arg'); @@ -7,6 +7,7 @@ my $part_svc = qsearchs('part_svc', { 'svcpart'=>$svcpart } ); die "unknown svcpart $svcpart" unless $part_svc; my @phonenums = (); +my $error; if ( $exchangestring ) { @@ -35,8 +36,12 @@ if ( $exchangestring ) { $opts{'exchange'} = $exchange; } - my $something = $export->get_dids(%opts); - @phonenums = @{ $something }; + local $@; + local $SIG{__DIE__}; + my $something = eval { $export->get_dids(%opts) }; + $error = $@; + + @phonenums = @{ $something } if $something; } diff --git a/httemplate/misc/regions.cgi b/httemplate/misc/regions.cgi index 31538b08e..882dd48df 100644 --- a/httemplate/misc/regions.cgi +++ b/httemplate/misc/regions.cgi @@ -1,4 +1,4 @@ -<% encode_json(\@regions) %>\ +<% encode_json({ error => $error, regions => \@regions}) %>\ <%init> my( $state, $svcpart ) = $cgi->param('arg'); @@ -7,6 +7,8 @@ my $part_svc = qsearchs('part_svc', { 'svcpart'=>$svcpart } ); die "unknown svcpart $svcpart" unless $part_svc; my @regions = (); +my $error; + if ( $state ) { my @exports = $part_svc->part_export_did; @@ -17,9 +19,12 @@ if ( $state ) { } my $export = $exports[0]; - my $something = $export->get_dids('state'=>$state); + local $@; + local $SIG{__DIE__}; + my $something = eval { $export->get_dids('state'=>$state) }; + $error = $@; - @regions = @{ $something }; + @regions = @{ $something } if $something; }