add vacation msg retrieval and addition/deletion to self-service API, RT#20896
authorIvan Kohler <ivan@freeside.biz>
Fri, 25 Jan 2013 10:05:47 +0000 (02:05 -0800)
committerIvan Kohler <ivan@freeside.biz>
Fri, 25 Jan 2013 10:05:47 +0000 (02:05 -0800)
FS/FS/ClientAPI/MyAccount.pm
FS/FS/ClientAPI_XMLRPC.pm
FS/FS/part_export/http_status.pm
FS/FS/svc_Common.pm
fs_selfservice/FS-SelfService/SelfService.pm

index 6ce6586..789e370 100644 (file)
@@ -45,7 +45,7 @@ use FS::payby;
 use FS::acct_rt_transaction;
 use FS::msg_template;
 
-$DEBUG = 0;
+$DEBUG = 1;
 $me = '[FS::ClientAPI::MyAccount]';
 
 use vars qw( @cust_main_editable_fields @location_editable_fields );
@@ -1787,27 +1787,14 @@ sub svc_status_hash {
 
 }
 
-sub set_svc_status_hash {
-  my $p = shift;
+sub set_svc_status_hash    { _svc_method_X(shift, 'export_setstatus') }
+sub set_svc_status_listadd { _svc_method_X(shift, 'export_setstatus_listadd') }
+sub set_svc_status_listdel { _svc_method_X(shift, 'export_setstatus_listdel') }
+sub set_svc_status_vacationadd { _svc_method_X(shift, 'export_setstatus_vacationadd') }
+sub set_svc_status_vacationdel { _svc_method_X(shift, 'export_setstatus_vacationdel') }
 
-  my($context, $session, $custnum) = _custoragent_session_custnum($p);
-  return { 'error' => $session } if $context eq 'error';
-
-  #XXX only svc_acct for now
-  my $svc_x = _customer_svc_x( $custnum, $p->{'svcnum'}, 'svc_acct')
-    or return { 'error' => "Service not found" };
-
-  warn "set_svc_status_hash ". join(' / ', map "$_=>".$p->{$_}, keys %$p )
-    if $DEBUG;
-  my $error = $svc_x->export_setstatus($p); #$p? returns error?
-  return { 'error' => $error } if $error;
-
-  return {}; #? { 'error' => '' }
-
-}
-
-sub set_svc_status_listadd {
-  my $p = shift;
+sub _svc_method_X {
+  my( $p, $method ) = @_;
 
   my($context, $session, $custnum) = _custoragent_session_custnum($p);
   return { 'error' => $session } if $context eq 'error';
@@ -1816,35 +1803,15 @@ sub set_svc_status_listadd {
   my $svc_x = _customer_svc_x( $custnum, $p->{'svcnum'}, 'svc_acct')
     or return { 'error' => "Service not found" };
 
-  warn "set_svc_status_listadd ". join(' / ', map "$_=>".$p->{$_}, keys %$p )
+  warn "$method ". join(' / ', map "$_=>".$p->{$_}, keys %$p )
     if $DEBUG;
-  my $error = $svc_x->export_setstatus_listadd($p); #$p? returns error?
+  my $error = $svc_x->$method($p); #$p? returns error?
   return { 'error' => $error } if $error;
 
   return {}; #? { 'error' => '' }
 
 }
 
-sub set_svc_status_listdel {
-  my $p = shift;
-
-  my($context, $session, $custnum) = _custoragent_session_custnum($p);
-  return { 'error' => $session } if $context eq 'error';
-
-  #XXX only svc_acct for now
-  my $svc_x = _customer_svc_x( $custnum, $p->{'svcnum'}, 'svc_acct')
-    or return { 'error' => "Service not found" };
-
-  warn "set_svc_status_listdel ". join(' / ', map "$_=>".$p->{$_}, keys %$p )
-    if $DEBUG;
-  my $error = $svc_x->export_setstatus_listdel($p); #$p? returns error?
-  return { 'error' => $error } if $error;
-
-  return {}; #? { 'error' => '' }
-
-}
-
-
 sub acct_forward_info {
   my $p = shift;
 
index 086a7b0..d720db2 100644 (file)
@@ -131,6 +131,8 @@ sub ss2clientapi {
   'set_svc_status_hash'       => 'MyAccount/set_svc_status_hash',
   'set_svc_status_listadd'    => 'MyAccount/set_svc_status_listadd',
   'set_svc_status_listdel'    => 'MyAccount/set_svc_status_listdel',
+  'set_svc_status_vacationadd'=> 'MyAccount/set_svc_status_vacationadd',
+  'set_svc_status_vacationdel'=> 'MyAccount/set_svc_status_vacationdel',
   'acct_forward_info'         => 'MyAccount/acct_forward_info',
   'process_acct_forward'      => 'MyAccount/process_acct_forward',
   'list_dsl_devices'          => 'MyAccount/list_dsl_devices',   
index da32ec4..80139e7 100644 (file)
@@ -4,6 +4,7 @@ use base qw( FS::part_export );
 use strict;
 use warnings;
 use vars qw( %info $DEBUG );
+use URI::Escape;
 use LWP::UserAgent;
 use HTTP::Request::Common;
 use Email::Valid;
@@ -14,6 +15,9 @@ tie my %options, 'Tie::IxHash',
   'blacklist_del_url' => { label => 'Optional blacklist delete URL', },
   'whitelist_add_url' => { label => 'Optional whitelist add URL', },
   'whitelist_del_url' => { label => 'Optional whitelist delete URL', },
+  'vacation_add_url'  => { label => 'Optional vacation message add URL', },
+  'vacation_del_url'  => { label => 'Optional vacation message delete URL', },
+
   #'user'     => { label => 'Username', default=>'' },
   #'password' => { label => 'Password', default => '' },
 ;
@@ -26,11 +30,12 @@ tie my %options, 'Tie::IxHash',
   'notes'   => <<'END'
 Fields from the service can be substituted in the URL as $field.
 
-Optionally, spam black/whitelist addresses may be via HTTP or HTTPS as well.
+Optionally, spam black/whitelist addresees and a vacation message may be
+modified via HTTP or HTTPS as well.
 END
 );
 
-$DEBUG = 0;
+$DEBUG = 1;
 
 sub rebless { shift; }
 
@@ -39,6 +44,12 @@ our %addl_fields = (
   'svc_dsl'  => [qw( gateway_access_or_phonenum ) ],
 );
 
+#some NOPs for required subroutines, to avoid throwing the exceptions in the
+# part_export.pm fallbacks
+sub _export_insert  { '' };
+sub _export_replace { '' };
+sub _export_delete  { '' };
+
 sub export_getstatus {
   my( $self, $svc_x, $htmlref, $hashref ) = @_;
 
@@ -84,11 +95,23 @@ sub export_getstatus {
       my @fields = $csv->fields;
       my %hash = map { $_ => shift(@fields) } @header;
 
-      if ( $hash{'wb_value'} =~ /^[WA]/i ) { #Whitelist/Allow
-        push @{ $hashref->{'whitelist'} }, $hash{'from'};
-      } else { # if ( $hash{'wb_value'} =~ /^[BD]/i ) { #Blacklist/Deny
-        push @{ $hashref->{'blacklist'} }, $hash{'from'};
+      if ( defined $hash{'wb_value'} ) {
+        if ( $hash{'wb_value'} =~ /^[WA]/i ) { #Whitelist/Allow
+          push @{ $hashref->{'whitelist'} }, $hash{'from'};
+        } else { # if ( $hash{'wb_value'} =~ /^[BD]/i ) { #Blacklist/Deny
+          push @{ $hashref->{'blacklist'} }, $hash{'from'};
+        }
       }
+
+      for (qw( created enddate )) {
+        $hash{$_} = '' if $hash{$_} =~ /^0000-/;
+        $hash{$_} = (split(' ', $hash{$_}))[0];
+      }
+
+      next unless $hash{'active'};
+      $hashref->{"vacation_$_"} = $hash{$_} || ''
+        foreach qw( active subject body created enddate );
+
     }
 
   } #else { die 'guru meditation #295'; }
@@ -138,6 +161,52 @@ sub export_setstatus_listX {
 
 }
 
+sub export_setstatus_vacationadd {
+  my( $self, $svc_x, $hr ) = @_;
+  $self->export_setstatus_vacationX( $svc_x, 'add', $hr );
+}
+
+sub export_setstatus_vacationdel {
+  my( $self, $svc_x, $hr ) = @_;
+  $self->export_setstatus_vacationX( $svc_x, 'del', $hr );
+}
+
+sub export_setstatus_vacationX {
+  my( $self, $svc_x, $action, $hr ) = @_;
+
+  my $option = 'vacation_'. $action. '_url';
+
+  my $subject = uri_escape($hr->{subject});
+  my $body    = uri_escape($hr->{body});
+  for (qw( created enddate )) {
+    if ( $hr->{$_} =~ /^(\d{4}-\d{2}-\d{2})$/ ) {
+      $hr->{$_} = $1;
+    } else {
+      $hr->{$_} = '';
+    }
+  }
+  my $created = $hr->{created};
+  my $enddate = $hr->{enddate};
+
+  #some false laziness w/export_getstatus above
+  my $url;
+  my $urlopt = $self->option($option) or return; #DIFF
+  no strict 'vars';
+  {
+    no strict 'refs';
+    ${$_} = $svc_x->getfield($_) foreach $svc_x->fields;
+    ${$_} = $svc_x->$_()         foreach @{ $addl_fields{ $svc_x->table } };
+    $url = eval(qq("$urlopt"));
+  }
+
+  my $req = HTTP::Request::Common::GET( $url );
+  my $ua = LWP::UserAgent->new;
+  my $response = $ua->request($req);
+
+  die $response->code. ' '. $response->message if $response->is_error;
+
+}
+
 1;
 
 1;
index 4efdc23..ef37351 100644 (file)
@@ -1082,31 +1082,17 @@ otherwise returns false.
 
 =cut
 
-sub export_setstatus {
-  my( $self, @args ) = @_;
-  my $error = $self->export('setstatus', @args);
+sub export_setstatus { shift->_export_setstatus_X('setstatus', @_) }
+sub export_setstatus_listadd { shift->_export_setstatus_X('setstatus_listadd', @_) }
+sub export_setstatus_listdel { shift->_export_setstatus_X('setstatus_listdel', @_) }
+sub export_setstatus_vacationadd { shift->_export_setstatus_X('setstatus_vacationadd', @_) }
+sub export_setstatus_vacationdel { shift->_export_setstatus_X('setstatus_vacationdel', @_) }
+
+sub _export_setstatus_X {
+  my( $self, $method, @args ) = @_;
+  my $error = $self->export($method, @args);
   if ( $error ) {
-    warn "error running export_setstatus: $error";
-    return $error;
-  }
-  '';
-}
-
-sub export_setstatus_listadd {
-  my( $self, @args ) = @_;
-  my $error = $self->export('setstatus_listadd', @args);
-  if ( $error ) {
-    warn "error running export_setstatus: $error";
-    return $error;
-  }
-  '';
-}
-
-sub export_setstatus_listdel {
-  my( $self, @args ) = @_;
-  my $error = $self->export('setstatus_listdel', @args);
-  if ( $error ) {
-    warn "error running export_setstatus: $error";
+    warn "error running export_$method: $error";
     return $error;
   }
   '';
index 5437abd..651a8f5 100644 (file)
@@ -59,6 +59,8 @@ $socket .= '.'.$tag if defined $tag && length($tag);
   'set_svc_status_hash'       => 'MyAccount/set_svc_status_hash',
   'set_svc_status_listadd'    => 'MyAccount/set_svc_status_listadd',
   'set_svc_status_listdel'    => 'MyAccount/set_svc_status_listdel',
+  'set_svc_status_vacationadd'=> 'MyAccount/set_svc_status_vacationadd',
+  'set_svc_status_vacationdel'=> 'MyAccount/set_svc_status_vacationdel',
   'acct_forward_info'         => 'MyAccount/acct_forward_info',
   'process_acct_forward'      => 'MyAccount/process_acct_forward',
   'list_dsl_devices'          => 'MyAccount/list_dsl_devices',