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 => '' },
15 'ems' => { label => 'Full EMS', type => 'checkbox' },
19 'svc' => 'svc_broadband',
20 'desc' => 'Real-time export to Northbound Interface',
21 'options' => \%options,
23 'notes' => 'These are notes.'
27 my ($self,$namespace,$method) = (shift,shift,shift);
29 eval "use Net::Prizm qw(CustomerInfo PrizmElement);";
32 my $prizm = new Net::Prizm (
33 namespace => $namespace,
34 url => $self->option('url'),
35 user => $self->option('user'),
36 password => $self->option('password'),
42 sub queued_prizm_command { # subroutine
43 my( $url, $user, $password, $namespace, $method, @args ) = @_;
45 eval "use Net::Prizm qw(CustomerInfo PrizmElement);";
48 my $prizm = new Net::Prizm (
49 namespace => $namespace,
52 password => $password,
55 $err_or_som = $prizm->$method( @args);
58 unless ref($err_or_som);
65 my( $self, $svc ) = ( shift, shift );
67 my $cust_main = $svc->cust_svc->cust_pkg->cust_main;
69 my $err_or_som = $self->prizm_command('CustomerIfService', 'getCustomers',
71 [$cust_main->custnum],
75 unless ref($err_or_som);
78 if ( defined $cust_main->dbdef_table->column('ship_last') ) {
79 $pre = $cust_main->ship_last ? 'ship_' : '';
81 my $name = $pre ? $cust_main->ship_name : $cust_main->name;
82 my $location = join(" ", map { my $method = "$pre$_"; $cust_main->$method }
83 qw (address1 address2 city state zip)
85 my $contact = join(" ", map { my $method = "$pre$_"; $cust_main->$method }
90 if ($err_or_som->result->[0]) {
91 $pcustomer = $err_or_som->result->[0]->customerId;
93 my $chashref = $cust_main->hashref;
95 importId => $cust_main->custnum,
96 customerName => $name,
97 customerType => 'freeside',
98 address1 => $chashref->{"${pre}address1"},
99 address2 => $chashref->{"${pre}address2"},
100 city => $chashref->{"${pre}city"},
101 state => $chashref->{"${pre}state"},
102 zipCode => $chashref->{"${pre}zip"},
103 workPhone => $chashref->{"${pre}daytime"},
104 homePhone => $chashref->{"${pre}night"},
105 email => @{[$cust_main->invoicing_list_emailonly]}[0],
106 extraFieldNames => [ 'country', 'freesideId',
108 extraFieldValues => [ $chashref->{"${pre}country"}, $cust_main->custnum,
112 $err_or_som = $self->prizm_command('CustomerIfService', 'addCustomer',
115 unless ref($err_or_som);
117 $pcustomer = $err_or_som->result;
119 warn "multiple prizm customers found for $cust_main->custnum"
120 if scalar(@$pcustomer) > 1;
122 # #kinda big question/expensive
123 # $err_or_som = $self->prizm_command('NetworkIfService', 'getPrizmElements',
124 # ['Network Default Gateway Address'],
125 # [$svc->addr_block->ip_gateway],
129 # unless ref($err_or_som);
131 # return "No elements in network" unless exists $err_or_som->result->[0];
134 # for (my $i = 0; $i < $err_or_som->result->[0]->attributeNames; $i++) {
135 # if ($err_or_som->result->[0]->attributeNames->[$i] eq "Network.ID"){
136 # $networkid = $err_or_som->result->[0]->attributeValues->[$i];
141 $err_or_som = $self->prizm_command('NetworkIfService', 'addProvisionedElement',
144 $name, # we fix this below (bug in prizm?)
147 sprintf("%032X", $svc->authkey),
148 $svc->cust_svc->cust_pkg->part_pkg->pkg,
150 $self->option('ems') == 1,
153 unless ref($err_or_som);
155 my (@names) = ('Management IP',
163 my (@values) = ($svc->ip_addr,
167 $name . " " . $svc->description,
171 $element = $err_or_som->result->elementId;
172 $err_or_som = $self->prizm_command('NetworkIfService', 'setElementConfig',
180 unless ref($err_or_som);
182 $err_or_som = $self->prizm_command('NetworkIfService', 'setElementConfigSet',
189 unless ref($err_or_som);
191 $err_or_som = $self->prizm_command('NetworkIfService', 'setElementConfigSet',
193 $svc->cust_svc->cust_pkg->part_pkg->pkg,
198 unless ref($err_or_som);
200 $err_or_som = $self->prizm_command('NetworkIfService',
201 'activateNetworkElements',
204 $self->option('ems') == 1,
208 unless ref($err_or_som);
210 $err_or_som = $self->prizm_command('CustomerIfService',
211 'addElementToCustomer',
219 unless ref($err_or_som);
225 my( $self, $svc ) = ( shift, shift );
227 my $cust_pkg = $svc->cust_svc->cust_pkg;
232 my $queue = new FS::queue {
233 'svcnum' => $svc->svcnum,
234 'job' => 'FS::part_export::prizm::queued_prizm_command',
237 ( map { $self->option($_) }
238 qw( url user password ) ),
240 'removeElementFromCustomer',
245 ) && push @$depend, $queue->jobnum;
248 $self->queue_statuschange('deleteElement', $depend, $svc, 1);
251 sub _export_replace {
252 my( $self, $new, $old ) = ( shift, shift, shift );
254 my $err_or_som = $self->prizm_command('NetworkIfService', 'getPrizmElements',
260 unless ref($err_or_som);
262 return "Can't find prizm element for " . $old->mac_addr
263 unless $err_or_som->result->[0];
265 my %freeside2prizm = ( mac_addr => 'MAC Address',
266 ip_addr => 'Management IP',
267 latitude => 'GPS Latitude',
268 longitude => 'GPS Longitude',
269 altitude => 'GPS Altitude',
270 authkey => 'Authentication Key',
274 my (@names) = map { push @values, $new->$_; $freeside2prizm{$_} }
275 grep { $old->$_ ne $new->$_ }
276 grep { exists($freeside2prizm{$_}) }
277 fields( 'svc_broadband' );
279 if ($old->description ne $new->description) {
280 my $cust_main = $old->cust_svc->cust_pkg->cust_main;
281 my $name = defined($cust_main->dbdef_table->column('ship_last'))
282 ? $cust_main->ship_name
284 push @values, $name . " " . $new->description;
285 push @names, "Site Name";
288 my $element = $err_or_som->result->[0]->elementId;
290 $err_or_som = $self->prizm_command('NetworkIfService', 'setElementConfig',
298 unless ref($err_or_som);
300 $err_or_som = $self->prizm_command('NetworkIfService', 'setElementConfigSet',
306 if $old->vlan_profile ne $new->vlan_profile;
309 unless ref($err_or_som);
315 sub _export_suspend {
316 my( $self, $svc ) = ( shift, shift );
317 my $ems = $self->option('ems') == 1;
318 $self->queue_statuschange('suspendNetworkElements', [], $svc, 1, $ems);
321 sub _export_unsuspend {
322 my( $self, $svc ) = ( shift, shift );
323 my $ems = $self->option('ems') == 1;
324 $self->queue_statuschange('activateNetworkElements', [], $svc, 1, $ems);
327 sub queue_statuschange {
328 my( $self, $method, $jobs, $svc, @args ) = @_;
330 # already in a transaction and can't die here
332 my $queue = new FS::queue {
333 'svcnum' => $svc->svcnum,
334 'job' => 'FS::part_export::prizm::statuschange',
337 ( map { $self->option($_) }
338 qw( url user password ) ),
344 if ($queue->jobnum) { # successful insertion
345 foreach my $job ( @$jobs ) {
346 $queue->depend_insert($job);
352 sub statuschange { # subroutine
353 my( $url, $user, $password, $method, $mac_addr, @args) = @_;
355 eval "use Net::Prizm qw(CustomerInfo PrizmElement);";
358 my $prizm = new Net::Prizm (
359 namespace => 'NetworkIfService',
362 password => $password,
365 my $err_or_som = $prizm->getPrizmElements( [ 'MAC Address' ],
370 unless ref($err_or_som);
372 die "Can't find prizm element for " . $mac_addr
373 unless $err_or_som->result->[0];
377 if ($method =~ /suspendNetworkElements/ || $method =~ /activateNetworkElements/) {
378 $arg1 = [ $err_or_som->result->[0]->elementId ];
380 $arg1 = $err_or_som->result->[0]->elementId;
382 $err_or_som = $prizm->$method( $arg1, @args );
385 unless ref($err_or_som);