self-service can select domain on provision (#2801)
authorjeff <jeff>
Wed, 12 Dec 2007 05:58:43 +0000 (05:58 +0000)
committerjeff <jeff>
Wed, 12 Dec 2007 05:58:43 +0000 (05:58 +0000)
FS/FS/ClientAPI/MyAccount.pm
FS/FS/ClientAPI/Signup.pm
FS/FS/Setup.pm
FS/FS/svc_acct.pm
fs_selfservice/FS-SelfService/SelfService.pm
fs_selfservice/FS-SelfService/cgi/selfservice.cgi
fs_selfservice/FS-SelfService/cgi/svc_acct.html
httemplate/edit/svc_acct.cgi

index 6e4545a..61078a9 100644 (file)
@@ -1033,10 +1033,17 @@ sub provision_acct {
     if $p->{'_password'} ne $p->{'_password2'};
   return { 'error' => gettext('empty_password') }
     unless length($p->{'_password'});
+  if ($p->{'domsvc'}) {
+    my %domains = domain_select_hash FS::svc_acct(map { $_ => $p->{$_} }
+                                                  qw ( svcpart pkgnum ) );
+    return { 'error' => gettext('invalid_domain') }
+      unless ($domains{$p->{'domsvc'}});
+  }
 
   _provision( 'FS::svc_acct',
-              [qw(username _password)],
-              [qw(username _password)],
+              [qw(username _password domsvc)],
+              [qw(username _password domsvc)],
               $p,
               @_
             );
index d33dd79..61325b9 100644 (file)
@@ -287,6 +287,32 @@ sub signup_info {
 
 }
 
+sub domain_select_hash {
+  my $packet = shift;
+
+  my $response = {};
+
+  if ($packet->{pkgpart}) {
+    my $part_pkg = qsearchs('part_pkg' => { 'pkgpart' => $packet->{pkgpart} } );
+    #$packet->{svcpart} = $part_pkg->svcpart('svc_acct')
+    $packet->{svcpart} = $part_pkg->svcpart
+      if $part_pkg;
+  }
+
+  if ($packet->{svcpart}) {
+    my $part_svc = qsearchs('part_svc' => { 'svcpart' => $packet->{svcpart} } );
+    $response->{'domsvc'} = $part_svc->part_svc_column('domsvc')->columnvalue
+      if ($part_svc && $part_svc->part_svc_column('domsvc')->columnflag  eq 'D');
+  }
+
+  $response->{'domains'}
+    = { domain_select_hash FS::svc_acct( map { $_ => $packet->{$_} }
+                                                 qw(svcpart pkgnum)
+                                       ) };
+
+  $response;
+}
+
 sub new_customer {
   my $packet = shift;
 
index d8099c6..d265d93 100644 (file)
@@ -504,6 +504,10 @@ sub msgcat_messages {
       'en_US' => 'Driver\'s License State',
     },
 
+    'invalid_domain' => {
+      'en_US' => 'Invalid domain',
+    },
+
   );
 }
 
index 1cddbee..259d093 100644 (file)
@@ -2549,5 +2549,61 @@ schema.html from the base documentation.
 
 =cut
 
+=item domain_select_hash %OPTIONS
+
+Returns a hash SVCNUM => DOMAIN ...  representing the domains this customer
+may at present purchase.
+
+Currently available options are: I<pkgnum> I<svcpart>
+
+=cut
+
+sub domain_select_hash {
+  my ($self, %options) = @_;
+  my %domains = ();
+  my $part_svc;
+  my $cust_pkg;
+
+  if (ref($self)) {
+    $part_svc = $self->part_svc;
+    $cust_pkg = $self->cust_svc->cust_pkg
+      if $self->cust_svc;
+  }
+
+  $part_svc = qsearchs('part_svc', { 'svcpart' => $options{svcpart} })
+    if $options{'svcpart'};
+
+  $cust_pkg = qsearchs('cust_pkg', { 'pkgnum' => $options{pkgnum} })
+    if $options{'pkgnum'};
+
+  if ($part_svc && ( $part_svc->part_svc_column('domsvc')->columnflag eq 'S'
+                  || $part_svc->part_svc_column('domsvc')->columnflag eq 'F')) {
+    %domains = map { $_->svcnum => $_->domain }
+               map { qsearchs('svc_domain', { 'svcnum' => $_ }) }
+               split(',', $part_svc->part_svc_column('domsvc')->columnvalue);
+  }elsif ($cust_pkg && !$conf->exists('svc_acct-alldomains') ) {
+    %domains = map { $_->svcnum => $_->domain }
+               map { qsearchs('svc_domain', { 'svcnum' => $_->svcnum }) }
+               map { qsearch('cust_svc', { 'pkgnum' => $_->pkgnum } ) }
+               qsearch('cust_pkg', { 'custnum' => $cust_pkg->custnum });
+  }else{
+    %domains = map { $_->svcnum => $_->domain } qsearch('svc_domain', {} );
+  }
+
+  if ($part_svc && $part_svc->part_svc_column('domsvc')->columnflag eq 'D') {
+    my $svc_domain = qsearchs('svc_domain',
+      { 'svcnum' => $part_svc->part_svc_column('domsvc')->columnvalue } );
+    if ( $svc_domain ) {
+      $domains{$svc_domain->svcnum}  = $svc_domain->domain;
+    }else{
+      warn "unknown svc_domain.svcnum for part_svc_column domsvc: ".
+           $part_svc->part_svc_column('domsvc')->columnvalue;
+
+    }
+  }
+
+  (%domains);
+}
+
 1;
 
index 9b3b71a..2999245 100644 (file)
@@ -51,13 +51,14 @@ $socket .= '.'.$tag if defined $tag && length($tag);
   'unprovision_svc'           => 'MyAccount/unprovision_svc',
   'myaccount_passwd'          => 'MyAccount/myaccount_passwd',
   'signup_info'               => 'Signup/signup_info',
+  'domain_select_hash'        => 'Signup/domain_select_hash',  # expose?
   'new_customer'              => 'Signup/new_customer',
   'agent_login'               => 'Agent/agent_login',
   'agent_logout'              => 'Agent/agent_logout',
   'agent_info'                => 'Agent/agent_info',
   'agent_list_customers'      => 'Agent/agent_list_customers',
 );
-@EXPORT_OK = ( keys(%autoload), qw( regionselector expselect popselector ) );
+@EXPORT_OK = ( keys(%autoload), qw( regionselector expselect popselector domainselector) );
 
 $ENV{'PATH'} ='/usr/bin:/usr/ucb:/bin';
 $ENV{'SHELL'} = '/bin/sh';
@@ -1243,6 +1244,66 @@ END
 
 }
 
+=item domainselector HASHREF | LIST
+
+Takes as input a hashref or list of key/value pairs with the following keys:
+
+=over 4
+
+=item pkgnum
+
+Package number
+
+=item domsvc
+
+Service number of the selected item.
+
+=back
+
+Returns an HTML fragment for domain selection.
+
+=cut
+
+sub domainselector {
+  my $param;
+  if ( ref($_[0]) ) {
+    $param = shift;
+  } else {
+    $param = { @_ };
+  }
+  my $domsvc= $param->{'domsvc'};
+  my $rv = 
+      domain_select_hash(map {$_ => $param->{$_}} qw(pkgnum svcpart pkgpart) );
+  my $domains = $rv->{'domains'};
+  $domsvc = $rv->{'domsvc'} unless $domsvc;
+
+  return '<INPUT TYPE="hidden" NAME="domsvc" VALUE="">'
+    unless scalar(keys %$domains);
+    
+  if (scalar(keys %$domains) == 1) {
+    my $key;
+    foreach(keys %$domains) {
+      $key = $_;
+    }
+    return '<TR><TD ALIGN="right">Domain</TD><TD>'. $domains->{$key}.
+           '<INPUT TYPE="hidden" NAME="domsvc" VALUE="'. $key. '"></TD></TR>'
+  }
+
+  my $text .= qq!<TR><TD ALIGN="right">Domain</TD><TD><SELECT NAME="domsvc" SIZE=1 STYLE="width: 20em"><OPTION>(Choose Domain)!;
+
+
+  foreach my $domain ( sort { $domains->{$a} cmp $domains->{$b} } keys %$domains ) {
+    $text .= qq!<OPTION VALUE="!. $domain. '"'.
+             ( ( $domsvc && $domain == $domsvc ) ? ' SELECTED' : '' ). ">".
+             $domains->{$domain};
+  }
+
+  $text .= qq!</SELECT></TD></TR>!;
+
+  $text;
+
+}
+
 =back
 
 =head1 RESELLER FUNCTIONS
index 9cf8c4b..b5a6720 100644 (file)
@@ -14,7 +14,7 @@ use FS::SelfService qw( login customer_info invoice
                         process_prepay
                         list_pkgs order_pkg signup_info order_recharge
                         part_svc_info provision_acct provision_external
-                        unprovision_svc change_pkg
+                        unprovision_svc change_pkg domainselector
                         list_svcs list_svc_usage list_support_usage
                         myaccount_passwd
                       );
@@ -439,7 +439,7 @@ sub process_svc_acct {
   my $result = provision_acct (
     'session_id' => $session_id,
     map { $_ => $cgi->param($_) } qw(
-      pkgnum svcpart username _password _password2 sec_phrase popnum )
+      pkgnum svcpart username domsvc _password _password2 sec_phrase popnum )
   );
 
   if ( exists $result->{'error'} && $result->{'error'} ) { 
@@ -563,7 +563,7 @@ package FS::SelfService::_selfservicecgi;
 
 #use FS::SelfService qw(regionselector expselect popselector);
 use HTML::Entities;
-use FS::SelfService qw(popselector);
+use FS::SelfService qw(popselector domainselector);
 
 #false laziness w/agent.cgi
 sub include {
index abed878..0024438 100644 (file)
@@ -15,6 +15,9 @@
   <TD ALIGN="right">Username</TD>
   <TD><INPUT TYPE="text" NAME="username" VALUE="<%= $username %>"></TD>
 </TR>
+<%=
+   $OUT .= domainselector(pkgnum=>$pkgnum, svcpart=>$svcpart);
+%>
 <TR>
   <TD ALIGN="right">Password</TD>
   <TD><INPUT TYPE="password" NAME="_password" VALUE="<%= $_password %>"></TD>
index f9c4074..ed47609 100755 (executable)
@@ -212,38 +212,11 @@ Service # <% $svcnum ? "<B>$svcnum</B>" : " (NEW)" %><BR>
 %    }
 %  }
 %
-%  if ( $part_svc->part_svc_column('domsvc')->columnflag eq 'D' ) {
-%    my $svc_domain = qsearchs('svc_domain', {
-%      'svcnum' => $part_svc->part_svc_column('domsvc')->columnvalue,
-%    } );
-%    if ( $svc_domain ) {
-%      $svc_domain{$svc_domain->svcnum} = $svc_domain;
-%    } else {
-%      warn "unknown svc_domain.svcnum for part_svc_column domsvc: ".
-%           $part_svc->part_svc_column('domsvc')->columnvalue;
-%    }
-%  }
-%
-%  if ( $part_svc->part_svc_column('domsvc')->columnflag eq 'S' ) {
-%    foreach my $domain
-%              (split(',',$part_svc->part_svc_column('domsvc')->columnvalue)) {
-%      my $svc_domain =
-%        qsearchs('svc_domain', { 'svcnum' => $domain } );
-%     $svc_domain{$svc_domain->svcnum} = $svc_domain if $svc_domain;
-%    }
-%  }elsif ($cust_pkg && !$conf->exists('svc_acct-alldomains') ) {
-%    my @cust_svc =
-%      map { qsearch('cust_svc', { 'pkgnum' => $_->pkgnum } ) }
-%          qsearch('cust_pkg', { 'custnum' => $cust_pkg->custnum } );
-%    foreach my $cust_svc ( @cust_svc ) {
-%      my $svc_domain =
-%        qsearchs('svc_domain', { 'svcnum' => $cust_svc->svcnum } );
-%     $svc_domain{$svc_domain->svcnum} = $svc_domain if $svc_domain;
-%    }
-%  } else {
-%    %svc_domain = map { $_->svcnum => $_ } qsearch('svc_domain', {} );
-%  }
-%
+%  %svc_domain = (%svc_domain,
+%                 domain_select_hash FS::svc_acct('svcpart' => $svcpart,
+%                                                 'pkgnum'  => $pkgnum,
+%                                                )
+%                );
 %
 
 
@@ -252,14 +225,14 @@ Service # <% $svcnum ? "<B>$svcnum</B>" : " (NEW)" %><BR>
     <TD>
       <SELECT NAME="domsvc" SIZE=1>
 % foreach my $svcnum (
-%             sort { $svc_domain{$a}->domain cmp $svc_domain{$b}->domain }
+%             sort { $svc_domain{$a} cmp $svc_domain{$b} }
 %                  keys %svc_domain
 %           ) {
 %             my $svc_domain = $svc_domain{$svcnum};
 %        
 
 
-             <OPTION VALUE="<% $svc_domain->svcnum %>" <% $svc_domain->svcnum == $domsvc ? ' SELECTED' : '' %>><% $svc_domain->domain %>
+             <OPTION VALUE="<% $svcnum %>" <% $svcnum == $domsvc ? ' SELECTED' : '' %>><% $svc_domain{$svcnum} %>
 % } 
 
       </SELECT>