[freeside-commits] branch master updated. 5f9edcbe9fb3b3eb905614927aa6120d50c06ff1

Christopher Burger burgerc at freeside.biz
Tue Mar 13 11:08:32 PDT 2018


The branch, master has been updated
       via  5f9edcbe9fb3b3eb905614927aa6120d50c06ff1 (commit)
      from  e46f0ef0da8d0f639bacb293bfdf820e2a68b480 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 5f9edcbe9fb3b3eb905614927aa6120d50c06ff1
Author: Christopher Burger <burgerc at freeside.biz>
Date:   Tue Mar 13 14:07:39 2018 -0400

    RT# 78356 - updated documentation and added ability to create access points as Saisei thru api

diff --git a/FS/FS/Schema.pm b/FS/FS/Schema.pm
index 245fb68f8..236622b63 100644
--- a/FS/FS/Schema.pm
+++ b/FS/FS/Schema.pm
@@ -4927,6 +4927,8 @@ sub tables_hashref {
         'height',     'decimal', 'NULL',      '', '', '', 
         'veg_height', 'decimal', 'NULL',      '', '', '', 
         'color',      'varchar', 'NULL',       6, '', '',
+        'up_rate',        'int', 'NULL',      '', '', '',
+        'down_rate',      'int', 'NULL',      '', '', '',
       ],
       'primary_key' => 'towernum',
       'unique'      => [ [ 'towername' ] ], # , 'agentnum' ] ],
@@ -4957,8 +4959,9 @@ sub tables_hashref {
         'east',         'decimal', 'NULL', '10,7', '', '',
         'south',        'decimal', 'NULL', '10,7', '', '',
         'north',        'decimal', 'NULL', '10,7', '', '',
-
         'title',        'varchar', 'NULL', $char_d,'', '',
+        'up_rate',          'int', 'NULL',      '', '', '',
+        'down_rate',        'int', 'NULL',      '', '', '',
      ],
       'primary_key'  => 'sectornum',
       'unique'       => [ [ 'towernum', 'sectorname' ], [ 'ip_addr' ], ],
diff --git a/FS/FS/part_export/saisei.pm b/FS/FS/part_export/saisei.pm
index fc0dee5ad..f76051ea3 100644
--- a/FS/FS/part_export/saisei.pm
+++ b/FS/FS/part_export/saisei.pm
@@ -24,18 +24,29 @@ Saisei integration for Freeside
 
 This export offers basic svc_broadband provisioning for Saisei.
 
-This is a customer integration with Saisei.  This will setup a rate plan and tie
-the rate plan to a host via the Saisei API when the broadband service is provisioned.
-It will also untie the rate  plan via the API upon unprovisioning of the broadband service.
+This is a customer integration with Saisei.  This will setup a rate plan and tie 
+the rate plan to a host and access point via the Saisei API when the broadband service is provisioned.  
+It will also untie the rate plan via the API upon unprovisioning of the broadband service.
 
-This export will use the broadband service descriptive label for the Saisei rate plan name and
-will use the email from the first contact for the Saisei username that will be
-attached to this rate plan.  It will use the Saisei default Access Point.
+Add a new export and fill out required fields:
+<UL>
+<LI>Hostname or IP - <I>Host name to Saisei API</I></LI>
+<LI>Port - <I>Port number to Saisei API</I></LI>
+<LI>User Name -  <I>Saisei API user name</I></LI>
+<LI>Password - <I>Saisei API password</I></LI>
+</UL>
+Create a broadband service.  The broadband service name will become the Saisei rate plan name.
+Set the upload and download speed, and set the modifier to fixed.
+Set IP Address to required.
+Attach Saisei export to service
+
+Create a tower and add a sector to that tower.  The sector name will be the name of the access point,
+Make sure you have set an up and down rate for the Tower and Sector.
+
+When you provision the service, enter the ip address associated to this service.
+Select the Tower and Sector for it's access point.
 
-Hostname or IP - Host name to Saisei API
-Port - <I>Port number to Saisei API
-User Name -  <I>Saisei API user name
-Password - <I>Saisei API password
+When the service is provisioned it will auto setup the rate plan.
 
 This module also provides generic methods for working through the L</Saisei API>.
 
@@ -58,27 +69,37 @@ tie my %options, 'Tie::IxHash',
   'options'         => \%options,
   'notes'           => <<'END',
 This is a customer integration with Saisei.  This will setup a rate plan and tie 
-the rate plan to a host via the Saisei API when the broadband service is provisioned.  
-It will also untie the rate  plan via the API upon unprovisioning of the broadband service.
-<P>This export will use the broadband service descriptive label for the Saisei rate plan name and
-will use the email from the first contact for the Saisei username that will be
-attached to this rate plan.  It will use the Saisei default Access Point.
+the rate plan to a host and access point via the Saisei API when the broadband service is provisioned.  
+It will also untie the rate plan via the API upon unprovisioning of the broadband service.
 <P>
-Required Fields:
+Add a new export and fill out required fields:
 <UL>
 <LI>Hostname or IP - <I>Host name to Saisei API</I></LI>
 <LI>Port - <I>Port number to Saisei API</I></LI>
 <LI>User Name -  <I>Saisei API user name</I></LI>
 <LI>Password - <I>Saisei API password</I></LI>
 </UL>
+Create a broadband service.  The broadband service name will become the Saisei rate plan name.
+Set the upload and download speed, and set the modifier to fixed.
+Set IP Address to required.
+Attach Saisei export to service
+<P>
+Create a tower and add a sector to that tower.  The sector name will be the name of the access point,
+Make sure you have set an up and down rate for the Tower and Sector.
+<P>
+When you provision the service, enter the ip address associated to this service.
+Select the Tower and Sector for it's access point.
+<P>
+When the service is provisioned it will auto setup the rate plan.
 END
 );
 
 sub _export_insert {
   my ($self, $svc_broadband) = @_;
-  my $rateplan_name = $svc_broadband->{Hash}->{description};
-   $rateplan_name =~ s/\s/_/g;
 
+  my $service_part = FS::Record::qsearchs( 'part_svc', { 'svcpart' => $svc_broadband->{Hash}->{svcpart} } );
+  my $rateplan_name = $service_part->{Hash}->{svc};
+  $rateplan_name =~ s/\s/_/g;
 
   # load needed info from our end
   my $cust_main = $svc_broadband->cust_main;
@@ -99,19 +120,13 @@ sub _export_insert {
   # set rateplan to existing one or newly created one.
   my $rateplan = $existing_rateplan ? $existing_rateplan : $self->api_get_rateplan($rateplan_name);
 
-  my @email = map { $_->emailaddress } FS::Record::qsearch({
-        'table'     => 'cust_contact',
-        'select'    => 'emailaddress',
-        'addl_from' => ' JOIN contact_email USING (contactnum)',
-        'hashref'   => { 'custnum' => $cust_main->{Hash}->{custnum}, },
-    });
-  my $username = $email[0];
-  my $description = $cust_main->{Hash}->{first}." ".$cust_main->{Hash}->{last};
+  my $username = $svc_broadband->{Hash}->{svcnum};
+  my $description = $svc_broadband->{Hash}->{description};
 
   if (!$username) {
     $self->{'__saisei_error'} = 'no username - can not export';
-    warn "No email found $username\n" if $self->option('debug');
-    return;
+    warn "No user $username\n" if $self->option('debug');
+    return $self->api_error;
   }
   else {
     # check for existing user.
@@ -125,12 +140,65 @@ sub _export_insert {
     my $user = $existing_user ? $existing_user : $self->api_get_user($username);
 
     ## add access point ?
- 
-    ## tie host to user
-    $self->api_add_host_to_user($user->{collection}->[0]->{name}, $rateplan->{collection}->[0]->{name}, $svc_broadband->{Hash}->{ip_addr}) unless $self->{'__saisei_error'};
+    my $tower_sector = FS::Record::qsearchs({
+      'table'     => 'tower_sector',
+      'select'    => 'tower.towername,
+                      tower.up_rate as toweruprate,
+                      tower.down_rate as towerdownrate,
+                      tower_sector.sectorname,
+                      tower_sector.up_rate as sectoruprate,
+                      tower_sector.down_rate as sectordownrate ',
+      'addl_from' => 'LEFT JOIN tower USING ( towernum )',
+      'hashref'   => {
+                        'sectornum' => $svc_broadband->{Hash}->{sectornum},
+                     },
+    });
+
+    my $existing_tower_ap;
+    my $tower_name = $tower_sector->{Hash}->{towername};
+    $tower_name =~ s/\s/_/g;
+
+    #check if tower has been set up as an access point.
+    $existing_tower_ap = $self->api_get_accesspoint($tower_name) unless $self->{'__saisei_error'};;
+
+    #if tower does not exist as an access point create it.
+    $self->api_create_accesspoint(
+        $tower_name,
+        $tower_sector->{Hash}->{toweruprate},
+        $tower_sector->{Hash}->{towerdownrate}
+    ) unless $existing_tower_ap;
+
+    my $existing_sector_ap;
+    my $sector_name = $tower_sector->{Hash}->{sectorname};
+    $sector_name =~ s/\s/_/g;
+
+    #check if sector has been set up as an access point.
+    $existing_sector_ap = $self->api_get_accesspoint($sector_name);
+
+    #if sector does not exist as an access point create it.
+    $self->api_create_accesspoint(
+        $sector_name,
+        $tower_sector->{Hash}->{sectoruprate},
+        $tower_sector->{Hash}->{sectordownrate},
+        $tower_name,
+    ) unless $existing_sector_ap;
+
+    # Attach newly created sector to it's tower.
+    $self->api_modify_accesspoint($sector_name, $tower_name) unless ($self->{'__saisei_error'} || $existing_sector_ap);
+
+    # set access point to existing one or newly created one.
+    my $accesspoint = $existing_sector_ap ? $existing_sector_ap : $self->api_get_accesspoint($sector_name);
+
+    ## tie host to user add sector name as access point.
+    $self->api_add_host_to_user(
+      $user->{collection}->[0]->{name},
+      $rateplan->{collection}->[0]->{name},
+      $svc_broadband->{Hash}->{ip_addr},
+      $accesspoint->{collection}->[0]->{name},
+    ) unless $self->{'__saisei_error'};
   }
 
-  return '';
+  return $self->api_error;
 
 }
 
@@ -229,7 +297,7 @@ sub api_call {
 
 =head2 api_error
 
-Returns the error string set by L</PortaOne API> methods,
+Returns the error string set by L</Saisei API> methods,
 or a blank string if most recent call produced no errors.
 
 =cut
@@ -300,14 +368,14 @@ Gets user info for specific access point.
 
 sub api_get_accesspoint {
   my $self = shift;
-  my $accesspoint;
+  my $accesspoint = shift;
 
   my $get_accesspoint = $self->api_call("GET", "/access_points/$accesspoint");
   return if $self->api_error;
-  $self->{'__saisei_error'} = "Did not receive any user info"
+  $self->{'__saisei_error'} = "Did not receive any access point info"
     unless $get_accesspoint;
 
-  return;
+  return $get_accesspoint;
 }
 
 =head2 api_create_rateplan
@@ -397,19 +465,44 @@ Creates a access point.
 =cut
 
 sub api_create_accesspoint {
-  my ($self,$accesspoint) = @_;
+  my ($self,$accesspoint, $uprate, $downrate) = @_;
 
   # this has not been tested, but should work, if needed.
-  #my $new_accesspoint = $self->api_call(
-  #    "PUT", 
-  #    "/access_points/$accesspoint",
-  #    {
-  #      'description' => 'my description',
-  #    },
-  #);
-
-  #$self->{'__saisei_error'} = "Access point not created"
-  #  unless $new_accesspoint; # should never happen
+  my $new_accesspoint = $self->api_call(
+      "PUT",
+      "/access_points/$accesspoint",
+      {
+         'downstream_rate_limit' => $downrate,
+         'upstream_rate_limit' => $uprate,
+      },
+  );
+
+  $self->{'__saisei_error'} = "Access point not created"
+    unless $new_accesspoint; # should never happen
+  return;
+
+}
+
+=head2 api_modify_accesspoint
+
+Modify a access point.
+
+=cut
+
+sub api_modify_accesspoint {
+  my ($self, $accesspoint, $uplink) = @_;
+
+  my $modified_rateplan = $self->api_call(
+    "PUT",
+    "/access_points/$accesspoint",
+    {
+      'uplink' => $uplink, # name of attached access point
+    },
+  );
+
+  $self->{'__saisei_error'} = "Rate Plan not modified"
+    unless $modified_rateplan; # should never happen
+
   return;
 
 }
@@ -421,7 +514,7 @@ ties host to user, rateplan and default access point.
 =cut
 
 sub api_add_host_to_user {
-  my ($self,$user, $rateplan, $ip) = @_;
+  my ($self,$user, $rateplan, $ip, $accesspoint) = @_;
 
   my $new_host = $self->api_call(
       "PUT", 
@@ -429,6 +522,7 @@ sub api_add_host_to_user {
       {
         'user'      => $user,
         'rate_plan' => $rateplan,
+        'access_point' => $accesspoint,
       },
   );
 
diff --git a/FS/FS/tower.pm b/FS/FS/tower.pm
index 18b43fe7d..2221affb6 100644
--- a/FS/FS/tower.pm
+++ b/FS/FS/tower.pm
@@ -44,6 +44,14 @@ Tower name
 
 Disabled flag, empty or 'Y'
 
+=item up_rate
+
+Up Rate for towner
+
+=item down_rate
+
+Down Rate for tower
+
 =back
 
 =head1 METHODS
@@ -118,6 +126,8 @@ sub check {
     || $self->ut_floatn('height')
     || $self->ut_floatn('veg_height')
     || $self->ut_alphan('color')
+    || $self->ut_numbern('up_rate')
+    || $self->ut_numbern('down_rate')
   ;
   return $error if $error;
 
diff --git a/FS/FS/tower_sector.pm b/FS/FS/tower_sector.pm
index 2e9232307..6e3104acd 100644
--- a/FS/FS/tower_sector.pm
+++ b/FS/FS/tower_sector.pm
@@ -95,6 +95,18 @@ The coverage map, as a PNG.
 
 The coordinate boundaries of the coverage map.
 
+=item title
+
+The sector title.
+
+=item up_rate
+
+Up rate for sector.
+
+=item down_rate
+
+down rate for sector.
+
 =back
 
 =head1 METHODS
@@ -248,6 +260,8 @@ sub check {
     || $self->ut_decimaln('antenna_gain')
     || $self->ut_numbern('hardware_typenum')
     || $self->ut_textn('title')
+    || $self->ut_numbern('up_rate')
+    || $self->ut_numbern('down_rate')
     # all of these might get relocated as part of coverage refactoring
     || $self->ut_anything('image')
     || $self->ut_sfloatn('west')
diff --git a/httemplate/edit/process/tower.html b/httemplate/edit/process/tower.html
index cfbb4ffa3..f870d1237 100644
--- a/httemplate/edit/process/tower.html
+++ b/httemplate/edit/process/tower.html
@@ -6,7 +6,7 @@
                        sectorname ip_addr height freq_mhz direction width
                        downtilt v_width db_high db_low power line_loss
                        antenna_gain hardware_typenum
-                       sector_range
+                       sector_range up_rate down_rate
                      )],
                    },
 &>
diff --git a/httemplate/edit/tower.html b/httemplate/edit/tower.html
index 946a1405e..14f2dfa18 100644
--- a/httemplate/edit/tower.html
+++ b/httemplate/edit/tower.html
@@ -13,6 +13,8 @@
                         'altitude',
                         'height',
                         'veg_height',
+                        'up_rate',
+                        'down_rate',
 #                        { field             => 'sectornum',
 #                          type              => 'tower_sector',
 #                          o2m_table         => 'tower_sector',
@@ -35,6 +37,8 @@
                         'height'          => 'Tower height (feet)',
                         'veg_height'      => 'Vegetation height (feet)',
                         'color'           => 'Color',
+                        'up_rate'         => 'Up Rate (Kbps)',
+                        'down_rate'       => 'Down Rate (Kbps)',
                       },
 &>
 <%init>
@@ -43,7 +47,7 @@ my $m2_error_callback = sub { # reconstruct the list
   my ($cgi, $object) = @_;
 
   my @fields = qw(
-    sectorname ip_addr height freq_mhz direction width tilt v_width db_high db_low sector_range
+    sectorname ip_addr height freq_mhz direction width tilt v_width db_high db_low sector_range up_rate down_rate
   );
 
   map {
diff --git a/httemplate/elements/tr-tower_sectors.html b/httemplate/elements/tr-tower_sectors.html
index 106fc76f6..6843f4fdc 100644
--- a/httemplate/elements/tr-tower_sectors.html
+++ b/httemplate/elements/tr-tower_sectors.html
@@ -17,7 +17,7 @@ my $tabcounter = 0;
 my @fields = qw(
   sectorname ip_addr height freq_mhz direction width downtilt v_width
   db_high db_low sector_range
-  power line_loss antenna_gain hardware_typenum
+  power line_loss antenna_gain hardware_typenum up_rate down_rate
 );
 
 my @sectors;
@@ -291,6 +291,20 @@ $(function() {
              value="<% $sector->db_low |h %>">
       <% emt('dB (low quality)') %>
   </div>
+  <p>
+  <label><% emt('Up Rate (Kbps)') %></label>
+    <input style="text-align: left"
+           id="<% $id %>_up_rate"
+           name="<% $id %>_up_rate"
+           value="<% $sector->up_rate |h %>">
+  </p>
+  <p>
+    <label><% emt('Down Rate (Kbps)') %></label>
+    <input style="text-align: left"
+           id="<% $id %>_down_rate"
+           name="<% $id %>_down_rate"
+           value="<% $sector->down_rate |h %>">
+  </p>
 
 </div>
 </%def>

-----------------------------------------------------------------------

Summary of changes:
 FS/FS/Schema.pm                           |   5 +-
 FS/FS/part_export/saisei.pm               | 190 ++++++++++++++++++++++--------
 FS/FS/tower.pm                            |  10 ++
 FS/FS/tower_sector.pm                     |  14 +++
 httemplate/edit/process/tower.html        |   2 +-
 httemplate/edit/tower.html                |   6 +-
 httemplate/elements/tr-tower_sectors.html |  16 ++-
 7 files changed, 191 insertions(+), 52 deletions(-)




More information about the freeside-commits mailing list