[freeside-commits] branch FREESIDE_4_BRANCH updated. f2412b41b222b6021df4066ae7f31010aea7e659

Christopher Burger burgerc at freeside.biz
Tue Feb 20 06:48:04 PST 2018


The branch, FREESIDE_4_BRANCH has been updated
       via  f2412b41b222b6021df4066ae7f31010aea7e659 (commit)
       via  6012d2110821ba8d410627eb169f060824d36fc6 (commit)
       via  a538d9a92cb80be2f07c8a2fecc97f1b1fa12317 (commit)
       via  a3da777b3b4c5a3a01b28fa8be5c0ff1fe97a1bd (commit)
      from  ee4b070571c9a8fde8431a07896f896b5357180f (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 f2412b41b222b6021df4066ae7f31010aea7e659
Author: Christopher Burger <burgerc at freeside.biz>
Date:   Tue Feb 20 09:14:06 2018 -0500

    RT# 78356 - Added user documentation

diff --git a/FS/FS/part_export/saisei.pm b/FS/FS/part_export/saisei.pm
index 98079cbc4..fc0dee5ad 100644
--- a/FS/FS/part_export/saisei.pm
+++ b/FS/FS/part_export/saisei.pm
@@ -10,8 +10,6 @@ use REST::Client;
 use Data::Dumper;
 use FS::Conf;
 
-#@ISA = qw( FS::part_export::http );
-
 =pod
 
 =head1 NAME
@@ -26,6 +24,19 @@ 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 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.
+
+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
+
 This module also provides generic methods for working through the L</Saisei API>.
 
 =cut
@@ -46,18 +57,23 @@ tie my %options, 'Tie::IxHash',
   'desc'            => 'Export broadband service/account to Saisei',
   'options'         => \%options,
   'notes'           => <<'END',
-This is customer integration with 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.
+<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.
+<P>
+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>
 END
 );
 
-#"/STM_IP:5000/rest/top/configurations/running/" is for http 5029 for https
-
-#Creating User Names
-#Users are tracked by their name which gives access to the internal slice data which in turn allows the viewing of  Applications and Geo-Locations.
-#Creating a user name requires a command of the following format: -
-#'put', 'users/USER_NAME', {'description':description}
-#When creating a user name it is usual to add a description and since a user attribute set does not normally contain the users plan name it is best to encode it into the description field.
-
 sub _export_insert {
   my ($self, $svc_broadband) = @_;
   my $rateplan_name = $svc_broadband->{Hash}->{description};
@@ -166,15 +182,10 @@ set in the export options.
 
 =head2 api_call
 
-Accepts I<$service>, I<$method>, I<$params> hashref and optional
-I<$returnfield>.  Places an api call to the specified service
-and method with the specified params.  Returns the decoded json
-object returned by the api call.  If I<$returnfield> is specified,
-returns only that field of the decoded object, and errors out if
-that field does not exist.  Returns empty on failure;  retrieve
-error messages using L</api_error>.
-
-Must run L</api_login> first.
+Accepts I<$method>, I<$path>, I<$params> hashref and optional.
+Places an api call to the specified path and method with the specified params.
+Returns the decoded json object returned by the api call.
+Returns empty on failure;  retrieve error messages using L</api_error>.
 
 =cut
 
@@ -357,7 +368,7 @@ sub api_modify_rateplan {
 
 =head2 api_create_user
 
-Creates a rateplan.
+Creates a user.
 
 =cut
 
@@ -388,6 +399,7 @@ Creates a access point.
 sub api_create_accesspoint {
   my ($self,$accesspoint) = @_;
 
+  # this has not been tested, but should work, if needed.
   #my $new_accesspoint = $self->api_call(
   #    "PUT", 
   #    "/access_points/$accesspoint",
@@ -404,7 +416,7 @@ sub api_create_accesspoint {
 
 =head2 api_add_host_to_user
 
-ties host to user and rateplan.
+ties host to user, rateplan and default access point.
 
 =cut
 
@@ -427,9 +439,9 @@ sub api_add_host_to_user {
 
 }
 
-=head2 api_add_host_to_user
+=head2 api_delete_host_to_user
 
-ties host to user and rateplan.
+unties host to user and rateplan.
 
 =cut
 

commit 6012d2110821ba8d410627eb169f060824d36fc6
Author: Christopher Burger <burgerc at freeside.biz>
Date:   Mon Feb 19 14:55:07 2018 -0500

    RT# 78356 - added ability to remove service thru api when service is unprovisioned.

diff --git a/FS/FS/part_export/saisei.pm b/FS/FS/part_export/saisei.pm
index 5e6279b68..98079cbc4 100644
--- a/FS/FS/part_export/saisei.pm
+++ b/FS/FS/part_export/saisei.pm
@@ -193,7 +193,7 @@ sub api_call {
   my $client = REST::Client->new();
   $client->addHeader("Authorization", "Basic ".encode_base64($auth_info));
   $client->setHost('http://'.$self->{Hash}->{machine}.':'.$self->option('port'));
-  $client->$method('/rest/stm/configurations/running/'.$path, $data, { "Content-type" => 'application/json'});
+  $client->$method('/rest/stm/configurations/running'.$path, $data, { "Content-type" => 'application/json'});
 
   warn "Response Code is ".$client->responseCode()."\n" if $self->option('debug');
 
@@ -237,7 +237,7 @@ Gets a list of global policies.
 sub api_get_policies {
   my $self = shift;
 
-  my $get_policies = $self->api_call("GET", 'policies/?token=1&order=name&start=0&limit=20&select=name%2Cpercent_rate%2Cassured%2C');
+  my $get_policies = $self->api_call("GET", '/policies/?token=1&order=name&start=0&limit=20&select=name%2Cpercent_rate%2Cassured%2C');
   return if $self->api_error;
   $self->{'__saisei_error'} = "Did not receive any global policies"
     unless $get_policies;
@@ -255,7 +255,7 @@ sub api_get_rateplan {
   my $self = shift;
   my $rateplan = shift;
 
-  my $get_rateplan = $self->api_call("GET", "rate_plans/$rateplan");
+  my $get_rateplan = $self->api_call("GET", "/rate_plans/$rateplan");
   return if $self->api_error;
   $self->{'__saisei_error'} = "Did not receive any rateplan info"
     unless $get_rateplan;
@@ -273,7 +273,7 @@ sub api_get_user {
   my $self = shift;
   my $user = shift;
 
-  my $get_user = $self->api_call("GET", "users/$user");
+  my $get_user = $self->api_call("GET", "/users/$user");
   return if $self->api_error;
   $self->{'__saisei_error'} = "Did not receive any user info"
     unless $get_user;
@@ -291,7 +291,7 @@ sub api_get_accesspoint {
   my $self = shift;
   my $accesspoint;
 
-  my $get_accesspoint = $self->api_call("GET", "access_points/$accesspoint");
+  my $get_accesspoint = $self->api_call("GET", "/access_points/$accesspoint");
   return if $self->api_error;
   $self->{'__saisei_error'} = "Did not receive any user info"
     unless $get_accesspoint;
@@ -310,7 +310,7 @@ sub api_create_rateplan {
 
   my $new_rateplan = $self->api_call(
       "PUT", 
-      "rate_plans/$rateplan",
+      "/rate_plans/$rateplan",
       {
         'downstream_rate' => $svc->{Hash}->{speed_down},
         'upstream_rate' => $svc->{Hash}->{speed_up},
@@ -338,7 +338,7 @@ sub api_modify_rateplan {
     if ($policy->{background}) { $rate_multiplier = ".01"; }
     my $modified_rateplan = $self->api_call(
       "PUT", 
-      "rate_plans/$rateplan_name/partitions/$policyname",
+      "/rate_plans/$rateplan_name/partitions/$policyname",
       {
         'restricted'      =>  $policy->{assured},         # policy_assured_flag
         'rate_multiplier' => $rate_multiplier,           # policy_background 0.1
@@ -366,7 +366,7 @@ sub api_create_user {
 
   my $new_user = $self->api_call(
       "PUT", 
-      "users/$user",
+      "/users/$user",
       {
         'description' => $description,
       },
@@ -390,7 +390,7 @@ sub api_create_accesspoint {
 
   #my $new_accesspoint = $self->api_call(
   #    "PUT", 
-  #    "access_points/$accesspoint",
+  #    "/access_points/$accesspoint",
   #    {
   #      'description' => 'my description',
   #    },
@@ -413,7 +413,7 @@ sub api_add_host_to_user {
 
   my $new_host = $self->api_call(
       "PUT", 
-      "hosts/$ip",
+      "/hosts/$ip",
       {
         'user'      => $user,
         'rate_plan' => $rateplan,
@@ -436,7 +436,22 @@ ties host to user and rateplan.
 sub api_delete_host_to_user {
   my ($self,$user, $rateplan, $ip) = @_;
 
-  my $delete_host = $self->api_call("DELETE", "hosts/$ip");
+  my $default_rate_plan = $self->api_call("GET", '?token=1&select=default_rate_plan');
+    return if $self->api_error;
+  $self->{'__saisei_error'} = "Did not receive a default rate plan"
+    unless $default_rate_plan;
+
+  my $default_rateplan_name = $default_rate_plan->{collection}->[0]->{default_rate_plan}->{link}->{name};
+
+  my $delete_host = $self->api_call(
+      "PUT",
+      "/hosts/$ip",
+      {
+        'user'          => '<none>',
+        'access_point'  => '<none>',
+        'rate_plan'     => $default_rateplan_name,
+      },
+  );
 
   $self->{'__saisei_error'} = "Host not created"
     unless $delete_host; # should never happen

commit a538d9a92cb80be2f07c8a2fecc97f1b1fa12317
Author: Christopher Burger <burgerc at freeside.biz>
Date:   Fri Feb 16 13:22:05 2018 -0500

    RT# 78356 - cleaned up code and added debug code

diff --git a/FS/FS/part_export/saisei.pm b/FS/FS/part_export/saisei.pm
index 799220ef2..5e6279b68 100644
--- a/FS/FS/part_export/saisei.pm
+++ b/FS/FS/part_export/saisei.pm
@@ -1,15 +1,13 @@
 package FS::part_export::saisei;
 
 use strict;
-use base qw( FS::part_export );
 use vars qw( @ISA %info );
+use base qw( FS::part_export );
 use Date::Format 'time2str';
 use Cpanel::JSON::XS;
-use Net::HTTPS::Any qw(https_post);
 use MIME::Base64;
 use REST::Client;
 use Data::Dumper;
-
 use FS::Conf;
 
 #@ISA = qw( FS::part_export::http );
@@ -33,19 +31,12 @@ This module also provides generic methods for working through the L</Saisei API>
 =cut
 
 tie my %options, 'Tie::IxHash',
+  'port'             => { label => 'Port',
+                          default => 5000 },
   'username'         => { label => 'User Name',
                           default => '' },
   'password'         => { label => 'Password',
                           default => '' },
-  'host'             => { label => 'Host',
-                          default => 'STM IP ADDRESS' },
-  'port'             => { label => 'Port',
-                          default => 5000 },
-  'customer_name'    => { label => 'Customer Name',
-                          default => 'FREESIDE CUST $custnum' },
-  'account_id'       => { label => 'Account ID',
-                          default => 'SVC$svcnum' },
-  'product_id'       => { label => 'Account Product ID' },
   'debug'            => { type => 'checkbox',
                           label => 'Enable debug warnings' },
 ;
@@ -101,22 +92,28 @@ sub _export_insert {
   my $username = $email[0];
   my $description = $cust_main->{Hash}->{first}." ".$cust_main->{Hash}->{last};
 
-  # check for existing user.
-  my $existing_user;
-  $existing_user = $self->api_get_user($username) unless ( $self->{'__saisei_error'} || !$username);
+  if (!$username) {
+    $self->{'__saisei_error'} = 'no username - can not export';
+    warn "No email found $username\n" if $self->option('debug');
+    return;
+  }
+  else {
+    # check for existing user.
+    my $existing_user;
+    $existing_user = $self->api_get_user($username) unless $self->{'__saisei_error'};
  
-  # if no existing user create one.
-  $self->api_create_user($username, $description) unless $existing_user;
+    # if no existing user create one.
+    $self->api_create_user($username, $description) unless $existing_user;
 
-  # set user to existing one or newly created one.
-  my $user = $existing_user ? $existing_user : $self->api_get_user($username);
+    # set user to existing one or newly created one.
+    my $user = $existing_user ? $existing_user : $self->api_get_user($username);
 
-  ## add access point ?
+    ## 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'};
+    ## 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'};
+  }
 
-  #die('ending for testing');
   return '';
 
 }
@@ -187,15 +184,19 @@ sub api_call {
   my $auth_info = $self->option('username') . ':' . $self->option('password');
   $params ||= {};
 
-  print "Calling /$method\n" if $self->option('debug');
+  warn "Calling $method on http://"
+    .$self->{Hash}->{machine}.':'.$self->option('port')
+    ."/rest/stm/configurations/running/$path\n" if $self->option('debug');
 
   my $data = encode_json($params) if keys %{ $params };
 
   my $client = REST::Client->new();
   $client->addHeader("Authorization", "Basic ".encode_base64($auth_info));
-  $client->setHost('http://'.$self->option('host').':'.$self->option('port'));
+  $client->setHost('http://'.$self->{Hash}->{machine}.':'.$self->option('port'));
   $client->$method('/rest/stm/configurations/running/'.$path, $data, { "Content-type" => 'application/json'});
 
+  warn "Response Code is ".$client->responseCode()."\n" if $self->option('debug');
+
   my $result;
 
   if ($client->responseCode() eq '200' || $client->responseCode() eq '201') {
@@ -207,7 +208,7 @@ sub api_call {
   }
   else {
     $self->{'__saisei_error'} = "Bad response from server during $method: " . $client->responseContent();
-    print "My response content fo /$method\n". Dumper($client->responseContent) if $self->option('debug');
+    warn "Response Content is\n".$client->responseContent."\n" if $self->option('debug');
     return; 
   }
 
@@ -387,16 +388,16 @@ Creates a access point.
 sub api_create_accesspoint {
   my ($self,$accesspoint) = @_;
 
-  my $new_accesspoint = $self->api_call(
-      "PUT", 
-      "access_points/$accesspoint",
-      {
-        'description' => 'my description',
-      },
-  );
+  #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
+  #$self->{'__saisei_error'} = "Access point not created"
+  #  unless $new_accesspoint; # should never happen
   return;
 
 }

commit a3da777b3b4c5a3a01b28fa8be5c0ff1fe97a1bd
Author: Christopher Burger <burgerc at freeside.biz>
Date:   Thu Feb 15 11:47:39 2018 -0500

    RT# 78356 - broadband svc export to saisei

diff --git a/FS/FS/part_export/saisei.pm b/FS/FS/part_export/saisei.pm
new file mode 100644
index 000000000..799220ef2
--- /dev/null
+++ b/FS/FS/part_export/saisei.pm
@@ -0,0 +1,453 @@
+package FS::part_export::saisei;
+
+use strict;
+use base qw( FS::part_export );
+use vars qw( @ISA %info );
+use Date::Format 'time2str';
+use Cpanel::JSON::XS;
+use Net::HTTPS::Any qw(https_post);
+use MIME::Base64;
+use REST::Client;
+use Data::Dumper;
+
+use FS::Conf;
+
+#@ISA = qw( FS::part_export::http );
+
+=pod
+
+=head1 NAME
+
+FS::part_export::saisei
+
+=head1 SYNOPSIS
+
+Saisei integration for Freeside
+
+=head1 DESCRIPTION
+
+This export offers basic svc_broadband provisioning for Saisei.
+
+This module also provides generic methods for working through the L</Saisei API>.
+
+=cut
+
+tie my %options, 'Tie::IxHash',
+  'username'         => { label => 'User Name',
+                          default => '' },
+  'password'         => { label => 'Password',
+                          default => '' },
+  'host'             => { label => 'Host',
+                          default => 'STM IP ADDRESS' },
+  'port'             => { label => 'Port',
+                          default => 5000 },
+  'customer_name'    => { label => 'Customer Name',
+                          default => 'FREESIDE CUST $custnum' },
+  'account_id'       => { label => 'Account ID',
+                          default => 'SVC$svcnum' },
+  'product_id'       => { label => 'Account Product ID' },
+  'debug'            => { type => 'checkbox',
+                          label => 'Enable debug warnings' },
+;
+
+%info = (
+  'svc'             => 'svc_broadband',
+  'desc'            => 'Export broadband service/account to Saisei',
+  'options'         => \%options,
+  'notes'           => <<'END',
+This is customer integration with Saisei.
+END
+);
+
+#"/STM_IP:5000/rest/top/configurations/running/" is for http 5029 for https
+
+#Creating User Names
+#Users are tracked by their name which gives access to the internal slice data which in turn allows the viewing of  Applications and Geo-Locations.
+#Creating a user name requires a command of the following format: -
+#'put', 'users/USER_NAME', {'description':description}
+#When creating a user name it is usual to add a description and since a user attribute set does not normally contain the users plan name it is best to encode it into the description field.
+
+sub _export_insert {
+  my ($self, $svc_broadband) = @_;
+  my $rateplan_name = $svc_broadband->{Hash}->{description};
+   $rateplan_name =~ s/\s/_/g;
+
+
+  # load needed info from our end
+  my $cust_main = $svc_broadband->cust_main;
+  return "Could not load service customer" unless $cust_main;
+  my $conf = new FS::Conf;
+
+  # get policy list
+  my $policies = $self->api_get_policies();
+
+  # check for existing rate plan
+  my $existing_rateplan;
+  $existing_rateplan = $self->api_get_rateplan($rateplan_name) unless $self->{'__saisei_error'};
+
+  # if no existing rate plan create one and modify it.
+  $self->api_create_rateplan($svc_broadband, $rateplan_name) unless $existing_rateplan;
+  $self->api_modify_rateplan($policies->{collection}, $svc_broadband, $rateplan_name) unless ($self->{'__saisei_error'} || $existing_rateplan);
+
+  # 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};
+
+  # check for existing user.
+  my $existing_user;
+  $existing_user = $self->api_get_user($username) unless ( $self->{'__saisei_error'} || !$username);
+ 
+  # if no existing user create one.
+  $self->api_create_user($username, $description) unless $existing_user;
+
+  # set user to existing one or newly created one.
+  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'};
+
+  #die('ending for testing');
+  return '';
+
+}
+
+sub _export_replace {
+  my ($self, $svc_phone) = @_;
+  return '';
+}
+
+sub _export_delete {
+  my ($self, $svc_broadband) = @_;
+
+  my $cust_main = $svc_broadband->cust_main;
+  return "Could not load service customer" unless $cust_main;
+  my $conf = new FS::Conf;
+
+  my $rateplan_name = $svc_broadband->{Hash}->{description};
+  $rateplan_name =~ s/\s/_/g;
+
+  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]; 
+
+  ## tie host to user
+  $self->api_delete_host_to_user($username, $rateplan_name, $svc_broadband->{Hash}->{ip_addr}) unless $self->{'__saisei_error'};
+
+  return '';
+}
+
+sub _export_suspend {
+  my ($self, $svc_phone) = @_;
+  return '';
+}
+
+sub _export_unsuspend {
+  my ($self, $svc_phone) = @_;
+  return '';
+}
+
+=head1 Saisei API
+
+These methods allow access to the Saisei API using the credentials
+set in the export options.
+
+=cut
+
+=head2 api_call
+
+Accepts I<$service>, I<$method>, I<$params> hashref and optional
+I<$returnfield>.  Places an api call to the specified service
+and method with the specified params.  Returns the decoded json
+object returned by the api call.  If I<$returnfield> is specified,
+returns only that field of the decoded object, and errors out if
+that field does not exist.  Returns empty on failure;  retrieve
+error messages using L</api_error>.
+
+Must run L</api_login> first.
+
+=cut
+
+sub api_call {
+  my ($self,$method,$path,$params) = @_;
+  $self->{'__saisei_error'} = '';
+  my $auth_info = $self->option('username') . ':' . $self->option('password');
+  $params ||= {};
+
+  print "Calling /$method\n" if $self->option('debug');
+
+  my $data = encode_json($params) if keys %{ $params };
+
+  my $client = REST::Client->new();
+  $client->addHeader("Authorization", "Basic ".encode_base64($auth_info));
+  $client->setHost('http://'.$self->option('host').':'.$self->option('port'));
+  $client->$method('/rest/stm/configurations/running/'.$path, $data, { "Content-type" => 'application/json'});
+
+  my $result;
+
+  if ($client->responseCode() eq '200' || $client->responseCode() eq '201') {
+    eval { $result = decode_json($client->responseContent()) };
+    unless ($result) {
+      $self->{'__saisei_error'} = "Error decoding json: $@";
+      return;
+    }
+  }
+  else {
+    $self->{'__saisei_error'} = "Bad response from server during $method: " . $client->responseContent();
+    print "My response content fo /$method\n". Dumper($client->responseContent) if $self->option('debug');
+    return; 
+  }
+
+  return $result;
+  
+}
+
+=head2 api_error
+
+Returns the error string set by L</PortaOne API> methods,
+or a blank string if most recent call produced no errors.
+
+=cut
+
+sub api_error {
+  my $self = shift;
+  return $self->{'__saisei_error'} || '';
+}
+
+=head2 api_get_policies
+
+Gets a list of global policies.
+
+=cut
+
+sub api_get_policies {
+  my $self = shift;
+
+  my $get_policies = $self->api_call("GET", 'policies/?token=1&order=name&start=0&limit=20&select=name%2Cpercent_rate%2Cassured%2C');
+  return if $self->api_error;
+  $self->{'__saisei_error'} = "Did not receive any global policies"
+    unless $get_policies;
+
+  return $get_policies;
+}
+
+=head2 api_get_rateplan
+
+Gets rateplan info for specific rateplan.
+
+=cut
+
+sub api_get_rateplan {
+  my $self = shift;
+  my $rateplan = shift;
+
+  my $get_rateplan = $self->api_call("GET", "rate_plans/$rateplan");
+  return if $self->api_error;
+  $self->{'__saisei_error'} = "Did not receive any rateplan info"
+    unless $get_rateplan;
+
+  return $get_rateplan;
+}
+
+=head2 api_get_user
+
+Gets user info for specific user.
+
+=cut
+
+sub api_get_user {
+  my $self = shift;
+  my $user = shift;
+
+  my $get_user = $self->api_call("GET", "users/$user");
+  return if $self->api_error;
+  $self->{'__saisei_error'} = "Did not receive any user info"
+    unless $get_user;
+
+  return $get_user;
+}
+
+=head2 api_get_accesspoint
+
+Gets user info for specific access point.
+
+=cut
+
+sub api_get_accesspoint {
+  my $self = shift;
+  my $accesspoint;
+
+  my $get_accesspoint = $self->api_call("GET", "access_points/$accesspoint");
+  return if $self->api_error;
+  $self->{'__saisei_error'} = "Did not receive any user info"
+    unless $get_accesspoint;
+
+  return;
+}
+
+=head2 api_create_rateplan
+
+Creates a rateplan.
+
+=cut
+
+sub api_create_rateplan {
+  my ($self, $svc, $rateplan) = @_;
+
+  my $new_rateplan = $self->api_call(
+      "PUT", 
+      "rate_plans/$rateplan",
+      {
+        'downstream_rate' => $svc->{Hash}->{speed_down},
+        'upstream_rate' => $svc->{Hash}->{speed_up},
+      },
+  );
+
+  $self->{'__saisei_error'} = "Rate Plan not created"
+    unless $new_rateplan; # should never happen
+  return $new_rateplan;
+
+}
+
+=head2 api_modify_rateplan
+
+Modify a rateplan.
+
+=cut
+
+sub api_modify_rateplan {
+  my ($self,$policies,$svc,$rateplan_name) = @_;
+
+  foreach my $policy (@$policies) {
+    my $policyname = $policy->{name};
+    my $rate_multiplier = '';
+    if ($policy->{background}) { $rate_multiplier = ".01"; }
+    my $modified_rateplan = $self->api_call(
+      "PUT", 
+      "rate_plans/$rateplan_name/partitions/$policyname",
+      {
+        'restricted'      =>  $policy->{assured},         # policy_assured_flag
+        'rate_multiplier' => $rate_multiplier,           # policy_background 0.1
+        'rate'            =>  $policy->{percent_rate}, # policy_percent_rate
+      },
+    );
+
+    $self->{'__saisei_error'} = "Rate Plan not modified"
+      unless $modified_rateplan; # should never happen
+    
+  }
+
+  return;
+ 
+}
+
+=head2 api_create_user
+
+Creates a rateplan.
+
+=cut
+
+sub api_create_user {
+  my ($self,$user, $description) = @_;
+
+  my $new_user = $self->api_call(
+      "PUT", 
+      "users/$user",
+      {
+        'description' => $description,
+      },
+  );
+
+  $self->{'__saisei_error'} = "User not created"
+    unless $new_user; # should never happen
+
+  return $new_user;
+
+}
+
+=head2 api_create_accesspoint
+
+Creates a access point.
+
+=cut
+
+sub api_create_accesspoint {
+  my ($self,$accesspoint) = @_;
+
+  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
+  return;
+
+}
+
+=head2 api_add_host_to_user
+
+ties host to user and rateplan.
+
+=cut
+
+sub api_add_host_to_user {
+  my ($self,$user, $rateplan, $ip) = @_;
+
+  my $new_host = $self->api_call(
+      "PUT", 
+      "hosts/$ip",
+      {
+        'user'      => $user,
+        'rate_plan' => $rateplan,
+      },
+  );
+
+  $self->{'__saisei_error'} = "Host not created"
+    unless $new_host; # should never happen
+
+  return $new_host;
+
+}
+
+=head2 api_add_host_to_user
+
+ties host to user and rateplan.
+
+=cut
+
+sub api_delete_host_to_user {
+  my ($self,$user, $rateplan, $ip) = @_;
+
+  my $delete_host = $self->api_call("DELETE", "hosts/$ip");
+
+  $self->{'__saisei_error'} = "Host not created"
+    unless $delete_host; # should never happen
+
+  return $delete_host;
+
+}
+
+=head1 SEE ALSO
+
+L<FS::part_export>
+
+=cut
+
+1;
\ No newline at end of file

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

Summary of changes:
 FS/FS/part_export/saisei.pm | 481 ++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 481 insertions(+)
 create mode 100644 FS/FS/part_export/saisei.pm




More information about the freeside-commits mailing list