self-service Drupal module, RT#9380
[freeside.git] / FS / FS / ClientAPI / Signup.pm
index 32cdd9f..a4032f3 100644 (file)
@@ -1,7 +1,7 @@
 package FS::ClientAPI::Signup;
 
 use strict;
-use vars qw($DEBUG $me);
+use vars qw( $DEBUG $me );
 use Data::Dumper;
 use Tie::RefHash;
 use FS::Conf;
@@ -90,7 +90,7 @@ sub signup_info {
                             ],
 
       'agent' => [ map { my $agent = $_;
-                         map { $_ => $agent->get($_) } @agent_fields;
+                        +{ map { $_ => $agent->get($_) } @agent_fields }
                        }
                        qsearch('agent', { 'disabled' => '' } )
                  ],
@@ -107,8 +107,13 @@ sub signup_info {
 
       'security_phrase' => $conf->exists('security_phrase'),
 
+      'nomadix' => $conf->exists('signup_server-nomadix'),
+
       'payby' => [ $conf->config('signup_server-payby') ],
 
+      'payby_longname' => [ map { FS::payby->longname($_) } 
+                            $conf->config('signup_server-payby') ],
+
       'card_types' => card_types(),
 
       'paytypes' => [ @FS::cust_main::paytypes ],
@@ -290,7 +295,9 @@ sub signup_info {
         my $hide = 0;
         if ( FS::payby->realtime($payby) ) {
           my $payment_gateway =
-            $agent->payment_gateway( 'method' => FS::payby->payby2bop($payby) );
+            $agent->payment_gateway( 'method'  => FS::payby->payby2bop($payby),
+                                     'nofatal' => 1,
+                                   );
           if ( $payment_gateway
                  && $payment_gateway->gateway_namespace
                       eq 'Business::OnlineThirdPartyPayment'
@@ -334,6 +341,36 @@ sub signup_info {
         foreach qw( address1 city county state zip country );
     }
 
+    #some of the above could probably be cached, too
+
+    my $signup_info_cache_agent = $cache->get("signup_info_cache_agent$agentnum");
+
+    if ( $signup_info_cache_agent ) {
+
+      warn "$me loading cached signup info for agentnum $agentnum\n"
+        if $DEBUG > 1;
+
+    } else {
+
+      warn "$me populating signup info cache for agentnum $agentnum\n"
+        if $DEBUG > 1;
+
+      $signup_info_cache_agent = {
+        #( map { $_ => scalar( $conf->config($_, $agentnum) ) }
+        #  qw( company_name ) ),
+        ( map { $_ => scalar( $conf->config("selfservice-$_", $agentnum ) ) }
+          qw( body_bgcolor box_bgcolor) ),
+        ( map { $_ => join("\n", $conf->config("selfservice-$_", $agentnum ) ) }
+          qw( head body_header body_footer ) ),
+      };
+
+      $cache->set("signup_info_cache_agent$agentnum", $signup_info_cache_agent);
+
+    }
+
+    $signup_info->{$_} = $signup_info_cache_agent->{$_}
+      foreach keys %$signup_info_cache_agent;
+
   }
   # else {
   # delete $signup_info->{'part_pkg'};
@@ -469,14 +506,12 @@ sub new_customer {
     return { 'error' => "Unknown reseller" }
       unless $agent;
 
-    my $payment_gateway =
-      $agent->payment_gateway( 'method' => FS::payby->payby2bop($payby) );
+    my $gw = $agent->payment_gateway( 'method'  => FS::payby->payby2bop($payby),
+                                      'nofatal' => 1,
+                                    );
 
-    if ($payment_gateway->gateway_namespace eq
-        'Business::OnlineThirdPartyPayment'
-       ) {
-      $cust_main->payby('BILL');   # MCRD better?
-    }
+    $cust_main->payby('BILL')   # MCRD better?
+      if $gw && $gw->gateway_namespace eq 'Business::OnlineThirdPartyPayment';
   }
 
   $cust_main->payinfo($cust_main->daytime)
@@ -512,14 +547,14 @@ sub new_customer {
   #return { 'error' => $error } if $error;
 
   #should be all auto-magic and shit
-  my $svc;
+  my @svc = ();
   if ( $svc_x eq 'svc_acct' ) {
 
-    $svc = new FS::svc_acct ( {
+    my $svc = new FS::svc_acct {
       'svcpart'   => $svcpart,
       map { $_ => $packet->{$_} }
         qw( username _password sec_phrase popnum ),
-    } );
+    };
 
     my @acct_snarf;
     my $snarfnum = 1;
@@ -536,21 +571,48 @@ sub new_customer {
     }
     $svc->child_objects( \@acct_snarf );
 
+    push @svc, $svc;
+
   } elsif ( $svc_x eq 'svc_phone' ) {
 
-    $svc = new FS::svc_phone ( {
+    my $svc = new FS::svc_phone ( {
       'svcpart' => $svcpart,
        map { $_ => $packet->{$_} }
          qw( countrycode phonenum sip_password pin ),
     } );
 
+    push @svc, $svc;
+
   } else {
     die "unknown signup service $svc_x";
   }
-
-  my $y = $svc->setdefault; # arguably should be in new method
+  my $y = $svc[0]->setdefault; # arguably should be in new method
   return { 'error' => $y } if $y && !ref($y);
 
+  if ($packet->{'mac_addr'} && $conf->exists('signup_server-mac_addr_svcparts'))
+  {
+
+    my %mac_addr_svcparts = map { $_ => 1 }
+                            $conf->config('signup_server-mac_addr_svcparts');
+    my @pkg_svc = grep { $_->quantity && $mac_addr_svcparts{$_->svcpart} }
+                  $cust_pkg->part_pkg->pkg_svc;
+
+    return { 'error' => 'No service defined to assign mac address' }
+      unless @pkg_svc;
+
+    my $svc = new FS::svc_acct {
+      'svcpart'   => $pkg_svc[0]->svcpart, #multiple matches? alas..
+      'username'  => $packet->{'mac_addr'},
+      '_password' => '', #blank as requested (set passwordmin to 0)
+    };
+
+    my $y = $svc->setdefault; # arguably should be in new method
+    return { 'error' => $y } if $y && !ref($y);
+
+    push @svc, $svc;
+
+  }
+
   #$error = $svc->check;
   #return { 'error' => $error } if $error;
 
@@ -564,7 +626,7 @@ sub new_customer {
 
   use Tie::RefHash;
   tie my %hash, 'Tie::RefHash';
-  %hash = ( $cust_pkg => [ $svc ] );
+  %hash = ( $cust_pkg => \@svc );
   #msgcat
   $error = $cust_main->insert(
     \%hash,
@@ -590,14 +652,10 @@ sub new_customer {
     #     " new customer: $bill_error"
     #  if $bill_error;
 
-    if ($cust_main->_new_bop_required()) {
-      $bill_error = $cust_main->realtime_collect(
-         method        => FS::payby->payby2bop( $packet->{payby} ),
-         depend_jobnum => $placeholder->jobnum,
-      );
-    } else {
-      $bill_error = $cust_main->collect('realtime' => 1);
-    }
+    $bill_error = $cust_main->realtime_collect(
+       method        => FS::payby->payby2bop( $packet->{payby} ),
+       depend_jobnum => $placeholder->jobnum,
+    );
     #warn "[fs_signup_server] error collecting from new customer: $bill_error"
     #  if $bill_error;
 
@@ -648,9 +706,9 @@ sub new_customer {
                );
 
   if ( $svc_x eq 'svc_acct' ) {
-    $return{$_} = $svc->$_() for qw( username _password );
+    $return{$_} = $svc[0]->$_() for qw( username _password );
   } elsif ( $svc_x eq 'svc_phone' ) {
-    $return{$_} = $svc->$_() for qw( countrycode phonenum sip_password pin );
+    $return{$_} = $svc[0]->$_() for qw( countrycode phonenum sip_password pin );
   } else {
     die "unknown signup service $svc_x";
   }