add artera turbo handling to self-service and reseller interfaces
[freeside.git] / FS / FS / ClientAPI / MyAccount.pm
index 639cb7b..fe2e1c2 100644 (file)
@@ -21,22 +21,23 @@ use FS::cust_pkg;
 
 use FS::ClientAPI; #hmm
 FS::ClientAPI->register_handlers(
-  'MyAccount/login'            => \&login,
-  'MyAccount/logout'           => \&logout,
-  'MyAccount/customer_info'    => \&customer_info,
-  'MyAccount/edit_info'        => \&edit_info,
-  'MyAccount/invoice'          => \&invoice,
-  'MyAccount/list_invoices'    => \&list_invoices,
-  'MyAccount/cancel'           => \&cancel,
-  'MyAccount/payment_info'     => \&payment_info,
-  'MyAccount/process_payment'  => \&process_payment,
-  'MyAccount/list_pkgs'        => \&list_pkgs,
-  'MyAccount/order_pkg'        => \&order_pkg,
-  'MyAccount/cancel_pkg'       => \&cancel_pkg,
-  'MyAccount/charge'           => \&charge,
-  'MyAccount/part_svc_info'    => \&part_svc_info,
-  'MyAccount/provision_acct'   => \&provision_acct,
-  'MyAccount/unprovision_svc'  => \&unprovision_svc,
+  'MyAccount/login'              => \&login,
+  'MyAccount/logout'             => \&logout,
+  'MyAccount/customer_info'      => \&customer_info,
+  'MyAccount/edit_info'          => \&edit_info,
+  'MyAccount/invoice'            => \&invoice,
+  'MyAccount/list_invoices'      => \&list_invoices,
+  'MyAccount/cancel'             => \&cancel,
+  'MyAccount/payment_info'       => \&payment_info,
+  'MyAccount/process_payment'    => \&process_payment,
+  'MyAccount/list_pkgs'          => \&list_pkgs,
+  'MyAccount/order_pkg'          => \&order_pkg,
+  'MyAccount/cancel_pkg'         => \&cancel_pkg,
+  'MyAccount/charge'             => \&charge,
+  'MyAccount/part_svc_info'      => \&part_svc_info,
+  'MyAccount/provision_acct'     => \&provision_acct,
+  'MyAccount/provision_external' => \&provision_external,
+  'MyAccount/unprovision_svc'    => \&unprovision_svc,
 );
 
 use vars qw( @cust_main_editable_fields );
@@ -48,6 +49,8 @@ use vars qw( @cust_main_editable_fields );
   payby payinfo payname
 );
 
+use subs qw(_provision);
+
 #store in db?
 my $cache = new Cache::SharedMemoryCache( {
    'namespace' => 'FS::ClientAPI::MyAccount',
@@ -109,23 +112,8 @@ sub logout {
 sub customer_info {
   my $p = shift;
 
-  my($session, $custnum, $context);
-  if ( $p->{'session_id'} ) {
-    $context = 'customer';
-    $session = $cache->get($p->{'session_id'})
-      or return { 'error' => "Can't resume session" }; #better error message
-    $custnum = $session->{'custnum'};
-  } elsif ( $p->{'agent_session_id'} ) {
-    $context = 'agent';
-    my $agent_cache = new Cache::SharedMemoryCache( {
-      'namespace' => 'FS::ClientAPI::Agent',
-    } );
-    $session = $agent_cache->get($p->{'agent_session_id'})
-      or return { 'error' => "Can't resume session" }; #better error message
-    $custnum = $p->{'custnum'};
-  } else {
-    return { 'error' => "Can't resume session" }; #better error message
-  }
+  my($context, $session, $custnum) = _custoragent_session_custnum($p);
+  return { 'error' => $session } if $context eq 'error';
 
   my %return;
   if ( $custnum ) { #customer record
@@ -451,31 +439,42 @@ sub cancel {
 
 sub list_pkgs {
   my $p = shift;
-  my $session = $cache->get($p->{'session_id'})
-    or return { 'error' => "Can't resume session" }; #better error message
 
-  my $custnum = $session->{'custnum'};
+  my($context, $session, $custnum) = _custoragent_session_custnum($p);
+  return { 'error' => $session } if $context eq 'error';
 
-  my $cust_main = qsearchs('cust_main', { 'custnum' => $custnum } )
+  my $search = { 'custnum' => $custnum };
+  $search->{'agentnum'} = $session->{'agentnum'} if $context eq 'agent';
+  my $cust_main = qsearchs('cust_main', $search )
     or return { 'error' => "unknown custnum $custnum" };
 
   #return { 'cust_pkg' => [ map { $_->hashref } $cust_main->ncancelled_pkgs ] };
 
+  my $conf = new FS::Conf;
+
   { 'svcnum'   => $session->{'svcnum'},
+    'custnum'  => $custnum,
     'cust_pkg' => [ map {
                           { $_->hash,
                             $_->part_pkg->hash,
                             part_svc =>
                               [ map $_->hashref, $_->available_part_svc ],
                             cust_svc => 
-                              [ map { { $_->hash,
-                                        label => [ $_->label ],
-                                      }
+                              [ map { my $ref = { $_->hash,
+                                                  label => [ $_->label ],
+                                                };
+                                      $ref->{_password} = $_->svc_x->_password
+                                        if $context eq 'agent'
+                                        && $conf->exists('agent-showpasswords')
+                                        && $_->part_svc->svcdb eq 'svc_acct';
+                                      $ref;
                                     } $_->cust_svc
                               ],
                           };
                         } $cust_main->ncancelled_pkgs
                   ],
+    'small_custview' =>
+      small_custview( $cust_main, $conf->config('defaultcountry') ),
   };
 
 }
@@ -483,28 +482,11 @@ sub list_pkgs {
 sub order_pkg {
   my $p = shift;
 
-  my($session, $custnum, $context);
-
-  if ( $p->{'session_id'} ) {
-    $context = 'customer';
-    $session = $cache->get($p->{'session_id'})
-      or return { 'error' => "Can't resume session" }; #better error message
-    $custnum = $session->{'custnum'};
-  } elsif ( $p->{'agent_session_id'} ) {
-    $context = 'agent';
-    my $agent_cache = new Cache::SharedMemoryCache( {
-      'namespace' => 'FS::ClientAPI::Agent',
-    } );
-    $session = $agent_cache->get($p->{'agent_session_id'})
-      or return { 'error' => "Can't resume session" }; #better error message
-    $custnum = $p->{'custnum'};
-  } else {
-    return { 'error' => "Can't resume session" }; #better error message
-  }
+  my($context, $session, $custnum) = _custoragent_session_custnum($p);
+  return { 'error' => $session } if $context eq 'error';
 
   my $search = { 'custnum' => $custnum };
   $search->{'agentnum'} = $session->{'agentnum'} if $context eq 'agent';
-
   my $cust_main = qsearchs('cust_main', $search )
     or return { 'error' => "unknown custnum $custnum" };
 
@@ -632,12 +614,39 @@ sub cancel_pkg {
 sub provision_acct {
   my $p = shift;
 
-  my $session = $cache->get($p->{'session_id'})
-    or return { 'error' => "Can't resume session" }; #better error message
+  return { 'error' => gettext('passwords_dont_match') }
+    if $p->{'_password'} ne $p->{'_password2'};
+  return { 'error' => gettext('empty_password') }
+    unless length($p->{'_password'});
 
-  my $custnum = $session->{'custnum'};
+  _provision( 'FS::svc_acct',
+              [qw(username _password)],
+              [qw(username _password)],
+              $p,
+              @_
+            );
+}
 
-  my $cust_main = qsearchs('cust_main', { 'custnum' => $custnum } )
+sub provision_external {
+  my $p = shift;
+  #_provision( 'FS::svc_external', [qw(id title)], [qw(id title)], $p, @_ );
+  _provision( 'FS::svc_external',
+              [],
+              [qw(id title)],
+              $p,
+              @_
+            );
+}
+
+sub _provision {
+  my( $class, $fields, $return_fields, $p ) = splice(@_, 0, 4);
+
+  my($context, $session, $custnum) = _custoragent_session_custnum($p);
+  return { 'error' => $session } if $context eq 'error';
+
+  my $search = { 'custnum' => $custnum };
+  $search->{'agentnum'} = $session->{'agentnum'} if $context eq 'agent';
+  my $cust_main = qsearchs('cust_main', $search )
     or return { 'error' => "unknown custnum $custnum" };
 
   my $pkgnum = $p->{'pkgnum'};
@@ -650,20 +659,18 @@ sub provision_acct {
   my $part_svc = qsearchs('part_svc', { 'svcpart' => $p->{'svcpart'} } )
     or return { 'error' => "unknown svcpart $p->{'svcpart'}" };
 
-  return { 'error' => gettext('passwords_dont_match') }
-    if $p->{'_password'} ne $p->{'_password2'};
-  return { 'error' => gettext('empty_password') }
-    unless length($p->{'_password'});
-
-  my $svc_acct = new FS::svc_acct( {
-    'pkgnum'    => $p->{'pkgnum'},
-    'svcpart'   => $p->{'svcpart'},
-    'username'  => $p->{'username'},
-    '_password' => $p->{'_password'},
+  my $svc_x = $class->new( {
+    'pkgnum'  => $p->{'pkgnum'},
+    'svcpart' => $p->{'svcpart'},
+    map { $_ => $p->{$_} } @$fields
   } );
+  my $error = $svc_x->insert;
+  $svc_x = qsearchs($svc_x->table, { 'svcnum' => $svc_x->svcnum })
+    unless $error;
 
   return { 'svc'   => $part_svc->svc,
-           'error' => $svc_acct->insert
+           'error' => $error,
+           map { $_ => $svc_x->get($_) } @$return_fields
          };
 
 }
@@ -671,12 +678,12 @@ sub provision_acct {
 sub part_svc_info {
   my $p = shift;
 
-  my $session = $cache->get($p->{'session_id'})
-    or return { 'error' => "Can't resume session" }; #better error message
-
-  my $custnum = $session->{'custnum'};
+  my($context, $session, $custnum) = _custoragent_session_custnum($p);
+  return { 'error' => $session } if $context eq 'error';
 
-  my $cust_main = qsearchs('cust_main', { 'custnum' => $custnum } )
+  my $search = { 'custnum' => $custnum };
+  $search->{'agentnum'} = $session->{'agentnum'} if $context eq 'agent';
+  my $cust_main = qsearchs('cust_main', $search )
     or return { 'error' => "unknown custnum $custnum" };
 
   my $pkgnum = $p->{'pkgnum'};
@@ -693,11 +700,14 @@ sub part_svc_info {
     or return { 'error' => "unknown svcpart $svcpart for pkgnum $pkgnum" };
   my $part_svc = $pkg_svc->part_svc;
 
+  my $conf = new FS::Conf;
+
   return {
     'svc'     => $part_svc->svc,
     'svcdb'   => $part_svc->svcdb,
     'pkgnum'  => $pkgnum,
     'svcpart' => $svcpart,
+    'custnum' => $custnum,
 
     'security_phrase' => 0, #XXX !
     'svc_acct_pop'    => [], #XXX !
@@ -705,6 +715,10 @@ sub part_svc_info {
     'init_popstate'   => '',
     'popac'           => '',
     'acstate'         => '',
+
+    'small_custview' =>
+      small_custview( $cust_main, $conf->config('defaultcountry') ),
+
   };
 
 }
@@ -712,12 +726,12 @@ sub part_svc_info {
 sub unprovision_svc {
   my $p = shift;
 
-  my $session = $cache->get($p->{'session_id'})
-    or return { 'error' => "Can't resume session" }; #better error message
+  my($context, $session, $custnum) = _custoragent_session_custnum($p);
+  return { 'error' => $session } if $context eq 'error';
 
-  my $custnum = $session->{'custnum'};
-
-  my $cust_main = qsearchs('cust_main', { 'custnum' => $custnum } )
+  my $search = { 'custnum' => $custnum };
+  $search->{'agentnum'} = $session->{'agentnum'} if $context eq 'agent';
+  my $cust_main = qsearchs('cust_main', $search )
     or return { 'error' => "unknown custnum $custnum" };
 
   my $svcnum = $p->{'svcnum'};
@@ -728,11 +742,47 @@ sub unprovision_svc {
   return { 'error' => "Service $svcnum does not belong to customer $custnum" }
     unless $cust_svc->cust_pkg->custnum == $custnum;
 
+  my $conf = new FS::Conf;
+
   return { 'svc'   => $cust_svc->part_svc->svc,
-           'error' => $cust_svc->cancel
+           'error' => $cust_svc->cancel,
+           'small_custview' =>
+             small_custview( $cust_main, $conf->config('defaultcountry') ),
          };
 
 }
 
+#--
+
+sub _custoragent_session_custnum {
+  my $p = shift;
+
+  my($context, $session, $custnum);
+  if ( $p->{'session_id'} ) {
+
+    $context = 'customer';
+    $session = $cache->get($p->{'session_id'})
+      or return { 'error' => "Can't resume session" }; #better error message
+    $custnum = $session->{'custnum'};
+
+  } elsif ( $p->{'agent_session_id'} ) {
+
+    $context = 'agent';
+    my $agent_cache = new Cache::SharedMemoryCache( {
+      'namespace' => 'FS::ClientAPI::Agent',
+    } );
+    $session = $agent_cache->get($p->{'agent_session_id'})
+      or return { 'error' => "Can't resume session" }; #better error message
+    $custnum = $p->{'custnum'};
+
+  } else {
+    return { 'error' => "Can't resume session" }; #better error message
+  }
+
+  ($context, $session, $custnum);
+
+}
+
+
 1;