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 . " " . $svc->description,
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,
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 );
204 my $custnum = $svc->cust_svc->cust_pkg->cust_main->custnum;
206 my $err_or_som = $self->prizm_command('NetworkIfService', 'getPrizmElements',
212 unless ref($err_or_som);
214 return "Can't find prizm element for " . $svc->mac_addr
215 unless $err_or_som->result->[0];
217 $err_or_som = $self->prizm_command('NetworkIfService',
218 'suspendNetworkElements',
219 [$err_or_som->result->[0]->elementId],
225 unless ref($err_or_som);
227 $err_or_som = $self->prizm_command('CustomerIfService',
228 'removeElementFromCustomer',
236 unless ref($err_or_som);
241 sub _export_replace {
242 my( $self, $new, $old ) = ( shift, shift, shift );
244 my $err_or_som = $self->prizm_command('NetworkIfService', 'getPrizmElements',
250 unless ref($err_or_som);
252 return "Can't find prizm element for " . $old->mac_addr
253 unless $err_or_som->result->[0];
255 my %freeside2prizm = ( mac_addr => 'MAC Address',
256 ip_addr => 'Management IP',
257 latitude => 'GPS Latitude',
258 longitude => 'GPS Longitude',
259 altitude => 'GPS Altitude',
260 authkey => 'Authentication Key',
264 my (@names) = map { push @values, $new->$_; $freeside2prizm{$_} }
265 grep { $old->$_ ne $new->$_ }
266 grep { exists($freeside2prizm{$_}) }
267 fields( 'svc_broadband' );
269 if ($old->description ne $new->description) {
270 my $cust_main = $old->cust_svc->cust_pkg->cust_main;
271 my $name = defined($cust_main->dbdef_table->column('ship_last'))
272 ? $cust_main->ship_name
274 push @values, $name . " " . $new->description;
275 push @names, "Site Name";
278 my $element = $err_or_som->result->[0]->elementId;
280 $err_or_som = $self->prizm_command('NetworkIfService', 'setElementConfig',
288 unless ref($err_or_som);
290 $err_or_som = $self->prizm_command('NetworkIfService', 'setElementConfigSet',
296 if $old->vlan_profile ne $new->vlan_profile;
299 unless ref($err_or_som);
305 sub _export_suspend {
306 my( $self, $svc ) = ( shift, shift );
308 my $err_or_som = $self->prizm_command('NetworkIfService', 'getPrizmElements',
314 unless ref($err_or_som);
316 return "Can't find prizm element for " . $svc->mac_addr
317 unless $err_or_som->result->[0];
319 $err_or_som = $self->prizm_command('NetworkIfService',
320 'suspendNetworkElements',
321 [ $err_or_som->result->[0]->elementId ],
327 unless ref($err_or_som);
333 sub _export_unsuspend {
334 my( $self, $svc ) = ( shift, shift );
336 my $err_or_som = $self->prizm_command('NetworkIfService', 'getPrizmElements',
342 unless ref($err_or_som);
344 return "Can't find prizm element for " . $svc->mac_addr
345 unless $err_or_som->result->[0];
347 $err_or_som = $self->prizm_command('NetworkIfService',
348 'activateNetworkElements',
349 [ $err_or_som->result->[0]->elementId ],
355 unless ref($err_or_som);