summaryrefslogtreecommitdiff
path: root/FS/FS/part_export/bulkvs_e911.pm
diff options
context:
space:
mode:
authorMark Wells <mark@freeside.biz>2013-07-19 17:25:25 -0700
committerMark Wells <mark@freeside.biz>2013-07-19 17:25:25 -0700
commit3107476389f090334fe1d92df6fab68c366408b4 (patch)
tree0666113b5e8eaedf1408f0956b981c73da51215a /FS/FS/part_export/bulkvs_e911.pm
parent3fa4e563b63c858ed8ab518bf6a7286622424435 (diff)
BulkVS E911 provisioning, #23894
Diffstat (limited to 'FS/FS/part_export/bulkvs_e911.pm')
-rw-r--r--FS/FS/part_export/bulkvs_e911.pm124
1 files changed, 124 insertions, 0 deletions
diff --git a/FS/FS/part_export/bulkvs_e911.pm b/FS/FS/part_export/bulkvs_e911.pm
new file mode 100644
index 0000000..c66305b
--- /dev/null
+++ b/FS/FS/part_export/bulkvs_e911.pm
@@ -0,0 +1,124 @@
+package FS::part_export::bulkvs_e911;
+
+use strict;
+use vars qw(%info $me $DEBUG);
+use base 'FS::part_export';
+use FS::svc_phone;
+use Tie::IxHash;
+
+use SOAP::Lite;
+use Digest::MD5 'md5_hex';
+use Data::Dumper;
+
+$DEBUG = 2;
+$me = '['.__PACKAGE__.']';
+
+tie my %options, 'Tie::IxHash', (
+ 'apikey' => { label=>'Bulkvs.com API key' },
+ 'password' => { label=>'Bulkvs.com website password' },
+);
+
+%info = (
+ 'svc' => 'svc_phone',
+ 'desc' => 'Provision e911 services via BulkVS',
+ 'notes' => <<END
+<p>Provision e911 services via BulkVS. Currently does not support provisioning
+phone numbers, only e911 service itself.</p>
+<p><i>apikey</i> is available through the web interface (look under the E911
+Portal submenu). <i>password</i> is your password for the website, which will
+be used to calculate your API password.</p>
+END
+ ,
+ 'no_machine' => 1,
+ 'options' => \%options,
+);
+
+my $client;
+
+sub client {
+ my $self = shift;
+ my $endpoint = 'https://portal.bulkvs.com/api';
+ my $wsdl = $endpoint . '?wsdl';
+ # it's expensive to create but completely stateless, so cache it freely
+ $client ||= SOAP::Lite->service( $wsdl )->proxy( $endpoint );
+}
+
+sub login {
+ my $self = shift;
+ my $apikey = $self->option('apikey')
+ or die "no Bulkvs.com API key configured";
+ my $pass = $self->option('password')
+ or die "no Bulkvs.com password configured";
+
+ ( $apikey, md5_hex($pass) );
+}
+
+sub _export_insert {
+ my ($self, $svc_phone) = @_;
+ my @login = $self->login;
+
+ my $location = $svc_phone->cust_location
+ or return 'no e911 location defined for this phone service';
+
+ warn "$me validating address for svcnum ".$svc_phone->svcnum."\n"
+ if $DEBUG;
+ my $result = $self->client->e911validateAddress( @login,
+ $location->address1,
+ $location->address2,
+ $location->city,
+ $location->state,
+ $location->zip,
+ );
+ warn Dumper $result if $DEBUG > 1;
+ if ( $result->{'faultstring'} ) {
+ return "E911 provisioning error: ".$result->{'faultstring'};
+ } elsif ( !exists($result->{entry0}->{addressid}) ) {
+ return "E911 provisioning error: server returned no address ID";
+ }
+
+ my $caller_name = $svc_phone->cust_linked ?
+ $svc_phone->cust_main->name_short :
+ 'unknown';
+
+ warn "$me provisioning address for svcnum ".$svc_phone->svcnum."\n"
+ if $DEBUG;
+ $result = $self->client->e911provisionAddress( @login,
+ '1'.$svc_phone->phonenum,
+ $caller_name,
+ $result->{entry0}->{addressid},
+ );
+ warn Dumper $result if $DEBUG > 1;
+ if ( $result->{'faultstring'} ) {
+ return "E911 provisioning error: ".$result->{'faultstring'};
+ }
+ '';
+}
+
+sub _export_delete {
+ my ($self, $svc_phone) = @_;
+ my @login = $self->login;
+ warn "$me removing address for svcnum ".$svc_phone->svcnum."\n"
+ if $DEBUG;
+ my $result = $self->client->e911removeRecord( @login,
+ '1'.$svc_phone->phonenum
+ );
+ warn Dumper $result if $DEBUG > 1;
+ if ( $result->{'faultstring'} ) {
+ return "E911 unprovisioning error: ".$result->{'faultstring'};
+ }
+ '';
+}
+
+sub _export_replace {
+ my ($self, $new, $old) = @_;
+ # BulkVS says that to change an address for an existing number,
+ # we should reprovision it without removing the old record.
+ if ( $new->phonenum ne $old->phonenum ) {
+ my $error = $self->_export_delete($old);
+ return $error if $error;
+ }
+ $self->_export_insert($new);
+}
+
+1;
+