1 package FS::part_export::prizm;
3 use vars qw(@ISA %info %options $DEBUG);
5 use FS::Record qw(fields);
8 @ISA = qw(FS::part_export);
11 tie %options, 'Tie::IxHash',
12 'url' => { label => 'Northbound url', default=>'https://localhost:8443/prizm/nbi' },
13 'user' => { label => 'Northbound username', default=>'nbi' },
14 'password' => { label => 'Password', default => '' },
18 'svc' => 'svc_broadband',
19 'desc' => 'Real-time export to Northbound Interface',
20 'options' => \%options,
22 'notes' => 'These are notes.'
26 my ($self,$namespace,$method) = (shift,shift,shift);
28 eval "use Net::Prizm qw(CustomerInfo PrizmElement);";
31 my $prizm = new Net::Prizm (
32 namespace => $namespace,
33 url => $self->option('url'),
34 user => $self->option('user'),
35 password => $self->option('password'),
42 my( $self, $svc ) = ( shift, shift );
44 my $cust_main = $svc->cust_svc->cust_pkg->cust_main;
46 my $err_or_som = $self->prizm_command('CustomerIfService', 'getCustomers',
48 [$cust_main->custnum],
52 unless ref($err_or_som);
55 if ( defined $cust_main->dbdef_table->column('ship_last') ) {
56 $pre = $cust_main->ship_last ? 'ship_' : '';
58 my $name = $pre ? $cust_main->ship_name : $cust_main->name;
59 my $location = join(" ", map { my $method = "$pre$_"; $cust_main->$method }
60 qw (address1 address2 city state zip)
62 my $contact = join(" ", map { my $method = "$pre$_"; $cust_main->$method }
67 if ($err_or_som->result->[0]) {
68 $pcustomer = $err_or_som->result->[0]->customerId;
70 my $chashref = $cust_main->hashref;
72 importId => $cust_main->custnum,
73 customerName => $name,
74 customerType => 'freeside',
75 address1 => $chashref->{"${pre}address1"},
76 address2 => $chashref->{"${pre}address2"},
77 city => $chashref->{"${pre}city"},
78 state => $chashref->{"${pre}state"},
79 zipCode => $chashref->{"${pre}zip"},
80 workPhone => $chashref->{"${pre}daytime"},
81 homePhone => $chashref->{"${pre}night"},
82 email => @{[$cust_main->invoicing_list_emailonly]}[0],
83 extraFieldNames => [ 'country', 'freesideId',
85 extraFieldValues => [ $chashref->{"${pre}country"}, $cust_main->custnum,
89 $err_or_som = $self->prizm_command('CustomerIfService', 'addCustomer',
92 unless ref($err_or_som);
94 $pcustomer = $err_or_som->result;
96 warn "multiple prizm customers found for $cust_main->custnum"
97 if scalar(@$pcustomer) > 1;
99 #kinda big question/expensive
100 $err_or_som = $self->prizm_command('NetworkIfService', 'getPrizmElements',
101 ['Network Default Gateway Address'],
102 [$svc->addr_block->ip_gateway],
106 unless ref($err_or_som);
108 return "No elements in network" unless exists $err_or_som->result->[0];
111 for (my $i = 0; $i < $err_or_som->result->[0]->attributeNames; $i++) {
112 if ($err_or_som->result->[0]->attributeNames->[$i] eq "Network.ID"){
113 $networkid = $err_or_som->result->[0]->attributeValues->[$i];
118 $err_or_som = $self->prizm_command('NetworkIfService', 'addProvisionedElement',
121 $name, # we fix this below (bug in prizm?)
124 sprintf("%032X", $svc->authkey),
125 $svc->cust_svc->cust_pkg->part_pkg->pkg,
130 unless ref($err_or_som);
132 my (@names) = ('Management IP',
140 my (@values) = ($svc->ip_addr,
144 $name . " " . $svc->description,
148 $element = $err_or_som->result->elementId;
149 $err_or_som = $self->prizm_command('NetworkIfService', 'setElementConfig',
157 unless ref($err_or_som);
159 $err_or_som = $self->prizm_command('NetworkIfService', 'setElementConfigSet',
166 unless ref($err_or_som);
168 $err_or_som = $self->prizm_command('NetworkIfService', 'setElementConfigSet',
170 $svc->cust_svc->cust_pkg->part_pkg->pkg,
175 unless ref($err_or_som);
177 $err_or_som = $self->prizm_command('NetworkIfService',
178 'activateNetworkElements',
185 unless ref($err_or_som);
187 $err_or_som = $self->prizm_command('CustomerIfService',
188 'addElementToCustomer',
196 unless ref($err_or_som);
202 my( $self, $svc ) = ( shift, shift );
203 $self->queue_statuschange('deleteElement', $svc);
206 sub _export_replace {
207 my( $self, $new, $old ) = ( shift, shift, shift );
209 my $err_or_som = $self->prizm_command('NetworkIfService', 'getPrizmElements',
215 unless ref($err_or_som);
217 return "Can't find prizm element for " . $old->mac_addr
218 unless $err_or_som->result->[0];
220 my %freeside2prizm = ( mac_addr => 'MAC Address',
221 ip_addr => 'Management IP',
222 latitude => 'GPS Latitude',
223 longitude => 'GPS Longitude',
224 altitude => 'GPS Altitude',
225 authkey => 'Authentication Key',
229 my (@names) = map { push @values, $new->$_; $freeside2prizm{$_} }
230 grep { $old->$_ ne $new->$_ }
231 grep { exists($freeside2prizm{$_}) }
232 fields( 'svc_broadband' );
234 if ($old->description ne $new->description) {
235 my $cust_main = $old->cust_svc->cust_pkg->cust_main;
236 my $name = defined($cust_main->dbdef_table->column('ship_last'))
237 ? $cust_main->ship_name
239 push @values, $name . " " . $new->description;
240 push @names, "Site Name";
243 my $element = $err_or_som->result->[0]->elementId;
245 $err_or_som = $self->prizm_command('NetworkIfService', 'setElementConfig',
253 unless ref($err_or_som);
255 $err_or_som = $self->prizm_command('NetworkIfService', 'setElementConfigSet',
261 if $old->vlan_profile ne $new->vlan_profile;
264 unless ref($err_or_som);
270 sub _export_suspend {
271 my( $self, $svc ) = ( shift, shift );
272 $self->queue_statuschange('suspendNetworkElements', $svc);
275 sub _export_unsuspend {
276 my( $self, $svc ) = ( shift, shift );
277 $self->queue_statuschange('activateNetworkElements', $svc);
280 sub queue_statuschange {
281 my( $self, $method, $svc ) = @_;
283 my $queue = new FS::queue {
284 'svcnum' => $svc->svcnum,
285 'job' => 'FS::part_export::prizm::statuschange',
288 ( map { $self->option($_) }
289 qw( url user password ) ),
295 sub statuschange { # subroutine
296 my( $url, $user, $password, $method, $mac_addr ) = @_;
298 eval "use Net::Prizm qw(CustomerInfo PrizmElement);";
301 my $prizm = new Net::Prizm (
302 namespace => 'NetworkIfService',
305 password => $password,
308 my $err_or_som = $prizm->getPrizmElements( [ 'MAC Address' ],
313 unless ref($err_or_som);
315 die "Can't find prizm element for " . $mac_addr
316 unless $err_or_som->result->[0];
319 # yuck! should pass args in when we know 'em
320 if ($method =~ /suspendNetworkElements/ || $method =~ /activateNetworkElements/) {
321 @args = ( [ $err_or_som->result->[0]->elementId ], 1, 1);
323 @args = ( $err_or_som->result->[0]->elementId, 1);
325 $err_or_som = $prizm->$method( @args );
328 unless ref($err_or_som);