RT# 83450 - fixed rateplan export
[freeside.git] / FS / FS / part_export / prizm.pm
index 75b10a7..9964489 100644 (file)
@@ -1,12 +1,13 @@
 package FS::part_export::prizm;
 
-use vars qw(@ISA %info %options $DEBUG);
+use vars qw(@ISA %info %options $DEBUG $me);
 use Tie::IxHash;
 use FS::Record qw(fields dbh);
 use FS::part_export;
 
 @ISA = qw(FS::part_export);
-$DEBUG = 1;
+$DEBUG = 0;
+$me = '[' . __PACKAGE__ . ']';
 
 tie %options, 'Tie::IxHash',
   'url'      => { label => 'Northbound url', default=>'https://localhost:8443/prizm/nbi' },
@@ -78,11 +79,12 @@ possibly harmful.
 EOT
 
 %info = (
-  'svc'      => 'svc_broadband',
-  'desc'     => 'Real-time export to Northbound Interface',
-  'options'  => \%options,
-  'nodomain' => 'Y',
-  'notes'    => $notes,
+  'svc'        => 'svc_broadband',
+  'desc'       => 'Real-time export to Northbound Interface',
+  'options'    => \%options,
+  'nodomain'   => 'Y',
+  'no_machine' => 1,
+  'notes'      => $notes,
 );
 
 sub prizm_command {
@@ -125,6 +127,9 @@ sub queued_prizm_command {  # subroutine
 
 sub _export_insert {
   my( $self, $svc ) = ( shift, shift );
+  warn "$me: _export_insert called for export ". $self->exportnum.
+    " on service ". $svc->svcnum. "\n"
+    if $DEBUG;
 
   my $cust_main = $svc->cust_svc->cust_pkg->cust_main;
 
@@ -151,6 +156,7 @@ sub _export_insert {
   my $pcustomer;
   if ($err_or_som->result->[0]) {
     $pcustomer = $err_or_som->result->[0]->customerId;
+    warn "$me: found customer $pcustomer in prizm\n" if $DEBUG;
   }else{
     my $chashref = $cust_main->hashref;
     my $customerinfo = {
@@ -177,6 +183,7 @@ sub _export_insert {
       unless ref($err_or_som);
 
     $pcustomer = $err_or_som->result;
+    warn "$me: added customer $pcustomer to prizm\n" if $DEBUG;
   }
   warn "multiple prizm customers found for $cust_main->custnum"
     if scalar(@$pcustomer) > 1;
@@ -200,6 +207,32 @@ sub _export_insert {
 #    }
 #  }
 
+# here we cope with a problem of prizm failing to insert for reason
+# of duplicate mac addr, but doing so inconsistently... a race in prizm?
+
+  $self->prizm_command( 'CustomerIfService', 'removeElementFromCustomer',
+                        0,
+                        $cust_main->custnum,
+                        0,
+                        $svc->mac_addr,
+                      );
+
+  $err_or_som = $self->prizm_command( 'NetworkIfService', 'getPrizmElements',
+                                      [ 'MAC Address' ],
+                                      [ $svc->mac_addr ],
+                                      [ '=' ],
+                                    );
+  if ( ref($err_or_som) && $err_or_som->result->[0] ) { # ignore errors
+    $self->prizm_command( 'NetworkIfService', 'deleteElement',
+                          $err_or_som->result->[0],
+                          1,
+                        );
+  }
+# end of coping
+
+  my $performance_profile = $svc->performance_profile;
+  $performance_profile ||= $svc->cust_svc->cust_pkg->part_pkg->pkg;
+
   my $element_name_length = 50;
   $element_name_length = $1
     if $self->option('element_name_length') =~ /^\s*(\d+)\s*$/;
@@ -210,13 +243,14 @@ sub _export_insert {
                                              0, $element_name_length),
                                       $location,
                                       $contact,
-                                      sprintf("%032X", $svc->authkey),
-                                      $svc->cust_svc->cust_pkg->part_pkg->pkg,
+                                      sprintf("%032X", $svc->authkey || 0),
+                                      $performance_profile,
                                       $svc->vlan_profile,
                                       ($self->option('ems') ? 1 : 0 ),
                                      );
   return $err_or_som
     unless ref($err_or_som);
+  warn "$me: added provisioned element to prizm\n" if $DEBUG;
 
   my (@names) = ('Management IP',
                  'GPS Latitude',
@@ -244,6 +278,7 @@ sub _export_insert {
                                     );
   return $err_or_som
     unless ref($err_or_som);
+  warn "$me: set element configuration\n" if $DEBUG;
 
   $err_or_som = $self->prizm_command('NetworkIfService', 'setElementConfigSet',
                                      [ $element ],
@@ -253,15 +288,17 @@ sub _export_insert {
                                     );
   return $err_or_som
     unless ref($err_or_som);
+  warn "$me: set element vlan profile\n" if $DEBUG;
 
   $err_or_som = $self->prizm_command('NetworkIfService', 'setElementConfigSet',
                                      [ $element ],
-                                     $svc->cust_svc->cust_pkg->part_pkg->pkg,
+                                     $performance_profile,
                                      0,
                                      1,
                                     );
   return $err_or_som
     unless ref($err_or_som);
+  warn "$me: set element configset (performance profile)\n" if $DEBUG;
 
   $err_or_som = $self->prizm_command('NetworkIfService',
                                      'activateNetworkElements',
@@ -272,6 +309,7 @@ sub _export_insert {
 
   return $err_or_som
     unless ref($err_or_som);
+  warn "$me: activated element\n" if $DEBUG;
 
   $err_or_som = $self->prizm_command('CustomerIfService',
                                      'addElementToCustomer',
@@ -283,6 +321,7 @@ sub _export_insert {
 
   return $err_or_som
     unless ref($err_or_som);
+  warn "$me: added element to customer\n" if $DEBUG;
 
   '';
 }
@@ -395,6 +434,18 @@ sub _export_replace {
   return $err_or_som
     unless ref($err_or_som);
 
+  my $performance_profile = $new->performance_profile;
+  $performance_profile ||= $new->cust_svc->cust_pkg->part_pkg->pkg;
+
+  $err_or_som = $self->prizm_command('NetworkIfService', 'setElementConfigSet',
+                                     [ $element ],
+                                     $performance_profile,
+                                     0,
+                                     1,
+                                    );
+  return $err_or_som
+    unless ref($err_or_som);
+
   '';
 
 }
@@ -466,7 +517,8 @@ sub _export_unsuspend {
 sub export_links {
   my( $self, $svc, $arrayref ) = ( shift, shift, shift );
 
-  push @$arrayref, '<A HREF="http://'. $svc->ip_addr. '">SM</A>';
+  push @$arrayref,
+    '<A HREF="http://'. $svc->ip_addr. '" target="_blank">SM</A>';
 
   '';
 }